aboutsummaryrefslogtreecommitdiff
path: root/src/client/bridge
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2018-01-01 10:08:57 -0800
committerZeyla Hellyer <[email protected]>2018-01-01 10:08:57 -0800
commit7e46d8f3ac5a968df9a05f8f0006522ad14891ef (patch)
tree121546831c15f6a7ac5aaca6659cf1ca70602af6 /src/client/bridge
parentAdd a Shard Manager example in examples directory (diff)
downloadserenity-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.rs29
-rw-r--r--src/client/bridge/gateway/mod.rs2
-rw-r--r--src/client/bridge/gateway/shard_runner.rs15
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")]