aboutsummaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorRapptz <[email protected]>2016-02-24 15:13:20 -0500
committerRapptz <[email protected]>2016-02-24 15:13:20 -0500
commit13f8b972e6520d1f353f9f9c7fe16d61de531f01 (patch)
tree71fda1137846da1ce008c6f3b1d225dbc3fbf1f6 /discord
parentSwitch URLs from Client.delete_server and Client.leave_server. (diff)
downloaddiscord.py-13f8b972e6520d1f353f9f9c7fe16d61de531f01.tar.xz
discord.py-13f8b972e6520d1f353f9f9c7fe16d61de531f01.zip
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.
Diffstat (limited to 'discord')
-rw-r--r--discord/channel.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/discord/channel.py b/discord/channel.py
index a4ac936c..8f718fbe 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."""