From d374f1e8ab3a99466d3d552a4ecb134922e9ffc4 Mon Sep 17 00:00:00 2001 From: stijndcl Date: Wed, 2 Nov 2022 01:23:01 +0100 Subject: [PATCH 1/2] Update the error handler for hybrid commands --- didier/didier.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/didier/didier.py b/didier/didier.py index cd82ec8..ff581f4 100644 --- a/didier/didier.py +++ b/didier/didier.py @@ -252,11 +252,22 @@ class Didier(commands.Bot): if hasattr(interaction.command, "on_error"): return - if isinstance(exception, (NoMatch, discord.app_commands.CommandInvokeError)): + # Unwrap exception + if isinstance(exception, discord.app_commands.CommandInvokeError): + exception = exception.original + + if isinstance(exception, (NoMatch, HTTPException)): if interaction.response.is_done(): - return await interaction.response.send_message(str(exception.original), ephemeral=True) + return await interaction.response.send_message(str(exception), ephemeral=True) else: - return await interaction.followup.send(str(exception.original), ephemeral=True) + return await interaction.followup.send(str(exception), ephemeral=True) + + await interaction.response.send_message("Something went wrong processing this command.", ephemeral=True) + + if settings.ERRORS_CHANNEL is not None: + embed = create_error_embed(await commands.Context.from_interaction(interaction), exception) + channel = self.get_channel(settings.ERRORS_CHANNEL) + await channel.send(embed=embed) async def on_command_completion(self, ctx: commands.Context): """Event triggered when a message command completes successfully""" @@ -279,6 +290,10 @@ class Didier(commands.Bot): if hasattr(ctx.command, "on_error"): return + # Hybrid command errors are wrapped in an additional error, so wrap it back out + if isinstance(exception, commands.HybridCommandError): + exception = exception.original + # Ignore exceptions that aren't important if isinstance( exception, @@ -291,7 +306,10 @@ class Didier(commands.Bot): return # Responses to things that go wrong during processing of commands - if isinstance(exception, commands.CommandInvokeError) and isinstance( + if isinstance( + exception, + (discord.app_commands.CommandInvokeError, commands.CommandInvokeError), + ) and isinstance( exception.original, ( NoMatch, From 8707f467d545c7b27cfb89939f266352d0b3407f Mon Sep 17 00:00:00 2001 From: stijndcl Date: Wed, 2 Nov 2022 01:32:55 +0100 Subject: [PATCH 2/2] Typing --- didier/didier.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/didier/didier.py b/didier/didier.py index ff581f4..318cc1c 100644 --- a/didier/didier.py +++ b/didier/didier.py @@ -7,7 +7,6 @@ from typing import Optional, Union import discord from aiohttp import ClientSession -from discord.app_commands import AppCommandError from discord.ext import commands from sqlalchemy.ext.asyncio import AsyncSession @@ -246,7 +245,7 @@ class Didier(commands.Bot): async with self.postgres_session as session: await command_stats.register_command_invocation(session, ctx, command, tz_aware_now()) - async def on_app_command_error(self, interaction: discord.Interaction, exception: AppCommandError): + async def on_app_command_error(self, interaction: discord.Interaction, exception: Exception): """Event triggered when an application command errors""" # If commands have their own error handler, let it handle the error instead if hasattr(interaction.command, "on_error"):