diff --git a/discord/ext/commands/bot.py b/discord/ext/commands/bot.py index c602a204b..9d5a09de8 100644 --- a/discord/ext/commands/bot.py +++ b/discord/ext/commands/bot.py @@ -43,7 +43,7 @@ class Bot(GroupMixin, discord.Client): This class also subclasses :class:`GroupMixin` to provide the functionality to manage commands. - Parameters + Attributes ----------- command_prefix The command prefix is what the message content must contain initially @@ -51,6 +51,11 @@ class Bot(GroupMixin, discord.Client): indicate what the prefix should be, or a callable that takes in a :class:`discord.Message` as its first parameter and returns the prefix. This is to facilitate "dynamic" command prefixes. + + The command prefix could also be a list or a tuple indicating that + multiple checks for the prefix should be used and the first one to + match will be the invocation prefix. You can get this prefix via + :attr:`Context.prefix`. """ def __init__(self, command_prefix, **options): super().__init__(**options) @@ -199,8 +204,16 @@ class Bot(GroupMixin, discord.Client): return prefix = self._get_prefix(message) - if not view.skip_string(prefix): - return + invoked_prefix = prefix + + if not isinstance(prefix, (tuple, list)): + if not view.skip_string(prefix): + return + else: + invoked_prefix = discord.utils.find(view.skip_string, prefix) + if invoked_prefix is None: + return + invoker = view.get_word() tmp = { @@ -208,6 +221,7 @@ class Bot(GroupMixin, discord.Client): 'invoked_with': invoker, 'message': message, 'view': view, + 'prefix': invoked_prefix } ctx = Context(**tmp) del tmp diff --git a/discord/ext/commands/context.py b/discord/ext/commands/context.py index 3e8266edd..8d1cd0546 100644 --- a/discord/ext/commands/context.py +++ b/discord/ext/commands/context.py @@ -46,6 +46,8 @@ class Context: A dictionary of transformed arguments that were passed into the command. Similar to :attr:`args`\, if this is accessed in the :func:`on_command_error` event then this dict could be incomplete. + prefix : str + The prefix that was used to invoke the command. command The command (i.e. :class:`Command` or its superclasses) that is being invoked currently. @@ -63,13 +65,15 @@ class Context: subcommand then this is set to `None`. """ __slots__ = ['message', 'bot', 'args', 'kwargs', 'command', 'view', - 'invoked_with', 'invoked_subcommand', 'subcommand_passed'] + 'invoked_with', 'invoked_subcommand', 'subcommand_passed', + 'prefix' ] def __init__(self, **attrs): self.message = attrs.pop('message', None) self.bot = attrs.pop('bot', None) self.args = attrs.pop('args', []) self.kwargs = attrs.pop('kwargs', {}) + self.prefix = attrs.pop('prefix') self.command = attrs.pop('command', None) self.view = attrs.pop('view', None) self.invoked_with = attrs.pop('invoked_with', None)