Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement (bot_)has_guild_permissions #2460

Closed
wants to merge 4 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 48 additions & 0 deletions discord/ext/commands/core.py
Expand Up @@ -56,6 +56,8 @@
'guild_only',
'is_owner',
'is_nsfw',
'has_guild_permissions',
'bot_has_guild_permissions'
)

def wrap_callback(coro):
Expand Down Expand Up @@ -1496,6 +1498,9 @@ def predicate(ctx):
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`.
Expand Down Expand Up @@ -1553,6 +1558,49 @@ def predicate(ctx):

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
Expand Down