Browse Source

Fix voice states being overwritten after a GUILD_SYNC.

This was a two-fold problem. The first of which involved the overwriting
of members during a GUILD_SYNC. Since we are requesting a chunk anyway,
we have all the member references we need without actually chunking. The
second problem came from the order. We were doing a GUILD_SYNC and then
doing the chunking requests. We should do the GUILD_SYNC after the
chunking in order to just update presences.
pull/260/head
Rapptz 9 years ago
parent
commit
d87d11c5a6
  1. 25
      discord/server.py
  2. 7
      discord/state.py

25
discord/server.py

@ -180,6 +180,19 @@ class Server(Hashable):
self.unavailable = guild.get('unavailable', False)
self.id = guild['id']
self.roles = [Role(server=self, **r) for r in guild.get('roles', [])]
for mdata in guild.get('members', []):
roles = [self.default_role]
for role_id in mdata['roles']:
role = utils.find(lambda r: r.id == role_id, self.roles)
if role is not None:
roles.append(role)
mdata['roles'] = roles
member = Member(**mdata)
member.server = self
self._add_member(member)
self._sync(guild)
self.large = None if member_count is None else self._member_count > 250
@ -197,18 +210,6 @@ class Server(Hashable):
if 'large' in data:
self.large = data['large']
for mdata in data.get('members', []):
roles = [self.default_role]
for role_id in mdata['roles']:
role = utils.find(lambda r: r.id == role_id, self.roles)
if role is not None:
roles.append(role)
mdata['roles'] = roles
member = Member(**mdata)
member.server = self
self._add_member(member)
for presence in data.get('presences', []):
user_id = presence['user']['id']
member = self.get_member(user_id)

7
discord/state.py

@ -186,6 +186,10 @@ class ConnectionState:
# remove the state
del self._ready_state
# call GUILD_SYNC after we're done chunking
if not self.is_bot:
compat.create_task(self.syncer([s.id for s in self.servers]), loop=self.loop)
# dispatch the event
self.dispatch('ready')
@ -200,9 +204,6 @@ class ConnectionState:
if server.large or not self.is_bot:
servers.append(server)
if not self.is_bot:
compat.create_task(self.syncer([s.id for s in self.servers]), loop=self.loop)
for pm in data.get('private_channels'):
self._add_private_channel(PrivateChannel(id=pm['id'],
user=User(**pm['recipient'])))

Loading…
Cancel
Save