aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2017-06-21 02:27:16 -0400
committerRapptz <[email protected]>2017-06-21 02:30:24 -0400
commit3618f51f973bac555986422bd6c24ec108ab8256 (patch)
treedcf1f208d7c0868ad094a329adfa1d3d5e08f721
parent[commands] Add __global_check_once to list of cog functions. (diff)
downloaddiscord.py-3618f51f973bac555986422bd6c24ec108ab8256.tar.xz
discord.py-3618f51f973bac555986422bd6c24ec108ab8256.zip
[commands] Ensure that Context.command is the command in Command.can_run
Previously, Context.command was not guaranteed to be the actual command being checked if it can run. This could be troublesome when implementing help commands or when using the default help command. This new change allows at least for the guarantee that Context.command to be technically correct in Command.can_run.
-rw-r--r--discord/ext/commands/core.py40
1 files changed, 23 insertions, 17 deletions
diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py
index c00ed9dc..567efde5 100644
--- a/discord/ext/commands/core.py
+++ b/discord/ext/commands/core.py
@@ -640,26 +640,32 @@ class Command:
A boolean indicating if the command can be invoked.
"""
- if not (yield from ctx.bot.can_run(ctx)):
- raise CheckFailure('The global check functions for command {0.qualified_name} failed.'.format(self))
+ original = ctx.command
+ ctx.command = self
- cog = self.instance
- if cog is not None:
- try:
- local_check = getattr(cog, '_{0.__class__.__name__}__local_check'.format(cog))
- except AttributeError:
- pass
- else:
- ret = yield from discord.utils.maybe_coroutine(local_check, ctx)
- if not ret:
- return False
+ try:
+ if not (yield from ctx.bot.can_run(ctx)):
+ raise CheckFailure('The global check functions for command {0.qualified_name} failed.'.format(self))
- predicates = self.checks
- if not predicates:
- # since we have no checks, then we just return True.
- return True
+ cog = self.instance
+ if cog is not None:
+ try:
+ local_check = getattr(cog, '_{0.__class__.__name__}__local_check'.format(cog))
+ except AttributeError:
+ pass
+ else:
+ ret = yield from discord.utils.maybe_coroutine(local_check, ctx)
+ if not ret:
+ return False
- return (yield from discord.utils.async_all(predicate(ctx) for predicate in predicates))
+ predicates = self.checks
+ if not predicates:
+ # since we have no checks, then we just return True.
+ return True
+
+ return (yield from discord.utils.async_all(predicate(ctx) for predicate in predicates))
+ finally:
+ ctx.command = original
class GroupMixin:
"""A mixin that implements common functionality for classes that behave