aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2016-06-28 19:07:56 -0400
committerRapptz <[email protected]>2016-06-28 19:07:56 -0400
commitd87d11c5a66a0b2684fe606d0bbbe14e74fcc46d (patch)
tree7913ed8c4c6bf6539502c77d4c72629b14b61eb0
parentChange max_length to max_messages (diff)
downloaddiscord.py-d87d11c5a66a0b2684fe606d0bbbe14e74fcc46d.tar.xz
discord.py-d87d11c5a66a0b2684fe606d0bbbe14e74fcc46d.zip
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.
-rw-r--r--discord/server.py25
-rw-r--r--discord/state.py7
2 files changed, 17 insertions, 15 deletions
diff --git a/discord/server.py b/discord/server.py
index 02873c46..b320fede 100644
--- a/discord/server.py
+++ b/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)
diff --git a/discord/state.py b/discord/state.py
index 02ee04f1..7fc8debc 100644
--- a/discord/state.py
+++ b/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'])))