From 25cd85d7047afaa3308d0c3518d577d59006a907 Mon Sep 17 00:00:00 2001 From: Luna Mendes Date: Wed, 12 Sep 2018 20:53:29 -0300 Subject: [PATCH] gateway.websocket: rudimentary resuming --- litecord/gateway/websocket.py | 42 +++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/litecord/gateway/websocket.py b/litecord/gateway/websocket.py index 2068504..27c6638 100644 --- a/litecord/gateway/websocket.py +++ b/litecord/gateway/websocket.py @@ -379,6 +379,45 @@ class GatewayWebsocket: """ pass + async def invalidate_session(self, resumable: bool = False): + """Invalidate the current session and signal that + to the client.""" + await self.send({ + 'op': OP.INVALID_SESSION, + 'd': resumable, + }) + + if not resumable and self.state: + self.state_manager.remove(self.state) + + async def _resume(self, replay_seqs: iter): + presences = [] + + try: + for seq in replay_seqs: + try: + payload = self.state.store[seq] + except KeyError: + # ignore unknown seqs + continue + + payload_t = payload.get('t') + + # presence resumption happens + # on a separate event, PRESENCE_REPLACE. + if payload_t == 'PRESENCE_UPDATE': + presences.append(payload.get('d')) + continue + + await self.send(payload) + except Exception: + log.exception('error while resuming') + await self.invalidate() + return + + if presences: + await self.dispatch('PRESENCE_REPLACE', presences) + async def handle_6(self, payload: Dict[str, Any]): """Handle OP 6 Resume.""" data = payload['d'] @@ -417,8 +456,7 @@ class GatewayWebsocket: self.state = state state.ws = self - # TODO: resend payloads - + await self._resume(range(seq, state.seq)) await self.dispatch('RESUMED', {}) async def _guild_sync(self, guild_id: int):