aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Chris Lovering <[email protected]>2021-08-22 11:32:54 +0100
committerGravatar Chris Lovering <[email protected]>2021-08-22 11:32:54 +0100
commit9ad34a8f22fc19dba28498174da7f14df14a78c2 (patch)
treef5fbb3b3864d97de61a0999185b36aae7b533a7d
parentMerge pull request #1761 from python-discord/log-info-reminder-replies (diff)
Move metabase error handling to a cog error handler
-rw-r--r--bot/exts/moderation/metabase.py59
1 files changed, 33 insertions, 26 deletions
diff --git a/bot/exts/moderation/metabase.py b/bot/exts/moderation/metabase.py
index e9faf7240..80dabbbb0 100644
--- a/bot/exts/moderation/metabase.py
+++ b/bot/exts/moderation/metabase.py
@@ -42,6 +42,25 @@ class Metabase(Cog):
self.init_task = self.bot.loop.create_task(self.init_cog())
+ async def cog_command_error(self, ctx: Context, error: Exception) -> None:
+ """Handle ClientResponseError errors locally to invalidate token if needed."""
+ if not isinstance(error.original, ClientResponseError):
+ return
+
+ if error.original.status == 403:
+ # User doesn't have access to the given question
+ log.warning(f"Failed to auth with Metabase for {error.original.url}.")
+ await ctx.send(f":x: {ctx.author.mention} Failed to auth with Metabase for that question.")
+ elif error.original.status == 404:
+ await ctx.send(f":x: {ctx.author.mention} That question could not be found.")
+ else:
+ # User credentials are invalid, or the refresh failed.
+ # Delete the expiry time, to force a refresh on next startup.
+ await self.session_info.delete("session_expiry")
+ log.exception("Session token is invalid or refresh failed.")
+ await ctx.send(f":x: {ctx.author.mention} Session token is invalid or refresh failed.")
+ error.handled = True
+
async def init_cog(self) -> None:
"""Initialise the metabase session."""
expiry_time = await self.session_info.get("session_expiry")
@@ -112,32 +131,20 @@ class Metabase(Cog):
await self.init_task
url = f"{MetabaseConfig.url}/card/{question_id}/query/{extension}"
- try:
- async with self.bot.http_session.post(url, headers=self.headers, raise_for_status=True) as resp:
- if extension == "csv":
- out = await resp.text(encoding="utf-8")
- # Save the output for use with int e
- self.exports[question_id] = list(csv.DictReader(StringIO(out)))
-
- elif extension == "json":
- out = await resp.json(encoding="utf-8")
- # Save the output for use with int e
- self.exports[question_id] = out
-
- # Format it nicely for human eyes
- out = json.dumps(out, indent=4, sort_keys=True)
- except ClientResponseError as e:
- if e.status == 403:
- # User doesn't have access to the given question
- log.warning(f"Failed to auth with Metabase for question {question_id}.")
- await ctx.send(f":x: {ctx.author.mention} Failed to auth with Metabase for that question.")
- else:
- # User credentials are invalid, or the refresh failed.
- # Delete the expiry time, to force a refresh on next startup.
- await self.session_info.delete("session_expiry")
- log.exception("Session token is invalid or refresh failed.")
- await ctx.send(f":x: {ctx.author.mention} Session token is invalid or refresh failed.")
- return
+
+ async with self.bot.http_session.post(url, headers=self.headers, raise_for_status=True) as resp:
+ if extension == "csv":
+ out = await resp.text(encoding="utf-8")
+ # Save the output for use with int e
+ self.exports[question_id] = list(csv.DictReader(StringIO(out)))
+
+ elif extension == "json":
+ out = await resp.json(encoding="utf-8")
+ # Save the output for use with int e
+ self.exports[question_id] = out
+
+ # Format it nicely for human eyes
+ out = json.dumps(out, indent=4, sort_keys=True)
paste_link = await send_to_paste_service(out, extension=extension)
if paste_link: