Browse Source

Add guild_ready_timeout to control the timeout of GUILD_CREATE stream

This also fixes a timing issue where READY would take far too long to
load for big bot authors.

Closes #4112
pull/5164/head
Rapptz 5 years ago
parent
commit
d37b91dfc6
  1. 5
      discord/client.py
  2. 12
      discord/state.py

5
discord/client.py

@ -159,6 +159,11 @@ class Client:
WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if
processing the initial packets take too long to the point of disconnecting processing the initial packets take too long to the point of disconnecting
you. The default timeout is 60 seconds. you. The default timeout is 60 seconds.
guild_ready_timeout: :class:`float`
The maximum number of seconds to wait for the GUILD_CREATE stream to end before
preparing the member cache and firing READY. The default timeout is 2 seconds.
.. versionadded:: 1.4
guild_subscriptions: :class:`bool` guild_subscriptions: :class:`bool`
Whether to dispatching of presence or typing events. Defaults to ``True``. Whether to dispatching of presence or typing events. Defaults to ``True``.

12
discord/state.py

@ -80,6 +80,10 @@ class ConnectionState:
self._ready_task = None self._ready_task = None
self._fetch_offline = options.get('fetch_offline_members', True) self._fetch_offline = options.get('fetch_offline_members', True)
self.heartbeat_timeout = options.get('heartbeat_timeout', 60.0) self.heartbeat_timeout = options.get('heartbeat_timeout', 60.0)
self.guild_ready_timeout = options.get('guild_ready_timeout', 2.0)
if self.guild_ready_timeout < 0:
raise ValueError('guild_ready_timeout cannot be negative')
self.guild_subscriptions = options.get('guild_subscriptions', True) self.guild_subscriptions = options.get('guild_subscriptions', True)
allowed_mentions = options.get('allowed_mentions') allowed_mentions = options.get('allowed_mentions')
@ -369,10 +373,10 @@ class ConnectionState:
# only real bots wait for GUILD_CREATE streaming # only real bots wait for GUILD_CREATE streaming
if self.is_bot: if self.is_bot:
while True: while True:
# this snippet of code is basically waiting 2 seconds # this snippet of code is basically waiting N seconds
# until the last GUILD_CREATE was sent # until the last GUILD_CREATE was sent
try: try:
await asyncio.wait_for(launch.wait(), timeout=2.0) await asyncio.wait_for(launch.wait(), timeout=self.guild_ready_timeout)
except asyncio.TimeoutError: except asyncio.TimeoutError:
break break
else: else:
@ -1086,10 +1090,10 @@ class AutoShardedConnectionState(ConnectionState):
await self.shards_launched.wait() await self.shards_launched.wait()
launch = self._ready_state.launch launch = self._ready_state.launch
while True: while True:
# this snippet of code is basically waiting 2 * shard_ids seconds # this snippet of code is basically waiting N seconds
# until the last GUILD_CREATE was sent # until the last GUILD_CREATE was sent
try: try:
await asyncio.wait_for(launch.wait(), timeout=2.0 * len(self.shard_ids)) await asyncio.wait_for(launch.wait(), timeout=self.guild_ready_timeout)
except asyncio.TimeoutError: except asyncio.TimeoutError:
break break
else: else:

Loading…
Cancel
Save