aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorz03h <[email protected]>2021-07-20 23:51:46 -0700
committerGitHub <[email protected]>2021-07-21 02:51:46 -0400
commitdd5fc656d93f5d04ab164c05ca3d3dc700bf81c9 (patch)
tree80b002f8a0c720b14690b8e0a57aead84ecb27be
parent[commands] Remove unused copy import in Cog (diff)
downloaddiscord.py-dd5fc656d93f5d04ab164c05ca3d3dc700bf81c9.tar.xz
discord.py-dd5fc656d93f5d04ab164c05ca3d3dc700bf81c9.zip
Fix permissions_for for roles
-rw-r--r--discord/abc.py31
1 files changed, 17 insertions, 14 deletions
diff --git a/discord/abc.py b/discord/abc.py
index bd1d67ee..e6bb0f5a 100644
--- a/discord/abc.py
+++ b/discord/abc.py
@@ -544,6 +544,7 @@ class GuildChannel:
someone with that role would have, which is essentially:
- The default role permissions
+ - The permissions of the role used as a parameter
- The default role permission overwrites
- The permission overwrites of the role used as a parameter
@@ -585,24 +586,26 @@ class GuildChannel:
# Handle the role case first
if isinstance(obj, Role):
+ base.value |= obj._permissions
+
+ if base.administrator:
+ return Permissions.all()
+
+ # Apply @everyone allow/deny first since it's special
+ try:
+ maybe_everyone = self._overwrites[0]
+ if maybe_everyone.id == self.guild.id:
+ base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny)
+ except IndexError:
+ pass
+
if obj.is_default():
- overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id)
- if overwrite is not None:
- base.handle_overwrite(overwrite.allow, overwrite.deny)
return base
- denies = 0
- allows = 0
- guild_id = self.guild.id
- for overwrite in self._overwrites:
- if not overwrite.is_role():
- continue
-
- if overwrite.id in (obj.id, guild_id):
- denies |= overwrite.deny
- allows |= overwrite.allow
+ overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id)
+ if overwrite is not None:
+ base.handle_overwrite(overwrite.allow, overwrite.deny)
- base.handle_overwrite(allows, denies)
return base
roles = obj._roles