aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAustin Hellyer <[email protected]>2016-12-27 12:00:21 -0800
committerAustin Hellyer <[email protected]>2016-12-29 11:50:53 -0800
commitacc315c34b4ff89ab6175d4687164ca04e727b8a (patch)
tree109abcc364b9d976e2a6536205a477796afc0557 /src
parentHeartbeat recv: send null d value (diff)
downloadserenity-acc315c34b4ff89ab6175d4687164ca04e727b8a.tar.xz
serenity-acc315c34b4ff89ab6175d4687164ca04e727b8a.zip
Rework some event handles
Diffstat (limited to 'src')
-rw-r--r--src/client/gateway/shard.rs27
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");