diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py index 0f75d36a7..070e7e3b2 100644 --- a/discord/ext/commands/core.py +++ b/discord/ext/commands/core.py @@ -1116,6 +1116,9 @@ def has_permissions(**perms): The permissions passed in must be exactly like the properties shown under :class:`.discord.Permissions`. + This check raises a special exception, :exc:`.MissingPermissions` + that is derived from :exc:`.CheckFailure`. + Parameters ------------ perms @@ -1135,7 +1138,13 @@ def has_permissions(**perms): def predicate(ctx): ch = ctx.channel permissions = ch.permissions_for(ctx.author) - return all(getattr(permissions, perm, None) == value for perm, value in perms.items()) + + 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) @@ -1169,12 +1178,22 @@ def bot_has_any_role(*names): def bot_has_permissions(**perms): """Similar to :func:`.has_permissions` except checks if the bot itself has the permissions listed. + + This check raises a special exception, :exc:`.BotMissingPermissions` + that is derived from :exc:`.CheckFailure`. """ def predicate(ctx): guild = ctx.guild me = guild.me if guild is not None else ctx.bot.user permissions = ctx.channel.permissions_for(me) - return all(getattr(permissions, perm, None) == value for perm, value in perms.items()) + + 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 guild_only():