56 Commits

Author SHA1 Message Date
Rapptz
1a186c5a55 [commands] Fix cooldown decorator to work regardless of order. 2016-07-22 18:37:23 -04:00
Rapptz
cd0de57d13 [commands] Implement a command cooldown system.
The way the command cooldown works is using a windowed way of doing it.
That is, if we have a cooldown of 2 commands every 30 seconds then if we
do a single command, we have 30 seconds to do the second command or else
we will get rate limited. This more or less matches the common
expectations on how cooldowns should be.

These cooldowns can be bucketed up to a single dimension of depth for
a per-user, per-guild, or per-channel basis. Of course, a global bucket
is also provided. These cannot be mixed, e.g. no per-channel per-user
cooldowns.

When a command cooldown is triggered, the error handlers will receive a
an exception of type CommandOnCooldown with proper information regarding
the cooldown such as retry_after and the bucket information itself.
2016-07-22 18:05:38 -04:00
Rapptz
1500001b04 [commands] Fix error in converters in a private message context.
I was referencing a member function that did not actually exist. So I
ported it over to a free function that could be used.
2016-07-02 23:39:29 -04:00
Rapptz
4d71b3fe7d [commands] Do not lower-case the function name for default command names
There are some badlets out there that apparently violate PEP-8.
2016-07-01 22:12:57 -04:00
Rapptz
a2b053a517 [commands] Make GroupMixin.remove_command return None.
This is for cases where the command has been removed already. This will
make the function have a somewhat no exception guarantee.
2016-06-30 15:15:49 -04:00
Rapptz
6556392a9c [commands] Fix error where consume rest would not work.
I didn't end up refactoring this piece of work out.
2016-06-23 20:17:19 -04:00
Rapptz
629c24339b [commands] Fix bug that made functions stop working as converters. 2016-06-23 18:36:41 -04:00
Rapptz
e64eb08c92 [commands] Port special cased discord converters to commands.Converter 2016-06-22 20:05:37 -04:00
Rapptz
880ca3162e [commands] Add commands.Converter base for converts with context.
This allows users to implement converters that work similar to the ones
special cased by the `discord` classes.
2016-06-22 19:06:25 -04:00
Rapptz
324d10c9d9 [commands] Add Command.ignore_extra attribute to ignore extra arguments
This allows you to strictly require a number of arguments. The default
behaviour in this case is still `True`, since it would be a breaking
change otherwise and is a sane default. However if someone would want
to set this to `False`, they would receive an exception of type
`TooManyArguments` if too many arguments are passed to a command.

Hopefully this removes the uses of `ctx.message.content == 'stuff'`
inside commands.
2016-06-20 21:38:17 -04:00
Rapptz
adbf2c720f [commands] Add the concept of global checks.
Global checks are checks that are executed before regular per-command
checks except done to every command that the bot has registered. This
allows you to have checks that apply to every command without having to
override `on_message` or appending the check to every single command.
2016-06-19 22:15:11 -04:00
Rapptz
1228159f30 [commands] Fix bug with Context.command not updating in groups.
This happened when `invoke_without_command` was set to True.
2016-06-10 21:05:42 -04:00
Rapptz
43bbecd519 [commands] Exceptions raised while invocation raise CommandInvokeError.
This change should make it a bit more intuitive to get the original
exception without having the gotcha of checking ``isinstance`` inside
the error handler.
2016-06-10 20:32:05 -04:00
Rapptz
b9c7b05176 [commands] Unify Command.handle_local_error into general dispatcher. 2016-06-05 00:35:27 -04:00
Rapptz
661645ac97 [commands] Add Command.qualified_name to get the full command name.
This also sets `__str__` to do the same thing.
2016-06-04 22:31:00 -04:00
Rapptz
37dfe38af5 [commands] Fix bug where Context.command would not update. 2016-06-04 22:29:50 -04:00
Rapptz
9d9a20c128 [commands] Fix bug where subgroups would be repeatedly called.
This happened due to not resetting the `invoked_subcommand` state
tracking. Since the `invoked_subcommand` was not reset, it would always
assume that it was valid and repeatedly call it when passed invalid
subcommands/arguments.
2016-06-04 22:04:05 -04:00
Rapptz
24a9da04db [commands] Cleanup Command.invoke code due to exception propagation. 2016-06-04 21:41:01 -04:00
Khazhismel Kumykov
33a69681fc [commands] Dispatch command_error on command exec error.
Provide fallback on_command_error - will only fire if no cog handlers and
no local handler.
Propagate exceptions in checks and argument parsing to bot.
2016-06-04 21:22:10 -04:00
Rapptz
7f09acf871 [commands] Allow role mentions to work with discord.Role params.
This also fixes the Member regex to support the new <@!user_id> syntax
and allows colours to have a leading # before the number.
2016-04-29 08:45:12 -04:00
Rapptz
1c623ccf11 Begin working on gateway v4 support.
Bump websockets requirement to v3.1

Should be squashed...
2016-04-27 18:36:13 -04:00
Rapptz
e0ca746ad4 [commands] Make sure that mentions are the entire string. 2016-04-23 02:13:34 -04:00
Rapptz
d79a13d7bc [commands] Refactor special cased discord.py converters.
Code is a little more straightforward. The Member and Channel special
cases will now work in private message contexts when given a name. The
Member special case will also work if you pass in a name and
discriminator combo.
2016-04-01 07:27:39 -04:00
Will Tekulve
174016c918 [commands] Fix infinite recursion on subgroups without a command.
Just as an FYI, ctx.invoked_subcommand will end up being an instance
    of commands.Group!
2016-03-31 05:34:51 -04:00
Rapptz
050c668eac [commands] Add bot decorators into __all__. 2016-03-11 23:19:05 -05:00
Rapptz
6a31f6af1e [commands] Fix NameError in bot_has_permissions. 2016-03-02 23:18:47 -05:00
Rapptz
f49dc81adf [commands] bot_has_permissions decorator actually checks for bot. 2016-03-02 21:54:56 -05:00
Rapptz
baf1312d0e [commands] Raise RuntimeError instead of StopIteration. 2016-02-06 01:38:41 -05:00
Rapptz
0466f5965b [commands] Raise TypeError if the name is not a string. 2016-01-29 20:11:22 -05:00
Rapptz
8caadb5f03 [commands] Fix discord.Invite special case handling in parameters.
This led to decorating a lot of things into @asyncio.coroutine.
Unfortunately there's no way to lower the amount of decoration since
coroutines spread like a virus.
2016-01-24 02:18:39 -05:00
Rapptz
b98a8c1e14 [commands] Add Command.no_pm attribute to block a command in PM. 2016-01-22 07:21:40 -05:00
Rapptz
d1508bc739 [commands] Fix indentation error in commands.bot_has_role docstring. 2016-01-16 23:35:58 -05:00
Rapptz
3ebe64c776 [commands] Add checks for checking bot roles and permissions.
There was a bug with has_permissions that checked the bot's permissions
instead of the message author which was also corrected. The docstring
itself hinted that it checked for the author rather than the bot.
2016-01-15 17:24:27 -05:00
Rapptz
41d8dc63f4 [commands] Change behaviour of consume rest to be more useful.
You can get back the old behaviour by passing in `rest_is_raw` to the
command attributes.
2016-01-14 03:11:28 -05:00
Rapptz
b1d8e12609 [commands] Cleanup descriptions being passed. 2016-01-13 22:05:21 -05:00
Rapptz
4edff12f6b Proper exception chaining. 2016-01-13 20:08:55 -05:00
Rapptz
c29f0ea544 [commands] Fix keyword-only case to actually do conversion. 2016-01-12 01:06:53 -05:00
Rapptz
958d278771 [commands] Initial implementation of help command. 2016-01-11 23:59:11 -05:00
Rapptz
c49efc5412 [commands] Add Command.cog_name to get the cog name it belongs to. 2016-01-11 00:35:07 -05:00
Rapptz
1e941925c2 [commands] Add Command.clean_params to have nicer params.
These are params without the self/context parameters. Useful for
showing signature information in the help command without being
bogged down by knowing if the self/context parameters are there.
Hence it makes it easier to iterate knowing that you shouldn't care
about those two parameters.
2016-01-10 22:10:42 -05:00
Rapptz
a706c47f34 [commands] Remove all aliases if the main command is being deleted. 2016-01-10 20:08:13 -05:00
Rapptz
50c83b5a3c [commands] Strip arguments before searching for special cases. 2016-01-10 02:56:24 -05:00
Rapptz
38bac7fa86 [commands] Add Group.invoke_without_command. 2016-01-10 01:52:51 -05:00
Rapptz
b87d5e5337 [commands] Add basic support for extensions. 2016-01-09 18:33:37 -05:00
Rapptz
0a07fc088c [commands] Inject the internal variables for bot.say & co explicitly.
This is to catch cases where it wouldn't fail to find it when
inspecting the stack to catch these stack variables.
2016-01-09 15:16:28 -05:00
Rapptz
ad800e248b [commands] Add local error handlers. 2016-01-09 14:00:17 -05:00
Rapptz
b2e0632553 [commands] Propagate invoked_with to subcommands. 2016-01-09 12:24:01 -05:00
Rapptz
ec6b1997ad [commands] Add support for cogs.
Cogs are basically class instances that have commands and event
listeners. They allow for better organisation and grouping of
commands and state. Similar to subclassing discord.Client.
2016-01-09 02:18:03 -05:00
Rapptz
25588955e4 [commands] Add a way to enable or disable certain commands. 2016-01-07 17:59:26 -05:00
Rapptz
b79a4549ab [commands] Special handling for when the converter is bool. 2016-01-07 17:31:56 -05:00