aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Xithrius <[email protected]>2021-08-23 02:07:03 -0700
committerGravatar GitHub <[email protected]>2021-08-23 02:07:03 -0700
commit0a1b7b4bedbb6c19ad572869b57b466adae66b4a (patch)
tree73d1b3d2a2c82733b4e0ec642249b6a0f0f96d2e
parentMerge pull request #813 from python-discord/avatar-effects-fix (diff)
parentMerge branch 'main' into pr/wikipediaissue (diff)
Merge pull request #795 from D0rs4n/pr/wikipediaissue
Handle Wikipedia API errors and warnings in the Wikipedia Cog
-rw-r--r--bot/exts/evergreen/error_handler.py11
-rw-r--r--bot/exts/evergreen/wikipedia.py66
-rw-r--r--bot/utils/exceptions.py13
3 files changed, 55 insertions, 35 deletions
diff --git a/bot/exts/evergreen/error_handler.py b/bot/exts/evergreen/error_handler.py
index 5873fb83..a280c725 100644
--- a/bot/exts/evergreen/error_handler.py
+++ b/bot/exts/evergreen/error_handler.py
@@ -11,7 +11,7 @@ from sentry_sdk import push_scope
from bot.bot import Bot
from bot.constants import Channels, Colours, ERROR_REPLIES, NEGATIVE_REPLIES, RedirectOutput
from bot.utils.decorators import InChannelCheckFailure, InMonthCheckFailure
-from bot.utils.exceptions import UserNotPlayingError
+from bot.utils.exceptions import APIError, UserNotPlayingError
log = logging.getLogger(__name__)
@@ -120,6 +120,15 @@ class CommandErrorHandler(commands.Cog):
await ctx.send("Game not found.")
return
+ if isinstance(error, APIError):
+ await ctx.send(
+ embed=self.error_embed(
+ f"There was an error when communicating with the {error.api}",
+ NEGATIVE_REPLIES
+ )
+ )
+ return
+
with push_scope() as scope:
scope.user = {
"id": ctx.author.id,
diff --git a/bot/exts/evergreen/wikipedia.py b/bot/exts/evergreen/wikipedia.py
index 7b96cb7b..27e68397 100644
--- a/bot/exts/evergreen/wikipedia.py
+++ b/bot/exts/evergreen/wikipedia.py
@@ -2,13 +2,14 @@ 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__)
@@ -42,43 +43,36 @@ 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."""
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:
- 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:
+ 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",))
@@ -96,6 +90,10 @@ 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:
diff --git a/bot/utils/exceptions.py b/bot/utils/exceptions.py
index 9e080759..bf0e5813 100644
--- a/bot/utils/exceptions.py
+++ b/bot/utils/exceptions.py
@@ -1,4 +1,17 @@
+from typing import Optional
+
+
class UserNotPlayingError(Exception):
"""Raised when users try to use game commands when they are not playing."""
pass
+
+
+class APIError(Exception):
+ """Raised when an external API (eg. Wikipedia) returns an error response."""
+
+ def __init__(self, api: str, status_code: int, error_msg: Optional[str] = None):
+ super().__init__()
+ self.api = api
+ self.status_code = status_code
+ self.error_msg = error_msg