From 13f8b972e6520d1f353f9f9c7fe16d61de531f01 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Wed, 24 Feb 2016 15:13:20 -0500 Subject: [PATCH] Fix bug where the everyone role was not being properly resolved. The permissions_for assumed that the everyone role would be the first element of the permission overwrites but this is not guaranteed so we have to guarantee it ourselves. --- discord/channel.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/discord/channel.py b/discord/channel.py index a4ac936cf..8f718fbee 100644 --- a/discord/channel.py +++ b/discord/channel.py @@ -99,14 +99,26 @@ class Channel(Hashable): self.changed_roles = [] self._permission_overwrites = [] - for overridden in kwargs.get('permission_overwrites', []): + everyone_index = 0 + everyone_id = self.server.default_role.id + + for index, overridden in enumerate(kwargs.get('permission_overwrites', [])): + overridden_id = overridden['id'] self._permission_overwrites.append(Overwrites(**overridden)) if overridden.get('type') == 'member': continue + if overridden_id == everyone_id: + # the @everyone role is not guaranteed to be the first one + # in the list of permission overwrites, however the permission + # resolution code kind of requires that it is the first one in + # the list since it is special. So we need the index so we can + # swap it to be the first one. + everyone_index = index + # this is pretty inefficient due to the deep nested loops unfortunately - role = utils.find(lambda r: r.id == overridden['id'], self.server.roles) + role = utils.find(lambda r: r.id == overridden_id, self.server.roles) if role is None: continue @@ -116,6 +128,11 @@ class Channel(Hashable): override.permissions.handle_overwrite(allowed, denied) self.changed_roles.append(override) + # do the swap + tmp = self._permission_overwrites + if tmp: + tmp[everyone_index], tmp[0] = tmp[0], tmp[everyone_index] + @property def is_default(self): """bool : Indicates if this is the default channel for the :class:`Server` it belongs to."""