aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--discord/ext/commands/core.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py
index a37dd641..5f6aca16 100644
--- a/discord/ext/commands/core.py
+++ b/discord/ext/commands/core.py
@@ -56,6 +56,8 @@ __all__ = (
'guild_only',
'is_owner',
'is_nsfw',
+ 'has_guild_permissions',
+ 'bot_has_guild_permissions'
)
def wrap_callback(coro):
@@ -1496,6 +1498,9 @@ def bot_has_any_role(*items):
def has_permissions(**perms):
"""A :func:`.check` that is added that checks if the member has all of
the permissions necessary.
+
+ Note that this check operates on the current channel permissions, not the
+ guild wide permissions.
The permissions passed in must be exactly like the properties shown under
:class:`.discord.Permissions`.
@@ -1553,6 +1558,49 @@ def bot_has_permissions(**perms):
return check(predicate)
+def has_guild_permissions(**perms):
+ """Similar to :func:`.has_permissions`, but operates on guild wide
+ permissions instead of the current channel permissions.
+
+ If this check is called in a DM context, it will raise an
+ exception, :exc:`.NoPrivateMessage`.
+
+ .. versionadded:: 1.3.0
+ """
+ def predicate(ctx):
+ if not ctx.guild:
+ raise NoPrivateMessage
+
+ permissions = ctx.author.guild_permissions
+ missing = [perm for perm, value in perms.items() if getattr(permissions, perm, None) != value]
+
+ if not missing:
+ return True
+
+ raise MissingPermissions(missing)
+
+ return check(predicate)
+
+def bot_has_guild_permissions(**perms):
+ """Similar to :func:`.has_guild_permissions`, but checks the bot
+ members guild permissions.
+
+ .. versionadded:: 1.3.0
+ """
+ def predicate(ctx):
+ if not ctx.guild:
+ raise NoPrivateMessage
+
+ permissions = ctx.me.guild_permissions
+ missing = [perm for perm, value in perms.items() if getattr(permissions, perm, None) != value]
+
+ if not missing:
+ return True
+
+ raise BotMissingPermissions(missing)
+
+ return check(predicate)
+
def dm_only():
"""A :func:`.check` that indicates this command must only be used in a
DM context. Only private messages are allowed when