From 2c086e7dff181f12fe989fb1b54d36c92e204fa1 Mon Sep 17 00:00:00 2001 From: aikaterna <20862007+aikaterna@users.noreply.github.com> Date: Wed, 7 Apr 2021 16:02:47 -0700 Subject: [PATCH] [Dictionary] Change up some things in the search Let's see how long this one works --- dictionary/dictionary.py | 110 ++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 48 deletions(-) diff --git a/dictionary/dictionary.py b/dictionary/dictionary.py index 07d3447..99803db 100644 --- a/dictionary/dictionary.py +++ b/dictionary/dictionary.py @@ -1,5 +1,6 @@ import aiohttp from bs4 import BeautifulSoup +import json import logging import re from redbot.core import commands @@ -10,11 +11,13 @@ log = logging.getLogger("red.aikaterna.dictionary") class Dictionary(commands.Cog): - """Word, yo - Parts of this cog are adapted from the PyDictionary library.""" + """ + Word, yo + Parts of this cog are adapted from the PyDictionary library. + """ async def red_delete_data_for_user(self, **kwargs): - """ Nothing to delete """ + """Nothing to delete""" return def __init__(self, bot): @@ -24,39 +27,6 @@ class Dictionary(commands.Cog): def cog_unload(self): self.bot.loop.create_task(self.session.close()) - async def _get_soup_object(self, url): - try: - async with self.session.request("GET", url) as response: - return BeautifulSoup(await response.text(), "html.parser") - except Exception: - log.error("Error fetching dictionary.py related webpage", exc_info=True) - return None - - @commands.command() - async def antonym(self, ctx, *, word: str): - """Displays antonyms for a given word.""" - search_term = word.split(" ", 1)[0] - result = await self._antonym(ctx, search_term) - if not result: - await ctx.send("This word is not in the dictionary.") - return - - result_text = "*, *".join(result) - msg = f"Antonyms for **{search_term}**: *{result_text}*" - for page in pagify(msg, delims=["\n"]): - await ctx.send(page) - - async def _antonym(self, ctx, word): - data = await self._get_soup_object(f"http://www.thesaurus.com/browse/{word}") - if not data: - return await ctx.send("Error fetching data.") - section = data.find_all("ul", {"class": "css-1dnnh8h e1ccqdb60"}) - if len(section) > 0: - antonyms = section[0].text.split() - else: - antonyms = [] - return antonyms - @commands.command() async def define(self, ctx, *, word: str): """Displays definitions of a given word.""" @@ -110,27 +80,71 @@ class Dictionary(commands.Cog): out[name] = meanings return out - async def _synonym(self, ctx, word): - data = await self._get_soup_object(f"http://www.thesaurus.com/browse/{word}") - if not data: - return await ctx.send("Error fetching data.") - section = data.find_all("ul", {"class": "css-1l7o0dd e1ccqdb60"}) - if len(section) > 0: - synonyms = section[0].text.split() - else: - synonyms = [] - return synonyms + @commands.command() + async def antonym(self, ctx, *, word: str): + """Displays antonyms for a given word.""" + search_term = word.split(" ", 1)[0] + result = await self._antonym_or_synonym(ctx, "antonyms", search_term) + if not result: + await ctx.send("This word is not in the dictionary or nothing was found.") + return + + result_text = "*, *".join(result) + msg = f"Antonyms for **{search_term}**: *{result_text}*" + for page in pagify(msg, delims=["\n"]): + await ctx.send(page) @commands.command() async def synonym(self, ctx, *, word: str): """Displays synonyms for a given word.""" search_term = word.split(" ", 1)[0] - result = await self._synonym(ctx, search_term) + result = await self._antonym_or_synonym(ctx, "synonyms", search_term) if not result: - await ctx.send("This word is not in the dictionary.") + await ctx.send("This word is not in the dictionary or nothing was found.") return result_text = "*, *".join(result) msg = f"Synonyms for **{search_term}**: *{result_text}*" for page in pagify(msg, delims=["\n"]): await ctx.send(page) + + async def _antonym_or_synonym(self, ctx, lookup_type, word): + if lookup_type not in ["antonyms", "synonyms"]: + return None + data = await self._get_soup_object(f"http://www.thesaurus.com/browse/{word}") + if not data: + await ctx.send("Error getting information from the website.") + return + + website_data = None + script = data.find_all("script") + for item in script: + if item.string: + if "window.INITIAL_STATE" in item.string: + content = item.string + content = content.lstrip("window.INITIAL_STATE =").rstrip(";") + content = content.replace("undefined", '"None"').replace("true", '"True"').replace("false", '"False"') + try: + website_data = json.loads(content) + except json.decoder.JSONDecodeError: + return None + except Exception as e: + log.exception(e, exc_info=e) + await ctx.send("Something broke. Check your console for more information.") + return None + + final = [] + if website_data: + syn_list = website_data["searchData"]["tunaApiData"]["posTabs"][0][lookup_type] + for syn in syn_list: + final.append(syn["term"]) + + return final + + async def _get_soup_object(self, url): + try: + async with self.session.request("GET", url) as response: + return BeautifulSoup(await response.text(), "html.parser") + except Exception: + log.error("Error fetching dictionary.py related webpage", exc_info=True) + return None