diff options
| author | khazhyk <[email protected]> | 2018-06-25 00:26:03 -0700 |
|---|---|---|
| committer | Rapptz <[email protected]> | 2018-06-29 21:48:31 -0400 |
| commit | 74380cd72a31359c3d028a98b93b996734f7593d (patch) | |
| tree | 809e1877992676b01fd54c0d51c183f6505d77fa | |
| parent | [commands] Change command_prefix behaviour (diff) | |
| download | discord.py-74380cd72a31359c3d028a98b93b996734f7593d.tar.xz discord.py-74380cd72a31359c3d028a98b93b996734f7593d.zip | |
don't drop guild_available/join before ready
large guilds that recieved GUILD_CREATE events prior to READY would
never dispatch guild_available/join. This is inconsistent with
smaller guilds and makes these events unreliable. Dispatch the
"delayed" guilds after they've been chunked, prior to ready.
| -rw-r--r-- | discord/state.py | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/discord/state.py b/discord/state.py index 8be77ec7..648d9b53 100644 --- a/discord/state.py +++ b/discord/state.py @@ -285,10 +285,16 @@ class ConnectionState: launch.set() await asyncio.sleep(2, loop=self.loop) - guilds = self._ready_state.guilds + guilds = next(zip(*self._ready_state.guilds), []) if self._fetch_offline: await self.request_offline_members(guilds) + for guild, unavailable in self._ready_state.guilds: + if unavailable == False: + self.dispatch('guild_available', guild) + else: + self.dispatch('guild_join', guild) + # remove the state try: del self._ready_state @@ -648,7 +654,7 @@ class ConnectionState: try: state = self._ready_state state.launch.clear() - state.guilds.append(guild) + state.guilds.append((guild, unavailable)) except AttributeError: # the _ready_state attribute is only there during # processing of useful READY. @@ -920,12 +926,24 @@ class AutoShardedConnectionState(ConnectionState): await asyncio.sleep(2.0 * self.shard_count, loop=self.loop) if self._fetch_offline: - guilds = sorted(self._ready_state.guilds, key=lambda g: g.shard_id) + guilds = sorted(self._ready_state.guilds, key=lambda g: g[0].shard_id) - for shard_id, sub_guilds in itertools.groupby(guilds, key=lambda g: g.shard_id): - sub_guilds = list(sub_guilds) + for shard_id, sub_guilds_info in itertools.groupby(guilds, key=lambda g: g[0].shard_id): + sub_guilds, sub_available = zip(*sub_guilds_info) await self.request_offline_members(sub_guilds, shard_id=shard_id) + + for guild, unavailable in zip(sub_guilds, sub_available): + if unavailable == False: + self.dispatch('guild_available', guild) + else: + self.dispatch('guild_join', guild) self.dispatch('shard_ready', shard_id) + else: + for guild, unavailable in self._ready_state.guilds: + if unavailable == False: + self.dispatch('guild_available', guild) + else: + self.dispatch('guild_join', guild) # remove the state try: |