diff --git a/discord/ext/commands/bot.py b/discord/ext/commands/bot.py index a788f6707..35b1d1498 100644 --- a/discord/ext/commands/bot.py +++ b/discord/ext/commands/bot.py @@ -31,6 +31,7 @@ import inspect from .core import GroupMixin from .view import StringView from .context import Context +from .errors import CommandNotFound class Bot(GroupMixin, discord.Client): """Represents a discord bot. @@ -203,18 +204,21 @@ class Bot(GroupMixin, discord.Client): view.skip_ws() invoker = view.get_word() + tmp = { + 'bot': self, + 'invoked_with': invoker, + 'message': message, + 'view': view, + } + ctx = Context(**tmp) + del tmp if invoker in self.commands: command = self.commands[invoker] - tmp = { - 'bot': self, - 'invoked_with': invoker, - 'message': message, - 'view': view, - 'command': command - } - ctx = Context(**tmp) - del tmp + ctx.command = command yield from command.invoke(ctx) + else: + exc = CommandNotFound('Command "{}" is not found'.format(invoker)) + self.dispatch('command_error', exc, ctx) @asyncio.coroutine def on_message(self, message): diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py index 9035cf33d..92ff64ab6 100644 --- a/discord/ext/commands/core.py +++ b/discord/ext/commands/core.py @@ -334,7 +334,6 @@ class Group(GroupMixin, Command): if ctx.invoked_subcommand: yield from ctx.invoked_subcommand.invoke(ctx) - # Decorators def command(name=None, cls=None, **attrs): diff --git a/discord/ext/commands/errors.py b/discord/ext/commands/errors.py index 01bd50355..9ffb6bd41 100644 --- a/discord/ext/commands/errors.py +++ b/discord/ext/commands/errors.py @@ -27,7 +27,7 @@ from discord.errors import DiscordException __all__ = [ 'CommandError', 'MissingRequiredArgument', 'BadArgument', - 'NoPrivateMessage', 'CheckFailure' ] + 'NoPrivateMessage', 'CheckFailure', 'CommandNotFound' ] class CommandError(DiscordException): """The base exception type for all command related errors. @@ -40,6 +40,14 @@ class CommandError(DiscordException): """ pass +class CommandNotFound(CommandError): + """Exception raised when a command is attempted to be invoked + but no command under that name is found. + + This is not raised for invalid subcommands, rather just the + initial main command that is attempted to be invoked. + """ + class MissingRequiredArgument(CommandError): """Exception raised when parsing a command and a parameter that is required is not encountered.