aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/__main__.py4
-rw-r--r--bot/command_error_handlers/__init__.py14
-rw-r--r--bot/exts/core/error_handler.py54
3 files changed, 19 insertions, 53 deletions
diff --git a/bot/__main__.py b/bot/__main__.py
index bacb2fdd..a6eb6d88 100644
--- a/bot/__main__.py
+++ b/bot/__main__.py
@@ -11,12 +11,14 @@ from redis import RedisError
import bot
from bot import constants
from bot.bot import Bot
+from bot.command_error_handlers import bootstrap_command_error_manager
from bot.log import setup_sentry
from bot.utils.decorators import whitelist_check
log = get_logger(__name__)
setup_sentry()
+
async def _create_redis_session() -> RedisSession:
"""Create and connect to a redis session."""
redis_session = RedisSession(
@@ -74,6 +76,8 @@ async def main() -> None:
allowed_roles=allowed_roles,
)
+ bot.instance.register_command_error_manager(bootstrap_command_error_manager(bot.instance))
+
async with bot.instance as _bot:
_bot.add_check(whitelist_check(
channels=constants.WHITELISTED_CHANNELS,
diff --git a/bot/command_error_handlers/__init__.py b/bot/command_error_handlers/__init__.py
index e69de29b..a5181636 100644
--- a/bot/command_error_handlers/__init__.py
+++ b/bot/command_error_handlers/__init__.py
@@ -0,0 +1,14 @@
+from pydis_core.utils.error_handling.commands import CommandErrorManager
+
+from bot.bot import Bot
+
+from .command_not_found import CommandNotFoundErrorHandler
+from .default import DefaultCommandErrorHandler
+
+
+def bootstrap_command_error_manager(bot: Bot) -> CommandErrorManager:
+ """Bootstraps the command error manager with all the needed error handlers."""
+ default_handler = DefaultCommandErrorHandler()
+ manager = CommandErrorManager(default=default_handler)
+ manager.register_handler(CommandNotFoundErrorHandler(bot))
+ return manager
diff --git a/bot/exts/core/error_handler.py b/bot/exts/core/error_handler.py
index cf116ba0..ce62070b 100644
--- a/bot/exts/core/error_handler.py
+++ b/bot/exts/core/error_handler.py
@@ -5,11 +5,9 @@ from collections.abc import Iterable
from discord import Embed, Message
from discord.ext import commands
from pydis_core.utils.logging import get_logger
-from sentry_sdk import push_scope
from bot.bot import Bot
from bot.constants import Channels, Colours, ERROR_REPLIES, NEGATIVE_REPLIES
-from bot.utils.commands import get_command_suggestions
from bot.utils.decorators import InChannelCheckFailure, InMonthCheckFailure
from bot.utils.exceptions import APIError, MovedCommandError, UserNotPlayingError
@@ -65,12 +63,6 @@ class CommandErrorHandler(commands.Cog):
f"Channel: {ctx.channel}"
)
- if isinstance(error, commands.CommandNotFound):
- # Ignore messages that start with "..", as they were likely not meant to be commands
- if not ctx.invoked_with.startswith("."):
- await self.send_command_suggestion(ctx, ctx.invoked_with)
- return
-
if isinstance(error, InChannelCheckFailure | InMonthCheckFailure):
await ctx.send(embed=self.error_embed(str(error), NEGATIVE_REPLIES), delete_after=7.5)
return
@@ -141,51 +133,7 @@ class CommandErrorHandler(commands.Cog):
await ctx.send(embed=self.error_embed(description, NEGATIVE_REPLIES))
return
- with push_scope() as scope:
- scope.user = {
- "id": ctx.author.id,
- "username": str(ctx.author)
- }
-
- scope.set_tag("command", ctx.command.qualified_name)
- scope.set_tag("message_id", ctx.message.id)
- scope.set_tag("channel_id", ctx.channel.id)
-
- scope.set_extra("full_message", ctx.message.content)
-
- if ctx.guild is not None:
- scope.set_extra("jump_to", ctx.message.jump_url)
-
- log.exception(f"Unhandled command error: {error!s}", exc_info=error)
-
- async def send_command_suggestion(self, ctx: commands.Context, command_name: str) -> None:
- """Sends user similar commands if any can be found."""
- command_suggestions = []
- if similar_command_names := get_command_suggestions(list(self.bot.all_commands.keys()), command_name):
- for similar_command_name in similar_command_names:
- similar_command = self.bot.get_command(similar_command_name)
-
- if not similar_command:
- continue
-
- log_msg = "Cancelling attempt to suggest a command due to failed checks."
- try:
- if not await similar_command.can_run(ctx):
- log.debug(log_msg)
- continue
- except commands.errors.CommandError:
- log.debug(log_msg)
- continue
-
- command_suggestions.append(similar_command_name)
-
- misspelled_content = ctx.message.content
- e = Embed()
- e.set_author(name="Did you mean:", icon_url=QUESTION_MARK_ICON)
- e.description = "\n".join(
- misspelled_content.replace(command_name, cmd, 1) for cmd in command_suggestions
- )
- await ctx.send(embed=e, delete_after=DELETE_DELAY)
+ await self.bot.command_error_manager.handle_error(error, ctx)
async def setup(bot: Bot) -> None: