diff options
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/evergreen/wikipedia.py | 89 | 
1 files changed, 48 insertions, 41 deletions
| diff --git a/bot/exts/evergreen/wikipedia.py b/bot/exts/evergreen/wikipedia.py index 068c4f43..27e68397 100644 --- a/bot/exts/evergreen/wikipedia.py +++ b/bot/exts/evergreen/wikipedia.py @@ -2,25 +2,35 @@ import logging  import re  from datetime import datetime  from html import unescape -from typing import List, Optional +from typing import List  from discord import Color, Embed, TextChannel  from discord.ext import commands  from bot.bot import Bot  from bot.utils import LinePaginator +from bot.utils.exceptions import APIError  log = logging.getLogger(__name__)  SEARCH_API = ( -    "https://en.wikipedia.org/w/api.php?action=query&list=search&prop=info&inprop=url&utf8=&" -    "format=json&origin=*&srlimit={number_of_results}&srsearch={string}" +    "https://en.wikipedia.org/w/api.php"  ) +WIKI_PARAMS = { +    "action": "query", +    "list": "search", +    "prop": "info", +    "inprop": "url", +    "utf8": "", +    "format": "json", +    "origin": "*", + +}  WIKI_THUMBNAIL = (      "https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Wikipedia-logo-v2.svg"      "/330px-Wikipedia-logo-v2.svg.png"  ) -WIKI_SNIPPET_REGEX = r'(<!--.*?-->|<[^>]*>)' +WIKI_SNIPPET_REGEX = r"(<!--.*?-->|<[^>]*>)"  WIKI_SEARCH_RESULT = (      "**[{name}]({url})**\n"      "{description}\n" @@ -33,46 +43,39 @@ class WikipediaSearch(commands.Cog):      def __init__(self, bot: Bot):          self.bot = bot -    async def wiki_request(self, channel: TextChannel, search: str) -> Optional[List[str]]: +    async def wiki_request(self, channel: TextChannel, search: str) -> List[str]:          """Search wikipedia search string and return formatted first 10 pages found.""" -        url = SEARCH_API.format(number_of_results=10, string=search) -        async with self.bot.http_session.get(url=url) as resp: -            if resp.status == 200: -                raw_data = await resp.json() -                number_of_results = raw_data['query']['searchinfo']['totalhits'] - -                if number_of_results: -                    results = raw_data['query']['search'] -                    lines = [] - -                    for article in results: -                        line = WIKI_SEARCH_RESULT.format( -                            name=article['title'], -                            description=unescape( -                                re.sub( -                                    WIKI_SNIPPET_REGEX, '', article['snippet'] -                                ) -                            ), -                            url=f"https://en.wikipedia.org/?curid={article['pageid']}" -                        ) -                        lines.append(line) - -                    return lines - -                else: -                    await channel.send( -                        "Sorry, we could not find a wikipedia article using that search term." -                    ) -                    return -            else: +        params = WIKI_PARAMS | {"srlimit": 10, "srsearch": search} +        async with self.bot.http_session.get(url=SEARCH_API, params=params) as resp: +            if resp.status != 200:                  log.info(f"Unexpected response `{resp.status}` while searching wikipedia for `{search}`") -                await channel.send( -                    "Whoops, the Wikipedia API is having some issues right now. Try again later." -                ) -                return +                raise APIError("Wikipedia API", resp.status) + +            raw_data = await resp.json() + +            if not raw_data.get("query"): +                if error := raw_data.get("errors"): +                    log.error(f"There was an error while communicating with the Wikipedia API: {error}") +                raise APIError("Wikipedia API", resp.status, error) + +            lines = [] +            if raw_data["query"]["searchinfo"]["totalhits"]: +                for article in raw_data["query"]["search"]: +                    line = WIKI_SEARCH_RESULT.format( +                        name=article["title"], +                        description=unescape( +                            re.sub( +                                WIKI_SNIPPET_REGEX, "", article["snippet"] +                            ) +                        ), +                        url=f"https://en.wikipedia.org/?curid={article['pageid']}" +                    ) +                    lines.append(line) + +            return lines      @commands.cooldown(1, 10, commands.BucketType.user) -    @commands.command(name="wikipedia", aliases=["wiki"]) +    @commands.command(name="wikipedia", aliases=("wiki",))      async def wikipedia_search_command(self, ctx: commands.Context, *, search: str) -> None:          """Sends paginated top 10 results of Wikipedia search.."""          contents = await self.wiki_request(ctx.channel, search) @@ -87,8 +90,12 @@ class WikipediaSearch(commands.Cog):              await LinePaginator.paginate(                  contents, ctx, embed              ) +        else: +            await ctx.send( +                "Sorry, we could not find a wikipedia article using that search term." +            )  def setup(bot: Bot) -> None: -    """Wikipedia Cog load.""" +    """Load the WikipediaSearch cog."""      bot.add_cog(WikipediaSearch(bot)) | 
