Update positions when a role is added or removed.
This commit is contained in:
		| @@ -136,6 +136,27 @@ class Server(Hashable): | |||||||
|             member._update_voice_state(voice_channel=channel, **data) |             member._update_voice_state(voice_channel=channel, **data) | ||||||
|         return before, member |         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): |     def _from_data(self, guild): | ||||||
|         # according to Stan, this is always available even if the guild is unavailable |         # according to Stan, this is always available even if the guild is unavailable | ||||||
|         # I don't have this guarantee when someone updates the server. |         # I don't have this guarantee when someone updates the server. | ||||||
|   | |||||||
| @@ -477,7 +477,7 @@ class ConnectionState: | |||||||
|         server = self._get_server(data.get('guild_id')) |         server = self._get_server(data.get('guild_id')) | ||||||
|         role_data = data.get('role', {}) |         role_data = data.get('role', {}) | ||||||
|         role = Role(server=server, **role_data) |         role = Role(server=server, **role_data) | ||||||
|         server.roles.append(role) |         server._add_role(role) | ||||||
|         self.dispatch('server_role_create', role) |         self.dispatch('server_role_create', role) | ||||||
|  |  | ||||||
|     def parse_guild_role_delete(self, data): |     def parse_guild_role_delete(self, data): | ||||||
| @@ -486,7 +486,7 @@ class ConnectionState: | |||||||
|             role_id = data.get('role_id') |             role_id = data.get('role_id') | ||||||
|             role = utils.find(lambda r: r.id == role_id, server.roles) |             role = utils.find(lambda r: r.id == role_id, server.roles) | ||||||
|             try: |             try: | ||||||
|                 server.roles.remove(role) |                 server._remove_role(role) | ||||||
|             except ValueError: |             except ValueError: | ||||||
|                 return |                 return | ||||||
|             else: |             else: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user