aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2015-12-05 16:57:29 -0500
committerRapptz <[email protected]>2015-12-06 03:09:55 -0500
commit80b32e769e9ced10c0be3813208203098b6e491c (patch)
tree164b1ae4754d48ad72a35f58e29a3f567f59bfef
parentDocumentation fixes in Client.connect. (diff)
downloaddiscord.py-80b32e769e9ced10c0be3813208203098b6e491c.tar.xz
discord.py-80b32e769e9ced10c0be3813208203098b6e491c.zip
Handle GUILD_UPDATE
-rw-r--r--discord/client.py7
-rw-r--r--discord/server.py15
-rw-r--r--discord/state.py7
-rw-r--r--docs/api.rst12
4 files changed, 32 insertions, 9 deletions
diff --git a/discord/client.py b/discord/client.py
index 5e0c4b54..15ff41a5 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -231,13 +231,12 @@ class Client:
if event in ('READY', 'MESSAGE_CREATE', 'MESSAGE_DELETE',
'MESSAGE_UPDATE', 'PRESENCE_UPDATE', 'USER_UPDATE',
'CHANNEL_DELETE', 'CHANNEL_UPDATE', 'CHANNEL_CREATE',
- 'GUILD_MEMBER_ADD', 'GUILD_MEMBER_REMOVE',
+ 'GUILD_MEMBER_ADD', 'GUILD_MEMBER_REMOVE', 'GUILD_UPDATE'
'GUILD_MEMBER_UPDATE', 'GUILD_CREATE', 'GUILD_DELETE',
'GUILD_ROLE_CREATE', 'GUILD_ROLE_DELETE', 'TYPING_START',
'GUILD_ROLE_UPDATE', 'VOICE_STATE_UPDATE'):
parser = 'parse_' + event.lower()
- if hasattr(self.connection, parser):
- getattr(self.connection, parser)(data)
+ getattr(self.connection, parser)(data)
else:
log.info("Unhandled event {}".format(event))
@@ -1739,7 +1738,7 @@ class Client:
deny = discord.Permissions.none()
allow.can_mention_everyone = True
deny.can_manage_messages = True
- client.set_channel_permissions(message.channel, message.author, allow, deny)
+ yield from client.set_channel_permissions(message.channel, message.author, allow, deny)
Parameters
-----------
diff --git a/discord/server.py b/discord/server.py
index 8309f052..9e0a796f 100644
--- a/discord/server.py
+++ b/discord/server.py
@@ -65,6 +65,9 @@ class Server:
"""
def __init__(self, **kwargs):
+ self.channels = []
+ self.owner = None
+ self.members = []
self._from_data(kwargs)
def _update_voice_state(self, data):
@@ -91,10 +94,9 @@ class Server:
self.roles = [Role(everyone=(self.id == r['id']), **r) for r in guild['roles']]
default_role = self.get_default_role()
- self.members = []
- self.owner = guild['owner_id']
+ owner_id = guild['owner_id']
- for data in guild['members']:
+ for data in guild.get('members', []):
roles = [default_role]
for role_id in data['roles']:
role = utils.find(lambda r: r.id == role_id, self.roles)
@@ -105,7 +107,7 @@ class Server:
member = Member(**data)
member.server = self
- if member.id == self.owner:
+ if member.id == owner_id:
self.owner = member
self.members.append(member)
@@ -121,7 +123,10 @@ class Server:
pass
member.game_id = presence['game_id']
- self.channels = [Channel(server=self, **c) for c in guild['channels']]
+ if 'channels' in guild:
+ channels = guild['channels']
+ self.channels = [Channel(server=self, **c) for c in channels]
+
afk_id = guild.get('afk_channel_id')
self.afk_channel = utils.find(lambda c: c.id == afk_id, self.channels)
diff --git a/discord/state.py b/discord/state.py
index d8b38a43..53dbdd4e 100644
--- a/discord/state.py
+++ b/discord/state.py
@@ -222,6 +222,13 @@ class ConnectionState:
self._add_server(data)
self.dispatch('server_join', self.servers[-1])
+ def parse_guild_update(self, data):
+ server = self._get_server(data.get('id'))
+ if server is not None:
+ old_server = copy.copy(server)
+ server._from_data(data)
+ self.dispatch('server_update', old_server, server)
+
def parse_guild_delete(self, data):
server = self._get_server(data.get('id'))
if data.get('unavailable', False) and server is not None:
diff --git a/docs/api.rst b/docs/api.rst
index 93b2c239..04d00613 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -243,6 +243,18 @@ to handle it, which defaults to print a traceback and ignore the exception.
:param server: The :class:`Server` that got removed.
+.. function:: on_server_update(before, after)
+
+ Called when a :class:`Server` updates, for example:
+
+ - Changed name
+ - Changed AFK channel
+ - Changed AFK timeout
+ - etc
+
+ :param before: The :class:`Server` prior to being updated.
+ :param after: The :class:`Server` after being updated.
+
.. function:: on_server_role_create(server, role)
on_server_role_delete(server, role)