diff options
| author | Austin Hellyer <[email protected]> | 2016-12-27 12:00:21 -0800 |
|---|---|---|
| committer | Austin Hellyer <[email protected]> | 2016-12-29 11:50:53 -0800 |
| commit | acc315c34b4ff89ab6175d4687164ca04e727b8a (patch) | |
| tree | 109abcc364b9d976e2a6536205a477796afc0557 /src | |
| parent | Heartbeat recv: send null d value (diff) | |
| download | serenity-acc315c34b4ff89ab6175d4687164ca04e727b8a.tar.xz serenity-acc315c34b4ff89ab6175d4687164ca04e727b8a.zip | |
Rework some event handles
Diffstat (limited to 'src')
| -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"); |