diff --git a/discord/client.py b/discord/client.py index 268bb60c2..383ab54dc 100644 --- a/discord/client.py +++ b/discord/client.py @@ -114,7 +114,8 @@ class WebSocket(WebSocketBaseClient): 'CHANNEL_DELETE', 'CHANNEL_UPDATE', 'CHANNEL_CREATE', 'GUILD_MEMBER_ADD', 'GUILD_MEMBER_REMOVE', 'GUILD_MEMBER_UPDATE', 'GUILD_CREATE', 'GUILD_DELETE', - 'GUILD_ROLE_CREATE', 'GUILD_ROLE_DELETE'): + 'GUILD_ROLE_CREATE', 'GUILD_ROLE_DELETE', + 'GUILD_ROLE_UPDATE'): self.dispatch('socket_update', event, data) else: @@ -321,7 +322,15 @@ class ConnectionState(object): role_id = data.get('role_id') role = utils.find(lambda r: r.id == role_id, server.roles) server.roles.remove(role) - self.dispatch('server_role_delete', server, role) + self.dispatch('server_role_delete', server, role) + + def handle_guild_role_update(self, data): + server = self._get_server(data.get('guild_id')) + if server is not None: + role_id = data['role']['id'] + role = utils.find(lambda r: r.id == role_id, server.roles) + role.update(**data['role']) + self.dispatch('server_role_update', role) def get_channel(self, id): if id is None: diff --git a/discord/server.py b/discord/server.py index aa855bba8..51e5670bc 100644 --- a/discord/server.py +++ b/discord/server.py @@ -55,6 +55,9 @@ class Role(object): """ def __init__(self, **kwargs): + self.update(**kwargs) + + def update(self, **kwargs): self.id = kwargs.get('id') self.name = kwargs.get('name') self.permissions = Permissions(kwargs.get('permissions', 0)) diff --git a/docs/api.rst b/docs/api.rst index 2d5c73b76..7c15020d7 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -168,6 +168,12 @@ to handle it, which defaults to log a traceback and ignore the exception. :param server: The :class:`Server` that was created or deleted. :param role: The :class:`Role` that was created or deleted. +.. function:: on_server_role_update(role) + + Called when a :class:`Role` is changed server-wide. + + :param role: The :class:`Role` that was updated. + Utility Functions -----------------