diff --git a/discord/client.py b/discord/client.py index 8cf5d00bb..758ab2179 100644 --- a/discord/client.py +++ b/discord/client.py @@ -361,17 +361,12 @@ class Client: while not self.is_closed(): try: yield from self.ws.poll_event() - except (ReconnectWebSocket, ResumeWebSocket) as e: - resume = type(e) is ResumeWebSocket - log.info('Got ' + type(e).__name__) - - if not resume: - self._ready.clear() - + except ResumeWebSocket as e: + log.info('Got a request to RESUME the websocket.') self.ws = yield from DiscordWebSocket.from_client(self, shard_id=self.shard_id, session=self.ws.session_id, sequence=self.ws.sequence, - resume=resume) + resume=True) except ConnectionClosed as e: yield from self.close() if e.code != 1000: diff --git a/discord/gateway.py b/discord/gateway.py index 9897ca423..e75370bca 100644 --- a/discord/gateway.py +++ b/discord/gateway.py @@ -41,15 +41,9 @@ import struct log = logging.getLogger(__name__) -__all__ = [ 'ReconnectWebSocket', 'DiscordWebSocket', - 'KeepAliveHandler', 'VoiceKeepAliveHandler', +__all__ = [ 'DiscordWebSocket', 'KeepAliveHandler', 'VoiceKeepAliveHandler', 'DiscordVoiceWebSocket', 'ResumeWebSocket' ] -class ReconnectWebSocket(Exception): - """Signals to handle the RECONNECT opcode.""" - def __init__(self, shard_id): - self.shard_id = shard_id - class ResumeWebSocket(Exception): """Signals to initialise via RESUME opcode instead of IDENTIFY.""" def __init__(self, shard_id): @@ -128,8 +122,8 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol): REQUEST_MEMBERS Send only. Asks for the full member list of a guild. INVALIDATE_SESSION - Receive only. Tells the client to invalidate the session and IDENTIFY - again. + Receive only. Tells the client to optionally invalidate the session + and IDENTIFY again. HELLO Receive only. Tells the client the heartbeat interval. HEARTBEAT_ACK @@ -306,7 +300,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol): # internal exception signalling to reconnect. log.info('Received RECONNECT opcode.') yield from self.close() - raise ReconnectWebSocket(self.shard_id) + raise ResumeWebSocket(self.shard_id) if op == self.HEARTBEAT_ACK: return # disable noisy logging for now @@ -323,12 +317,13 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol): return if op == self.INVALIDATE_SESSION: - self.sequence = None - self.session_id = None if data == True: yield from self.close() raise ResumeWebSocket(self.shard_id) + self.sequence = None + self.session_id = None + log.info('Shard ID %s has either failed a RESUME request or needed to invalidate its session.' % self.shard_id) yield from self.identify() return diff --git a/discord/shard.py b/discord/shard.py index 7bb3a201e..dade454db 100644 --- a/discord/shard.py +++ b/discord/shard.py @@ -54,10 +54,9 @@ class Shard: def poll(self): try: yield from self.ws.poll_event() - except (ReconnectWebSocket, ResumeWebSocket) as e: - resume = type(e) is ResumeWebSocket - log.info('Got ' + type(e).__name__) - self.ws = yield from DiscordWebSocket.from_client(self._client, resume=resume, + except ResumeWebSocket as e: + log.info('Got a request to RESUME the websocket.') + self.ws = yield from DiscordWebSocket.from_client(self._client, resume=True, shard_id=self.id, session=self.ws.session_id, sequence=self.ws.sequence)