diff options
| -rw-r--r-- | src/client/gateway/shard.rs | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/client/gateway/shard.rs b/src/client/gateway/shard.rs index db0095b..2c2361d 100644 --- a/src/client/gateway/shard.rs +++ b/src/client/gateway/shard.rs @@ -275,8 +275,23 @@ impl Shard { Ok(Some((event, None))) }, - Ok(GatewayEvent::Heartbeat(seq)) => { - info!("Received shard heartbeat; seq: {}", seq); + Ok(GatewayEvent::Heartbeat(s)) => { + info!("Received shard heartbeat"); + + // Received seq is off -- attempt to resume. + if s > self.seq + 1 { + info!("Received off sequence (them: {}; us: {}); resuming", + s, + self.seq); + + return if let Some(session_id) = self.session_id.clone() { + self.resume(session_id, receiver) + .map(|(ev, rec)| Some((ev, Some(rec)))) + } else { + self.reconnect(receiver) + .map(|(ev, rec)| Some((ev, Some(rec)))) + }; + } let map = ObjectBuilder::new() .insert("d", Value::Null) @@ -296,7 +311,13 @@ impl Shard { let _ = self.keepalive_channel.send(status); } - Ok(None) + if let Some(session_id) = self.session_id.clone() { + self.resume(session_id, receiver) + .map(|(ev, rec)| Some((ev, Some(rec)))) + } else { + self.reconnect(receiver) + .map(|(ev, rec)| Some((ev, Some(rec)))) + } }, Ok(GatewayEvent::InvalidateSession) => { info!("Received session invalidation; re-identifying"); |