mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-04-19 15:36:02 +00:00
Make sure that websockets.connect is a coroutine.
In 3.5.0 and 3.5.1 asyncio.ensure_future requires a Future or a coroutine otherwise a TypeError is raised. The issue is that the websockets.connect call is an awaitable rather than a coroutine. asyncio.ensure_future did not gain support for awaitables until 3.5.2. This patch allows 3.5.0 and 3.5.1 to connect regardless of their python version.
This commit is contained in:
parent
8081a654e8
commit
e557f69c83
@ -68,6 +68,16 @@ class Shard:
|
||||
|
||||
return self._current
|
||||
|
||||
@asyncio.coroutine
|
||||
def _ensure_coroutine_connect(gateway, loop):
|
||||
# In 3.5+ websockets.connect does not return a coroutine, but an awaitable.
|
||||
# The problem is that in 3.5.0 and in some cases 3.5.1, asyncio.ensure_future and
|
||||
# by proxy, asyncio.wait_for, do not accept awaitables, but rather futures or coroutines.
|
||||
# By wrapping it up into this function we ensure that it's in a coroutine and not an awaitable
|
||||
# even for 3.5.0 users.
|
||||
ws = yield from websockets.connect(gateway, loop=loop, klass=DiscordWebSocket)
|
||||
return ws
|
||||
|
||||
class AutoShardedClient(Client):
|
||||
"""A client similar to :class:`Client` except it handles the complications
|
||||
of sharding for the user into a more manageable and transparent single
|
||||
@ -182,8 +192,7 @@ class AutoShardedClient(Client):
|
||||
@asyncio.coroutine
|
||||
def launch_shard(self, gateway, shard_id):
|
||||
try:
|
||||
ws = yield from asyncio.wait_for(websockets.connect(gateway, loop=self.loop, klass=DiscordWebSocket),
|
||||
loop=self.loop, timeout=180.0)
|
||||
ws = yield from asyncio.wait_for(_ensure_coroutine_connect(gateway, self.loop), loop=self.loop, timeout=180.0)
|
||||
except Exception as e:
|
||||
log.info('Failed to connect for shard_id: %s. Retrying...', shard_id)
|
||||
yield from asyncio.sleep(5.0, loop=self.loop)
|
||||
|
Loading…
x
Reference in New Issue
Block a user