diff options
| -rw-r--r-- | bot/cogs/error_handler.py | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/bot/cogs/error_handler.py b/bot/cogs/error_handler.py new file mode 100644 index 00000000..79780251 --- /dev/null +++ b/bot/cogs/error_handler.py @@ -0,0 +1,106 @@ +import logging
 +import math
 +import sys
 +import traceback
 +
 +from discord.ext import commands
 +
 +
 +class CommandErrorHandler:
 +    """A error handler for the PythonDiscord server!"""
 +
 +    def __init__(self, bot):
 +        self.bot = bot
 +
 +    async def on_command_error(self, ctx, error):
 +        """Activates when a command opens an error"""
 +
 +        if hasattr(ctx.command, 'on_error'):
 +            return logging.debug(
 +                "A command error occured but " +
 +                "the command had it's own error handler"
 +            )
 +        error = getattr(error, 'original', error)
 +        if isinstance(error, commands.CommandNotFound):
 +            return logging.debug(
 +                f"{ctx.author} called '{ctx.message.content}' " +
 +                "but no command was found"
 +            )
 +        if isinstance(error, commands.UserInputError):
 +            logging.debug(
 +                f"{ctx.author} called the command '{ctx.command}' " +
 +                "but entered invalid input!"
 +            )
 +            return await ctx.send(
 +                ":no_entry: The command you specified failed to run." +
 +                "This is because the arguments you provided were invalid."
 +            )
 +        if isinstance(error, commands.CommandOnCooldown):
 +            logging.debug(
 +                f"{ctx.author} called the command '{ctx.command}' " +
 +                "but they were on cooldown!"
 +            )
 +            return await ctx.send(
 +                "This command is on cooldown," +
 +                f" please retry in {math.ceil(error.retry_after)}s."
 +            )
 +        if isinstance(error, commands.DisabledCommand):
 +            logging.debug(
 +                f"{ctx.author} called the command '{ctx.command}' " +
 +                "but the command was disabled!"
 +            )
 +            return await ctx.send(
 +                ":no_entry: This command has been disabled."
 +            )
 +        if isinstance(error, commands.NoPrivateMessage):
 +            logging.debug(
 +                f"{ctx.author} called the command '{ctx.command}' " +
 +                "in a private message however the command was guild only!"
 +            )
 +            return await ctx.author.send(
 +                ":no_entry: This command can only be used inside a server."
 +            )
 +        if isinstance(error, commands.BadArgument):
 +            if ctx.command.qualified_name == 'tag list':
 +                logging.debug(
 +                    f"{ctx.author} called the command '{ctx.command}' " +
 +                    "but entered an invalid user!"
 +                )
 +                return await ctx.send(
 +                    "I could not find that member. Please try again."
 +                )
 +            else:
 +                logging.debug(
 +                    f"{ctx.author} called the command '{ctx.command}' " +
 +                    "but entered a bad argument!"
 +                )
 +                return await ctx.send(
 +                    "The argument you provided was invalid."
 +                )
 +        if isinstance(error, commands.CheckFailure):
 +            logging.debug(
 +                f"{ctx.author} called the command '{ctx.command}' " +
 +                "but the checks failed!"
 +            )
 +            return await ctx.send(
 +                ":no_entry: You are not authorized to use this command."
 +            )
 +        print(
 +            f"Ignoring exception in command {ctx.command}:",
 +            file=sys.stderr
 +        )
 +        logging.warning(
 +            f"{ctx.author} called the command '{ctx.command}' " +
 +            "however the command failed to run with the error:" +
 +            f"-------------\n{error}"
 +        )
 +        traceback.print_exception(
 +            type(error),
 +            error,
 +            error.__traceback__,
 +            file=sys.stderr
 +        )
 +
 +
 +def setup(bot):
 +    bot.add_cog(CommandErrorHandler(bot))
 | 
