From 358f8693dd4d52142df2aa2cd08393fd104f641a Mon Sep 17 00:00:00 2001 From: Stijn De Clercq Date: Fri, 3 Sep 2021 18:26:26 +0200 Subject: [PATCH] Clean up define, create define slash command --- cogs/define.py | 95 ++------------------------- cogs/slash/define_slash.py | 25 +++++++ data/embeds/urban_dictionary.py | 113 ++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 91 deletions(-) create mode 100644 cogs/slash/define_slash.py create mode 100644 data/embeds/urban_dictionary.py diff --git a/cogs/define.py b/cogs/define.py index 23eba64..26adb40 100644 --- a/cogs/define.py +++ b/cogs/define.py @@ -1,11 +1,8 @@ -import os - +from data.embeds.urban_dictionary import Definition from decorators import help -import discord from discord.ext import commands from enums.help_categories import Category from functions import checks -import requests class Define(commands.Cog): @@ -19,99 +16,15 @@ class Define(commands.Cog): @commands.command(name="Define", aliases=["UrbanDictionary", "Ud"], usage="[Woord]") @commands.check(checks.allowedChannels) @help.Category(category=Category.Other) - async def define(self, ctx, *words): + async def define(self, ctx, *, query): """ Command that looks up the definition of a word in the Urban Dictionary. :param ctx: Discord Context - :param words: Word(s) to look up + :param query: Word(s) to look up """ - words = list(words) - if len(words) == 0: - return await ctx.send("Controleer je argumenten.") - - query = " ".join(words) - answer = self.lookup(query) - - embed = discord.Embed(colour=discord.Colour.from_rgb(220, 255, 0)) - embed.set_author(name="Urban Dictionary") - - embed.add_field(name="Woord", value=answer["word"], inline=True) - embed.add_field(name="Auteur", value=answer["author"], inline=True) - embed.add_field(name="Definitie", value=self.cleanString(answer["definition"]), inline=False) - embed.add_field(name="Voorbeeld", value=self.cleanString(answer["example"]), inline=False) - embed.add_field(name="Rating", value=str(round(self.ratio(answer), 2)) + "%") - embed.add_field(name="Link naar de volledige definitie", - value="[Urban Dictionary]({})".format(str(answer["link"]))) - + embed = Definition(query).to_embed() await ctx.send(embed=embed) - def lookup(self, word): - """ - Function that sends the API request to get the definition. - :param word: the woord to look up - :return: a dictionary representing the info of this word - """ - url = "https://mashape-community-urban-dictionary.p.rapidapi.com/define" - - querystring = {"term": word} - - headers = { - 'x-rapidapi-host': "mashape-community-urban-dictionary.p.rapidapi.com", - 'x-rapidapi-key': os.getenv("URBANDICTIONARY") - } - - try: - if word.lower() == "didier": - raise Exception - - response = requests.request("GET", url, headers=headers, params=querystring).json()["list"] - - if len(response) > 0: - return {"word": response[0]["word"], "definition": response[0]["definition"], - "example": response[0]["example"], "thumbs_up": response[0]["thumbs_up"], - "thumbs_down": response[0]["thumbs_down"], "link": response[0]["permalink"], - "author": response[0]["author"]} - - # No valid response - return self.defineDidier() - except Exception: - return self.defineDidier() - - def cleanString(self, text: str): - """ - Function that cuts off definitions that are too long & strips out UD markdown - from an input string. - :param text: the input string to clean up - :return: the edited version of the string - """ - text = text.replace("[", "") - text = text.replace("]", "") - - if not text: - return "N/A" - - return text if len(text) < 1024 else text[:1021] + "..." - - def ratio(self, dic): - """ - Function that alculates the upvote/downvote ratio of the definition. - :param dic: the dictionary representing the definition - :return: the upvote/downvote ratio (float) - """ - return (100 * int(dic["thumbs_up"])) / (int(dic["thumbs_up"]) + int(dic["thumbs_down"])) \ - if int(dic["thumbs_down"]) != 0 else 100.0 - - def defineDidier(self): - """ - Function that returns a stock dictionary to define Didier - in case people call it, or no definition was found. - :return: a dictionary that defines Didier - """ - return {"word": "Didier", "definition": "Didier", "example": "1: Didier\n2: Hmm?", "thumbs_up": 69420, - "thumbs_down": 0, "author": "Didier", - "link": "https://upload.wikimedia.org/wikipedia/commons/a/a5" - "/Didier_Reynders_in_Iranian_Parliament_02.jpg"} - def setup(client): client.add_cog(Define(client)) diff --git a/cogs/slash/define_slash.py b/cogs/slash/define_slash.py new file mode 100644 index 0000000..55899d8 --- /dev/null +++ b/cogs/slash/define_slash.py @@ -0,0 +1,25 @@ +from discord.ext import commands +from dislash import SlashInteraction, slash_command, Option, OptionType + +from data.embeds.urban_dictionary import Definition +from startup.didier import Didier + + +class DefineSlash(commands.Cog): + def __init__(self, client: Didier): + self.client: Didier = client + + @slash_command(name="define", + description="Urban Dictionary", + options=[ + Option("query", "Search query", OptionType.STRING, required=True) + ], + guild_ids=[728361030404538488, 880175869841277008] + ) + async def _define_slash(self, interaction: SlashInteraction, query): + embed = Definition(query).to_embed() + await interaction.reply(embed=embed) + + +def setup(client: Didier): + client.add_cog(DefineSlash(client)) diff --git a/data/embeds/urban_dictionary.py b/data/embeds/urban_dictionary.py new file mode 100644 index 0000000..c65017e --- /dev/null +++ b/data/embeds/urban_dictionary.py @@ -0,0 +1,113 @@ +import os +from typing import Dict + +import discord +import requests + + +class Definition: + def __init__(self, query: str): + self.query = query + self.definition = Definition.lookup(query) + + @staticmethod + def lookup(word) -> Dict: + """ + Function that sends the API request to get the definition. + :param word: the woord to look up + :return: a dictionary representing the info of this word + """ + url = "https://mashape-community-urban-dictionary.p.rapidapi.com/define" + + querystring = {"term": word} + + headers = { + 'x-rapidapi-host': "mashape-community-urban-dictionary.p.rapidapi.com", + 'x-rapidapi-key': os.getenv("URBANDICTIONARY") + } + + try: + if word.lower() == "didier": + raise Exception + + response = requests.get(url, headers=headers, params=querystring).json()["list"] + + if len(response) > 0: + return {"word": response[0]["word"], "definition": response[0]["definition"], + "example": response[0]["example"], "thumbs_up": response[0]["thumbs_up"], + "thumbs_down": response[0]["thumbs_down"], "link": response[0]["permalink"], + "author": response[0]["author"]} + + # No valid response + return {} + except Exception: + return Definition.define_didier() + + @staticmethod + def clean_string(text: str): + """ + Function that cuts off definitions that are too long & strips out UD markdown + from an input string. + :param text: the input string to clean up + :return: the edited version of the string + """ + text = text.replace("[", "") + text = text.replace("]", "") + + if not text: + return "N/A" + + return text if len(text) < 1024 else text[:1021] + "..." + + @staticmethod + def ratio(dic) -> float: + """ + Function that alculates the upvote/downvote ratio of the definition. + :param dic: the dictionary representing the definition + :return: the upvote/downvote ratio (float) + """ + return (100 * int(dic["thumbs_up"])) / (int(dic["thumbs_up"]) + int(dic["thumbs_down"])) \ + if int(dic["thumbs_down"]) != 0 else 100.0 + + @staticmethod + def define_didier() -> Dict: + """ + Function that returns a stock dictionary to define Didier + in case people call it, or no definition was found. + :return: a dictionary that defines Didier + """ + return {"word": "Didier", "definition": "Didier", "example": "1: Didier\n2: Hmm?", "thumbs_up": 69420, + "thumbs_down": 0, "author": "Didier", + "link": "https://upload.wikimedia.org/wikipedia/commons/a/a5" + "/Didier_Reynders_in_Iranian_Parliament_02.jpg"} + + def to_embed(self) -> discord.Embed: + """ + Create an embed for this definition + """ + # No results found + if not self.definition: + return self._nothing_found_embed() + + embed = discord.Embed(colour=discord.Colour.from_rgb(220, 255, 0)) + embed.set_author(name="Urban Dictionary") + + embed.add_field(name="Woord", value=self.definition["word"], inline=True) + embed.add_field(name="Auteur", value=self.definition["author"], inline=True) + embed.add_field(name="Definitie", value=Definition.clean_string(self.definition["definition"]), inline=False) + embed.add_field(name="Voorbeeld", value=Definition.clean_string(self.definition["example"]), inline=False) + embed.add_field(name="Rating", value=str(round(Definition.ratio(self.definition), 2)) + "%") + embed.add_field(name="Link naar de volledige definitie", + value="[Urban Dictionary]({})".format(str(self.definition["link"]))) + + return embed + + def _nothing_found_embed(self) -> discord.Embed: + """ + Special embed when no results could be found + """ + embed = discord.Embed(colour=discord.Colour.red(), title=self.query[:256]) + embed.set_author(name="Urban Dictionary") + embed.description = "Geen resultaten gevonden" + + return embed