Browse Source

Move server parsing code from Client to Server.

pull/42/merge
Rapptz 10 years ago
parent
commit
e10b6c767b
  1. 46
      discord/client.py
  2. 70
      discord/server.py

46
discord/client.py

@ -146,50 +146,8 @@ class ConnectionState(object):
def _get_server(self, guild_id): def _get_server(self, guild_id):
return utils.find(lambda g: g.id == guild_id, self.servers) 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): def _add_server(self, guild):
guild['roles'] = [Role(everyone=(guild['id'] == role['id']), **role) for role in guild['roles']] server = Server(**guild)
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)
self.servers.append(server) self.servers.append(server)
def handle_ready(self, data): def handle_ready(self, data):
@ -393,7 +351,7 @@ class ConnectionState(object):
def handle_voice_state_update(self, data): def handle_voice_state_update(self, data):
server = self._get_server(data.get('guild_id')) server = self._get_server(data.get('guild_id'))
if server is not None: 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) self.dispatch('voice_state_update', updated_member)
def handle_typing_start(self, data): def handle_typing_start(self, data):

70
discord/server.py

@ -25,6 +25,9 @@ DEALINGS IN THE SOFTWARE.
""" """
from . import utils from . import utils
from .role import Role
from .member import Member
from .channel import Channel
class Server(object): class Server(object):
"""Represents a Discord server. """Represents a Discord server.
@ -71,28 +74,69 @@ class Server(object):
""" """
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.name = kwargs.get('name') self._from_data(kwargs)
self.roles = kwargs.get('roles')
self.region = kwargs.get('region') def _update_voice_state(self, data):
self.afk_timeout = kwargs.get('afk_timeout') user_id = data.get('user_id')
self.afk_channel_id = kwargs.get('afk_channel_id') member = utils.find(lambda m: m.id == user_id, self.members)
self.members = kwargs.get('members') if member is not None:
self.icon = kwargs.get('icon') ch_id = data.get('channel_id')
self.id = kwargs.get('id') channel = utils.find(lambda c: c.id == ch_id, self.channels)
self.owner = kwargs.get('owner') member.update_voice_state(voice_channel=channel, **data)
self.unavailable = kwargs.get('unavailable', False) 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): def get_default_role(self):
"""Gets the @everyone role that all members have by default.""" """Gets the @everyone role that all members have by default."""
return utils.find(lambda r: r.is_everyone(), self.roles) return utils.find(lambda r: r.is_everyone(), self.roles)
def get_default_channel(self): def get_default_channel(self):
"""Gets the default :class:`Channel` for the server.""" """Gets the default :class:`Channel` for the server."""
return utils.find(lambda c: c.is_default_channel(), self.channels) return utils.find(lambda c: c.is_default_channel(), self.channels)
def icon_url(self): def icon_url(self):
"""Returns the URL version of the server's icon. Returns None if it has no icon.""" """Returns the URL version of the server's icon. Returns None if it has no icon."""
if self.icon is None: if self.icon is None:
return '' return ''
return 'https://cdn.discordapp.com/icons/{0.id}/{0.icon}.jpg'.format(self) return 'https://cdn.discordapp.com/icons/{0.id}/{0.icon}.jpg'.format(self)

Loading…
Cancel
Save