aboutsummaryrefslogtreecommitdiff
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
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.
-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."""