aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2015-11-28 19:17:50 -0500
committerRapptz <[email protected]>2015-11-28 19:17:50 -0500
commite10b6c767ba52e5068eba1e68c8364b781f40f03 (patch)
treeb320aad86406fdc26625dc3aa8de4f0b7a2229eb
parentAdd new_member.py example to showcase messaging new members. (diff)
downloaddiscord.py-e10b6c767ba52e5068eba1e68c8364b781f40f03.tar.xz
discord.py-e10b6c767ba52e5068eba1e68c8364b781f40f03.zip
Move server parsing code from Client to Server.
-rw-r--r--discord/client.py46
-rw-r--r--discord/server.py70
2 files changed, 59 insertions, 57 deletions
diff --git a/discord/client.py b/discord/client.py
index 73dc26fc..b984b5af 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -146,50 +146,8 @@ class ConnectionState(object):
def _get_server(self, guild_id):
return utils.find(lambda g: g.id == guild_id, self.servers)
- def _update_voice_state(self, server, data):
- user_id = data.get('user_id')
- member = utils.find(lambda m: m.id == user_id, server.members)
- if member is not None:
- ch_id = data.get('channel_id')
- channel = utils.find(lambda c: c.id == ch_id, server.channels)
- member.update_voice_state(voice_channel=channel, **data)
- return member
-
def _add_server(self, guild):
- guild['roles'] = [Role(everyone=(guild['id'] == role['id']), **role) for role in guild['roles']]
- members = guild['members']
- owner = guild['owner_id']
- for i, member in enumerate(members):
- roles = member['roles']
- for j, roleid in enumerate(roles):
- role = utils.find(lambda r: r.id == roleid, guild['roles'])
- if role is not None:
- roles[j] = role
- members[i] = Member(**member)
-
- # found the member that owns the server
- if members[i].id == owner:
- owner = members[i]
-
- for presence in guild['presences']:
- user_id = presence['user']['id']
- member = utils.find(lambda m: m.id == user_id, members)
- if member is not None:
- member.status = presence['status']
- member.game_id = presence['game_id']
-
-
- server = Server(owner=owner, **guild)
-
- # give all the members their proper server
- for member in server.members:
- member.server = server
-
- channels = [Channel(server=server, **channel)
- for channel in guild['channels']]
- server.channels = channels
- for obj in guild.get('voice_states', []):
- self._update_voice_state(server, obj)
+ server = Server(**guild)
self.servers.append(server)
def handle_ready(self, data):
@@ -393,7 +351,7 @@ class ConnectionState(object):
def handle_voice_state_update(self, data):
server = self._get_server(data.get('guild_id'))
if server is not None:
- updated_member = self._update_voice_state(server, data)
+ updated_member = server._update_voice_state(data)
self.dispatch('voice_state_update', updated_member)
def handle_typing_start(self, data):
diff --git a/discord/server.py b/discord/server.py
index c06bb476..6082fdf0 100644
--- a/discord/server.py
+++ b/discord/server.py
@@ -25,6 +25,9 @@ DEALINGS IN THE SOFTWARE.
"""
from . import utils
+from .role import Role
+from .member import Member
+from .channel import Channel
class Server(object):
"""Represents a Discord server.
@@ -71,28 +74,69 @@ class Server(object):
"""
def __init__(self, **kwargs):
- self.name = kwargs.get('name')
- self.roles = kwargs.get('roles')
- self.region = kwargs.get('region')
- self.afk_timeout = kwargs.get('afk_timeout')
- self.afk_channel_id = kwargs.get('afk_channel_id')
- self.members = kwargs.get('members')
- self.icon = kwargs.get('icon')
- self.id = kwargs.get('id')
- self.owner = kwargs.get('owner')
- self.unavailable = kwargs.get('unavailable', False)
+ self._from_data(kwargs)
+
+ def _update_voice_state(self, data):
+ user_id = data.get('user_id')
+ member = utils.find(lambda m: m.id == user_id, self.members)
+ if member is not None:
+ ch_id = data.get('channel_id')
+ channel = utils.find(lambda c: c.id == ch_id, self.channels)
+ member.update_voice_state(voice_channel=channel, **data)
+ return member
+
+ def _from_data(self, guild):
+ self.name = guild.get('name')
+ self.region = guild.get('region')
+ self.afk_timeout = guild.get('afk_timeout')
+ self.afk_channel_id = guild.get('afk_channel_id')
+ self.icon = guild.get('icon')
+ self.unavailable = guild.get('unavailable', False)
+ self.id = guild['id']
+ self.roles = [Role(everyone=(self.id == r['id']), **r) for r in guild['roles']]
+
+ self.members = []
+ self.owner = guild['owner_id']
+
+ for data in guild['members']:
+ roles = []
+ for role_id in data['roles']:
+ role = utils.find(lambda r: r.id == role_id, self.roles)
+ if role is not None:
+ roles.append(role)
+
+ data['roles'] = roles
+ member = Member(**data)
+ member.server = self
+
+ if member.id == self.owner:
+ self.owner = member
+
+ self.members.append(member)
+
+ for presence in guild.get('presences', []):
+ user_id = presence['user']['id']
+ member = utils.find(lambda m: m.id == user_id, self.members)
+ if member is not None:
+ member.status = presence['status']
+ member.game_id = presence['game_id']
+
+ self.channels = [Channel(server=self, **c) for c in guild['channels']]
+
+ for obj in guild.get('voice_states', []):
+ self._update_voice_state(obj)
def get_default_role(self):
"""Gets the @everyone role that all members have by default."""
return utils.find(lambda r: r.is_everyone(), self.roles)
-
+
def get_default_channel(self):
"""Gets the default :class:`Channel` for the server."""
return utils.find(lambda c: c.is_default_channel(), self.channels)
-
+
def icon_url(self):
"""Returns the URL version of the server's icon. Returns None if it has no icon."""
if self.icon is None:
return ''
return 'https://cdn.discordapp.com/icons/{0.id}/{0.icon}.jpg'.format(self)
-
+