diff options
| author | Rapptz <[email protected]> | 2020-05-24 08:34:35 -0400 |
|---|---|---|
| committer | Rapptz <[email protected]> | 2020-07-25 09:59:40 -0400 |
| commit | d37b91dfc66c14ee29a334337b8cf63f974d6c4a (patch) | |
| tree | a712e7b9019005ec89e09f3b6b5aec80bd9b2748 | |
| parent | Add a timeout for receiving websocket messages. (diff) | |
| download | discord.py-d37b91dfc66c14ee29a334337b8cf63f974d6c4a.tar.xz discord.py-d37b91dfc66c14ee29a334337b8cf63f974d6c4a.zip | |
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
| -rw-r--r-- | discord/client.py | 5 | ||||
| -rw-r--r-- | discord/state.py | 12 |
2 files changed, 13 insertions, 4 deletions
diff --git a/discord/client.py b/discord/client.py index a0e27d8e..b6a54450 100644 --- a/discord/client.py +++ b/discord/client.py @@ -159,6 +159,11 @@ class Client: WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if processing the initial packets take too long to the point of disconnecting 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` Whether to dispatching of presence or typing events. Defaults to ``True``. diff --git a/discord/state.py b/discord/state.py index 10403032..34823845 100644 --- a/discord/state.py +++ b/discord/state.py @@ -80,6 +80,10 @@ class ConnectionState: self._ready_task = None self._fetch_offline = options.get('fetch_offline_members', True) 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) allowed_mentions = options.get('allowed_mentions') @@ -369,10 +373,10 @@ class ConnectionState: # only real bots wait for GUILD_CREATE streaming if self.is_bot: 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 try: - await asyncio.wait_for(launch.wait(), timeout=2.0) + await asyncio.wait_for(launch.wait(), timeout=self.guild_ready_timeout) except asyncio.TimeoutError: break else: @@ -1086,10 +1090,10 @@ class AutoShardedConnectionState(ConnectionState): await self.shards_launched.wait() launch = self._ready_state.launch 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 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: break else: |