aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-02-16 12:19:52 -0800
committerGravatar MarkKoz <[email protected]>2020-02-16 12:19:52 -0800
commit806c69f78c5751f6dc93bd8dcc6fff95436fe0ed (patch)
tree25f7b3882bde1bfcc35fbec0c5d37857c15c5f7b
parentError handler: log unhandled exceptions instead of re-raising (diff)
Error handler: move tag retrieval to a separate function
-rw-r--r--bot/cogs/error_handler.py46
1 files changed, 28 insertions, 18 deletions
diff --git a/bot/cogs/error_handler.py b/bot/cogs/error_handler.py
index 5eef045e8..7078d425d 100644
--- a/bot/cogs/error_handler.py
+++ b/bot/cogs/error_handler.py
@@ -72,24 +72,8 @@ class ErrorHandler(Cog):
# Try to look for a tag with the command's name if the command isn't found.
if isinstance(e, CommandNotFound) and not hasattr(ctx, "invoked_from_error_handler"):
- if not ctx.channel.id == Channels.verification:
- tags_get_command = self.bot.get_command("tags get")
- ctx.invoked_from_error_handler = True
-
- log_msg = "Cancelling attempt to fall back to a tag due to failed checks."
- try:
- if not await tags_get_command.can_run(ctx):
- log.debug(log_msg)
- return
- except CommandError as tag_error:
- log.debug(log_msg)
- await self.on_command_error(ctx, tag_error)
- return
-
- # Return to not raise the exception
- with contextlib.suppress(ResponseCodeError):
- await ctx.invoke(tags_get_command, tag_name=ctx.invoked_with)
- return
+ if ctx.channel.id != Channels.verification:
+ await self.try_get_tag(ctx)
elif isinstance(e, BadArgument):
await ctx.send(f"Bad argument: {e}\n")
await ctx.invoke(*help_command)
@@ -116,6 +100,32 @@ class ErrorHandler(Cog):
# MaxConcurrencyReached, ExtensionError
await self.handle_unexpected_error(ctx, e)
+ async def try_get_tag(self, ctx: Context) -> None:
+ """
+ Attempt to display a tag by interpreting the command name as a tag name.
+
+ The invocation of tags get respects its checks. Any CommandErrors raised will be handled
+ by `on_command_error`, but the `invoked_from_error_handler` attribute will be added to
+ the context to prevent infinite recursion in the case of a CommandNotFound exception.
+ """
+ tags_get_command = self.bot.get_command("tags get")
+ ctx.invoked_from_error_handler = True
+
+ log_msg = "Cancelling attempt to fall back to a tag due to failed checks."
+ try:
+ if not await tags_get_command.can_run(ctx):
+ log.debug(log_msg)
+ return
+ except CommandError as tag_error:
+ log.debug(log_msg)
+ await self.on_command_error(ctx, tag_error)
+ return
+
+ # Return to not raise the exception
+ with contextlib.suppress(ResponseCodeError):
+ await ctx.invoke(tags_get_command, tag_name=ctx.invoked_with)
+ return
+
@staticmethod
async def handle_check_failure(ctx: Context, e: CheckFailure) -> None:
"""Handle CheckFailure exceptions and its children."""