From c97e5a17e6947e3f171979a3e952572063583495 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Wed, 1 Jun 2016 21:06:04 -0400 Subject: [PATCH] Update positions when a role is added or removed. --- discord/server.py | 21 +++++++++++++++++++++ discord/state.py | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/discord/server.py b/discord/server.py index 62bd9ad6e..30896ba93 100644 --- a/discord/server.py +++ b/discord/server.py @@ -136,6 +136,27 @@ class Server(Hashable): member._update_voice_state(voice_channel=channel, **data) return before, member + def _add_role(self, role): + # roles get added to the bottom (position 1, pos 0 is @everyone) + # so since self.roles has the @everyone role, we can't increment + # its position because it's stuck at position 0. Luckily x += False + # is equivalent to adding 0. So we cast the position to a bool and + # increment it. + for r in self.roles: + r.position += bool(r.position) + + self.roles.append(role) + + def _remove_role(self, role): + # this raises ValueError if it fails.. + self.roles.remove(role) + + # since it didn't, we can change the positions now + # basically the same as above except we only decrement + # the position if we're above the role we deleted. + for r in self.roles: + r.position -= r.position > role.position + def _from_data(self, guild): # according to Stan, this is always available even if the guild is unavailable # I don't have this guarantee when someone updates the server. diff --git a/discord/state.py b/discord/state.py index b0c4ae15d..17bc5d2ce 100644 --- a/discord/state.py +++ b/discord/state.py @@ -477,7 +477,7 @@ class ConnectionState: server = self._get_server(data.get('guild_id')) role_data = data.get('role', {}) role = Role(server=server, **role_data) - server.roles.append(role) + server._add_role(role) self.dispatch('server_role_create', role) def parse_guild_role_delete(self, data): @@ -486,7 +486,7 @@ class ConnectionState: role_id = data.get('role_id') role = utils.find(lambda r: r.id == role_id, server.roles) try: - server.roles.remove(role) + server._remove_role(role) except ValueError: return else: