mirror of
				https://github.com/Rapptz/discord.py.git
				synced 2025-10-25 02:23:04 +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:
		| @@ -68,6 +68,16 @@ class Shard: | |||||||
|  |  | ||||||
|         return self._current |         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): | class AutoShardedClient(Client): | ||||||
|     """A client similar to :class:`Client` except it handles the complications |     """A client similar to :class:`Client` except it handles the complications | ||||||
|     of sharding for the user into a more manageable and transparent single |     of sharding for the user into a more manageable and transparent single | ||||||
| @@ -182,8 +192,7 @@ class AutoShardedClient(Client): | |||||||
|     @asyncio.coroutine |     @asyncio.coroutine | ||||||
|     def launch_shard(self, gateway, shard_id): |     def launch_shard(self, gateway, shard_id): | ||||||
|         try: |         try: | ||||||
|             ws = yield from asyncio.wait_for(websockets.connect(gateway, loop=self.loop, klass=DiscordWebSocket), |             ws = yield from asyncio.wait_for(_ensure_coroutine_connect(gateway, self.loop), loop=self.loop, timeout=180.0) | ||||||
|                                              loop=self.loop, timeout=180.0) |  | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             log.info('Failed to connect for shard_id: %s. Retrying...', shard_id) |             log.info('Failed to connect for shard_id: %s. Retrying...', shard_id) | ||||||
|             yield from asyncio.sleep(5.0, loop=self.loop) |             yield from asyncio.sleep(5.0, loop=self.loop) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user