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) | ||||
|         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. | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user