From dd5fc656d93f5d04ab164c05ca3d3dc700bf81c9 Mon Sep 17 00:00:00 2001 From: z03h Date: Tue, 20 Jul 2021 23:51:46 -0700 Subject: [PATCH] Fix permissions_for for roles --- discord/abc.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/discord/abc.py b/discord/abc.py index bd1d67ee2..e6bb0f5ab 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 + overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id) + if overwrite is not None: + base.handle_overwrite(overwrite.allow, overwrite.deny) - if overwrite.id in (obj.id, guild_id): - denies |= overwrite.deny - allows |= overwrite.allow - - base.handle_overwrite(allows, denies) return base roles = obj._roles