aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/evergreen/wikipedia.py
diff options
context:
space:
mode:
Diffstat (limited to 'bot/exts/evergreen/wikipedia.py')
-rw-r--r--bot/exts/evergreen/wikipedia.py89
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))