aboutsummaryrefslogtreecommitdiff
path: root/src/client/bridge/gateway/shard_runner.rs
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2018-01-01 09:45:52 -0800
committerZeyla Hellyer <[email protected]>2018-01-01 09:45:52 -0800
commitf5a60f387d2278aa3bddac5c0a0ec110fbf5377e (patch)
treea5a73e305c50a3e33ef7e99dab6818fae3bb4a15 /src/client/bridge/gateway/shard_runner.rs
parentDerive Hash, impl Display on ConnectionStage (diff)
downloadserenity-f5a60f387d2278aa3bddac5c0a0ec110fbf5377e.tar.xz
serenity-f5a60f387d2278aa3bddac5c0a0ec110fbf5377e.zip
Expose a method of retrieving shard status/latency
This exposes a method of retrieving a shard's status and latency through the Shard Manager, as part of the existing Shard Runner Info struct. The Shard Runner will update this whenever it notices a change.
Diffstat (limited to 'src/client/bridge/gateway/shard_runner.rs')
-rw-r--r--src/client/bridge/gateway/shard_runner.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/client/bridge/gateway/shard_runner.rs b/src/client/bridge/gateway/shard_runner.rs
index cff8d7e..7c6cf83 100644
--- a/src/client/bridge/gateway/shard_runner.rs
+++ b/src/client/bridge/gateway/shard_runner.rs
@@ -141,8 +141,16 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
}
}
+ let pre = self.shard.stage();
+
let (event, action, successful) = self.recv_event();
+ let post = self.shard.stage();
+
+ if post != pre {
+ self.update_manager();
+ }
+
match action {
Some(ShardAction::Reconnect(ReconnectType::Reidentify)) => {
return self.request_restart()
@@ -249,7 +257,8 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
true
},
- ShardManagerMessage::ShutdownInitiated => {
+ ShardManagerMessage::ShardUpdate { .. }
+ | ShardManagerMessage::ShutdownInitiated => {
// nb: not sent here
true
@@ -411,6 +420,13 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
},
};
+ match event {
+ Ok(GatewayEvent::HeartbeatAck) => {
+ self.update_manager();
+ },
+ _ => {},
+ }
+
let event = match event {
Ok(GatewayEvent::Dispatch(_, event)) => Some(event),
_ => None,
@@ -420,6 +436,8 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
}
fn request_restart(&self) -> Result<()> {
+ self.update_manager();
+
debug!(
"[ShardRunner {:?}] Requesting restart",
self.shard.shard_info(),
@@ -430,4 +448,12 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> {
Ok(())
}
+
+ fn update_manager(&self) {
+ let _ = self.manager_tx.send(ShardManagerMessage::ShardUpdate {
+ id: ShardId(self.shard.shard_info()[0]),
+ latency: self.shard.latency(),
+ stage: self.shard.stage(),
+ });
+ }
}