From e10b6c767ba52e5068eba1e68c8364b781f40f03 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Sat, 28 Nov 2015 19:17:50 -0500 Subject: [PATCH] Move server parsing code from Client to Server. --- discord/client.py | 46 ++----------------------------- discord/server.py | 70 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 57 deletions(-) diff --git a/discord/client.py b/discord/client.py index 73dc26fc7..b984b5afa 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 c06bb4760..6082fdf0f 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) - +