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.
This commit is contained in:
parent
a93c3d931c
commit
74380cd72a
@ -285,10 +285,16 @@ class ConnectionState:
|
|||||||
launch.set()
|
launch.set()
|
||||||
await asyncio.sleep(2, loop=self.loop)
|
await asyncio.sleep(2, loop=self.loop)
|
||||||
|
|
||||||
guilds = self._ready_state.guilds
|
guilds = next(zip(*self._ready_state.guilds), [])
|
||||||
if self._fetch_offline:
|
if self._fetch_offline:
|
||||||
await self.request_offline_members(guilds)
|
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
|
# remove the state
|
||||||
try:
|
try:
|
||||||
del self._ready_state
|
del self._ready_state
|
||||||
@ -648,7 +654,7 @@ class ConnectionState:
|
|||||||
try:
|
try:
|
||||||
state = self._ready_state
|
state = self._ready_state
|
||||||
state.launch.clear()
|
state.launch.clear()
|
||||||
state.guilds.append(guild)
|
state.guilds.append((guild, unavailable))
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# the _ready_state attribute is only there during
|
# the _ready_state attribute is only there during
|
||||||
# processing of useful READY.
|
# processing of useful READY.
|
||||||
@ -920,12 +926,24 @@ class AutoShardedConnectionState(ConnectionState):
|
|||||||
await asyncio.sleep(2.0 * self.shard_count, loop=self.loop)
|
await asyncio.sleep(2.0 * self.shard_count, loop=self.loop)
|
||||||
|
|
||||||
if self._fetch_offline:
|
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):
|
for shard_id, sub_guilds_info in itertools.groupby(guilds, key=lambda g: g[0].shard_id):
|
||||||
sub_guilds = list(sub_guilds)
|
sub_guilds, sub_available = zip(*sub_guilds_info)
|
||||||
await self.request_offline_members(sub_guilds, shard_id=shard_id)
|
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)
|
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
|
# remove the state
|
||||||
try:
|
try:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user