aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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."""