mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-21 10:17:59 -05:00
[V3] Send meaningful responses on conversion failure (#1817)
* [V3] Send meaningful responses on conversion failures * Replace existing `discord.ext.commands` imports Just to be sure * Better Permissions converter response
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
from redbot.core import commands
|
||||
|
||||
|
||||
async def check_overrides(ctx, *, level):
|
||||
|
||||
@@ -2,3 +2,4 @@
|
||||
from discord.ext.commands import *
|
||||
from .commands import *
|
||||
from .context import *
|
||||
from .errors import *
|
||||
|
||||
@@ -4,12 +4,20 @@ This module contains extended classes and functions which are intended to
|
||||
replace those from the `discord.ext.commands` module.
|
||||
"""
|
||||
import inspect
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from discord.ext import commands
|
||||
|
||||
from .errors import ConversionFailure
|
||||
from ..i18n import Translator
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .context import Context
|
||||
|
||||
__all__ = ["Command", "Group", "command", "group"]
|
||||
|
||||
_ = Translator("commands.commands", __file__)
|
||||
|
||||
|
||||
class Command(commands.Command):
|
||||
"""Command class for Red.
|
||||
@@ -53,7 +61,7 @@ class Command(commands.Command):
|
||||
"""
|
||||
Returns all parent commands of this command.
|
||||
|
||||
This is a list, sorted by the length of :attr:`.qualified_name` from highest to lowest.
|
||||
This is a list, sorted by the length of :attr:`.qualified_name` from highest to lowest.
|
||||
If the command has no parents, this will be an empty list.
|
||||
"""
|
||||
cmd = self.parent
|
||||
@@ -63,6 +71,37 @@ class Command(commands.Command):
|
||||
cmd = cmd.parent
|
||||
return sorted(entries, key=lambda x: len(x.qualified_name), reverse=True)
|
||||
|
||||
async def do_conversion(self, ctx: "Context", converter, argument: str):
|
||||
"""Convert an argument according to its type annotation.
|
||||
|
||||
Raises
|
||||
------
|
||||
ConversionFailure
|
||||
If doing the conversion failed.
|
||||
|
||||
Returns
|
||||
-------
|
||||
Any
|
||||
The converted argument.
|
||||
|
||||
"""
|
||||
# Let's not worry about all of this junk if it's just a str converter
|
||||
if converter is str:
|
||||
return argument
|
||||
|
||||
try:
|
||||
return await super().do_conversion(ctx, converter, argument)
|
||||
except commands.BadArgument as exc:
|
||||
raise ConversionFailure(converter, argument, *exc.args) from exc
|
||||
except ValueError as exc:
|
||||
# Some common converters need special treatment...
|
||||
if converter in (int, float):
|
||||
message = _('"{argument}" is not a number.').format(argument=argument)
|
||||
raise ConversionFailure(converter, argument, message) from exc
|
||||
|
||||
# We should expose anything which might be a bug in the converter
|
||||
raise exc
|
||||
|
||||
def command(self, cls=None, *args, **kwargs):
|
||||
"""A shortcut decorator that invokes :func:`.command` and adds it to
|
||||
the internal command list via :meth:`~.GroupMixin.add_command`.
|
||||
|
||||
13
redbot/core/commands/errors.py
Normal file
13
redbot/core/commands/errors.py
Normal file
@@ -0,0 +1,13 @@
|
||||
"""Errors module for the commands package."""
|
||||
from discord.ext import commands
|
||||
|
||||
__all__ = ["ConversionFailure"]
|
||||
|
||||
|
||||
class ConversionFailure(commands.BadArgument):
|
||||
"""Raised when converting an argument fails."""
|
||||
|
||||
def __init__(self, converter, argument: str, *args):
|
||||
self.converter = converter
|
||||
self.argument = argument
|
||||
super().__init__(*args)
|
||||
@@ -11,9 +11,8 @@ from pkg_resources import DistributionNotFound
|
||||
|
||||
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
|
||||
from . import __version__
|
||||
from . import __version__, commands
|
||||
from .data_manager import storage_type
|
||||
from .utils.chat_formatting import inline, bordered, pagify, box
|
||||
from .utils import fuzzy_command_search
|
||||
@@ -185,6 +184,11 @@ def init_events(bot, cli_flags):
|
||||
async def on_command_error(ctx, error):
|
||||
if isinstance(error, commands.MissingRequiredArgument):
|
||||
await ctx.send_help()
|
||||
elif isinstance(error, commands.ConversionFailure):
|
||||
if error.args:
|
||||
await ctx.send(error.args[0])
|
||||
else:
|
||||
await ctx.send_help()
|
||||
elif isinstance(error, commands.BadArgument):
|
||||
await ctx.send_help()
|
||||
elif isinstance(error, commands.DisabledCommand):
|
||||
|
||||
Reference in New Issue
Block a user