mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-06-07 20:28:38 +00:00
Clear outstanding chunk requests when receiving a READY event
Ref: #9571
This commit is contained in:
parent
2a59e0286e
commit
d25b574b32
@ -110,12 +110,14 @@ class ChunkRequest:
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
guild_id: int,
|
guild_id: int,
|
||||||
|
shard_id: int,
|
||||||
loop: asyncio.AbstractEventLoop,
|
loop: asyncio.AbstractEventLoop,
|
||||||
resolver: Callable[[int], Any],
|
resolver: Callable[[int], Any],
|
||||||
*,
|
*,
|
||||||
cache: bool = True,
|
cache: bool = True,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.guild_id: int = guild_id
|
self.guild_id: int = guild_id
|
||||||
|
self.shard_id: int = shard_id
|
||||||
self.resolver: Callable[[int], Any] = resolver
|
self.resolver: Callable[[int], Any] = resolver
|
||||||
self.loop: asyncio.AbstractEventLoop = loop
|
self.loop: asyncio.AbstractEventLoop = loop
|
||||||
self.cache: bool = cache
|
self.cache: bool = cache
|
||||||
@ -315,6 +317,16 @@ class ConnectionState(Generic[ClientT]):
|
|||||||
for key in removed:
|
for key in removed:
|
||||||
del self._chunk_requests[key]
|
del self._chunk_requests[key]
|
||||||
|
|
||||||
|
def clear_chunk_requests(self, shard_id: int | None) -> None:
|
||||||
|
removed = []
|
||||||
|
for key, request in self._chunk_requests.items():
|
||||||
|
if shard_id is None or request.shard_id == shard_id:
|
||||||
|
request.done()
|
||||||
|
removed.append(key)
|
||||||
|
|
||||||
|
for key in removed:
|
||||||
|
del self._chunk_requests[key]
|
||||||
|
|
||||||
def call_handlers(self, key: str, *args: Any, **kwargs: Any) -> None:
|
def call_handlers(self, key: str, *args: Any, **kwargs: Any) -> None:
|
||||||
try:
|
try:
|
||||||
func = self.handlers[key]
|
func = self.handlers[key]
|
||||||
@ -535,7 +547,7 @@ class ConnectionState(Generic[ClientT]):
|
|||||||
if ws is None:
|
if ws is None:
|
||||||
raise RuntimeError('Somehow do not have a websocket for this guild_id')
|
raise RuntimeError('Somehow do not have a websocket for this guild_id')
|
||||||
|
|
||||||
request = ChunkRequest(guild.id, self.loop, self._get_guild, cache=cache)
|
request = ChunkRequest(guild.id, guild.shard_id, self.loop, self._get_guild, cache=cache)
|
||||||
self._chunk_requests[request.nonce] = request
|
self._chunk_requests[request.nonce] = request
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -602,6 +614,7 @@ class ConnectionState(Generic[ClientT]):
|
|||||||
|
|
||||||
self._ready_state: asyncio.Queue[Guild] = asyncio.Queue()
|
self._ready_state: asyncio.Queue[Guild] = asyncio.Queue()
|
||||||
self.clear(views=False)
|
self.clear(views=False)
|
||||||
|
self.clear_chunk_requests(None)
|
||||||
self.user = user = ClientUser(state=self, data=data['user'])
|
self.user = user = ClientUser(state=self, data=data['user'])
|
||||||
self._users[user.id] = user # type: ignore
|
self._users[user.id] = user # type: ignore
|
||||||
|
|
||||||
@ -1204,7 +1217,9 @@ class ConnectionState(Generic[ClientT]):
|
|||||||
cache = cache or self.member_cache_flags.joined
|
cache = cache or self.member_cache_flags.joined
|
||||||
request = self._chunk_requests.get(guild.id)
|
request = self._chunk_requests.get(guild.id)
|
||||||
if request is None:
|
if request is None:
|
||||||
self._chunk_requests[guild.id] = request = ChunkRequest(guild.id, self.loop, self._get_guild, cache=cache)
|
self._chunk_requests[guild.id] = request = ChunkRequest(
|
||||||
|
guild.id, guild.shard_id, self.loop, self._get_guild, cache=cache
|
||||||
|
)
|
||||||
await self.chunker(guild.id, nonce=request.nonce)
|
await self.chunker(guild.id, nonce=request.nonce)
|
||||||
|
|
||||||
if wait:
|
if wait:
|
||||||
@ -1751,6 +1766,7 @@ class AutoShardedConnectionState(ConnectionState[ClientT]):
|
|||||||
|
|
||||||
if shard_id in self._ready_tasks:
|
if shard_id in self._ready_tasks:
|
||||||
self._ready_tasks[shard_id].cancel()
|
self._ready_tasks[shard_id].cancel()
|
||||||
|
self.clear_chunk_requests(shard_id)
|
||||||
|
|
||||||
if shard_id not in self._ready_states:
|
if shard_id not in self._ready_states:
|
||||||
self._ready_states[shard_id] = asyncio.Queue()
|
self._ready_states[shard_id] = asyncio.Queue()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user