diff options
| author | Zeyla Hellyer <[email protected]> | 2018-01-01 10:08:57 -0800 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2018-01-01 10:08:57 -0800 |
| commit | 7e46d8f3ac5a968df9a05f8f0006522ad14891ef (patch) | |
| tree | 121546831c15f6a7ac5aaca6659cf1ca70602af6 /src/client/bridge | |
| parent | Add a Shard Manager example in examples directory (diff) | |
| download | serenity-7e46d8f3ac5a968df9a05f8f0006522ad14891ef.tar.xz serenity-7e46d8f3ac5a968df9a05f8f0006522ad14891ef.zip | |
Add an event for shard updates
Add an event in the EventHandler to be called when a shard updates its
Connection Stage.
Diffstat (limited to 'src/client/bridge')
| -rw-r--r-- | src/client/bridge/gateway/event.rs | 29 | ||||
| -rw-r--r-- | src/client/bridge/gateway/mod.rs | 2 | ||||
| -rw-r--r-- | src/client/bridge/gateway/shard_runner.rs | 15 |
3 files changed, 43 insertions, 3 deletions
diff --git a/src/client/bridge/gateway/event.rs b/src/client/bridge/gateway/event.rs new file mode 100644 index 0000000..a967ab5 --- /dev/null +++ b/src/client/bridge/gateway/event.rs @@ -0,0 +1,29 @@ +//! A collection of events created by the client, not a part of the Discord API +//! itself. + +use super::ShardId; +use ::gateway::ConnectionStage; + +#[derive(Clone, Debug)] +pub(crate) enum ClientEvent { + ShardStageUpdate(ShardStageUpdateEvent), +} + +/// An event denoting that a shard's connection stage was changed. +/// +/// # Examples +/// +/// This might happen when a shard changes from [`ConnectionStage::Identifying`] +/// to [`ConnectionStage::Connected`]. +/// +/// [`ConnectionStage::Connected`]: ../../../../gateway/enum.ConnectionStage.html#variant.Connected +/// [`ConnectionStage::Identifying`]: ../../../../gateway/enum.ConnectionStage.html#variant.Identifying +#[derive(Clone, Debug)] +pub struct ShardStageUpdateEvent { + /// The new connection stage. + pub new: ConnectionStage, + /// The old connection stage. + pub old: ConnectionStage, + /// The ID of the shard that had its connection stage change. + pub shard_id: ShardId, +} diff --git a/src/client/bridge/gateway/mod.rs b/src/client/bridge/gateway/mod.rs index 5c9ec69..23d2864 100644 --- a/src/client/bridge/gateway/mod.rs +++ b/src/client/bridge/gateway/mod.rs @@ -47,6 +47,8 @@ //! [`ShardQueuer`]: struct.ShardQueuer.html //! [`ShardRunner`]: struct.ShardRunner.html +pub mod event; + mod shard_manager; mod shard_manager_monitor; mod shard_messenger; diff --git a/src/client/bridge/gateway/shard_runner.rs b/src/client/bridge/gateway/shard_runner.rs index 7c6cf83..8781149 100644 --- a/src/client/bridge/gateway/shard_runner.rs +++ b/src/client/bridge/gateway/shard_runner.rs @@ -6,7 +6,9 @@ use parking_lot::Mutex; use serde::Deserialize; use std::sync::mpsc::{self, Receiver, Sender, TryRecvError}; use std::sync::Arc; -use super::super::super::{EventHandler, dispatch}; +use super::super::super::dispatch::{DispatchEvent, dispatch}; +use super::super::super::EventHandler; +use super::event::{ClientEvent, ShardStageUpdateEvent}; use super::{ShardClientMessage, ShardId, ShardManagerMessage, ShardRunnerMessage}; use threadpool::ThreadPool; use typemap::ShareMap; @@ -149,6 +151,13 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> { if post != pre { self.update_manager(); + + let e = ClientEvent::ShardStageUpdate(ShardStageUpdateEvent { + new: post, + old: pre, + shard_id: ShardId(self.shard.shard_info()[0]), + }); + self.dispatch(DispatchEvent::Client(e)); } match action { @@ -162,7 +171,7 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> { } if let Some(event) = event { - self.dispatch(event); + self.dispatch(DispatchEvent::Model(event)); } if !successful && !self.shard.stage().is_connecting() { @@ -222,7 +231,7 @@ impl<H: EventHandler + Send + Sync + 'static> ShardRunner<H> { } #[inline] - fn dispatch(&self, event: Event) { + fn dispatch(&self, event: DispatchEvent) { dispatch( event, #[cfg(feature = "framework")] |