Browse Source

Ensure that keep alive threads are closed when a websocket closes.

The library worked with the assumption that whenever the recv call for
the websocket would lead to a closure, the close method would be called
to signal closure and as a result our close method would be called.

This assumption turned out to be false as the websockets library would
instead call an internal function named close_connection instead. So to
solve our problem we need to override this function instead of close.
pull/297/merge
Rapptz 9 years ago
parent
commit
0b6e74ebec
  1. 9
      discord/gateway.py

9
discord/gateway.py

@ -318,6 +318,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
state.sequence = None
state.session_id = None
if data == True:
yield from self.close()
raise ResumeWebSocket()
yield from self.identify()
@ -459,11 +460,11 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
self._connection._remove_voice_client(guild_id)
@asyncio.coroutine
def close(self, code=1000, reason=''):
def close_connection(self, force=False):
if self._keep_alive:
self._keep_alive.stop()
yield from super().close(code, reason)
yield from super().close_connection(force=force)
class DiscordVoiceWebSocket(websockets.client.WebSocketClientProtocol):
"""Implements the websocket protocol for handling voice connections.
@ -605,10 +606,10 @@ class DiscordVoiceWebSocket(websockets.client.WebSocketClientProtocol):
raise ConnectionClosed(e) from e
@asyncio.coroutine
def close(self, code=1000, reason=''):
def close_connection(self, force=False):
if self._keep_alive:
self._keep_alive.stop()
yield from super().close(code, reason)
yield from super().close_connection(force=force)

Loading…
Cancel
Save