aboutsummaryrefslogtreecommitdiff
path: root/src/client/dispatch.rs
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/dispatch.rs
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/dispatch.rs')
-rw-r--r--src/client/dispatch.rs100
1 files changed, 57 insertions, 43 deletions
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs
index 01e7c4b..908751b 100644
--- a/src/client/dispatch.rs
+++ b/src/client/dispatch.rs
@@ -2,6 +2,7 @@ use model::event::Event;
use model::channel::{Channel, Message};
use std::sync::Arc;
use parking_lot::Mutex;
+use super::bridge::gateway::event::ClientEvent;
use super::bridge::gateway::ShardClientMessage;
use super::event_handler::EventHandler;
use super::Context;
@@ -45,10 +46,15 @@ fn context(
Context::new(Arc::clone(data), runner_tx.clone(), shard_id)
}
+pub(crate) enum DispatchEvent {
+ Client(ClientEvent),
+ Model(Event),
+}
+
#[cfg(feature = "framework")]
#[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
-pub fn dispatch<H: EventHandler + Send + Sync + 'static>(
- event: Event,
+pub(crate) fn dispatch<H: EventHandler + Send + Sync + 'static>(
+ event: DispatchEvent,
framework: &Arc<Mutex<Option<Box<Framework + Send>>>>,
data: &Arc<Mutex<ShareMap>>,
event_handler: &Arc<H>,
@@ -57,7 +63,7 @@ pub fn dispatch<H: EventHandler + Send + Sync + 'static>(
shard_id: u64,
) {
match event {
- Event::MessageCreate(event) => {
+ DispatchEvent::Model(Event::MessageCreate(event)) => {
let context = context(data, runner_tx, shard_id);
dispatch_message(
context.clone(),
@@ -83,7 +89,7 @@ pub fn dispatch<H: EventHandler + Send + Sync + 'static>(
#[cfg(not(feature = "framework"))]
pub fn dispatch<H: EventHandler + Send + Sync + 'static>(
- event: Event,
+ event: DispatchEvent,
data: &Arc<Mutex<ShareMap>>,
event_handler: &Arc<H>,
runner_tx: &Sender<ShardClientMessage>,
@@ -127,7 +133,7 @@ fn dispatch_message<H>(
#[allow(cyclomatic_complexity, unused_assignments, unused_mut)]
fn handle_event<H: EventHandler + Send + Sync + 'static>(
- event: Event,
+ event: DispatchEvent,
data: &Arc<Mutex<ShareMap>>,
event_handler: &Arc<H>,
runner_tx: &Sender<ShardClientMessage>,
@@ -149,7 +155,15 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
};
match event {
- Event::ChannelCreate(mut event) => {
+ DispatchEvent::Client(ClientEvent::ShardStageUpdate(event)) => {
+ let context = context(data, runner_tx, shard_id);
+ let event_handler = Arc::clone(event_handler);
+
+ threadpool.execute(move || {
+ event_handler.shard_stage_update(context, event);
+ });
+ }
+ DispatchEvent::Model(Event::ChannelCreate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -182,7 +196,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
},
}
},
- Event::ChannelDelete(mut event) => {
+ DispatchEvent::Model(Event::ChannelDelete(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -205,7 +219,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
},
}
},
- Event::ChannelPinsUpdate(mut event) => {
+ DispatchEvent::Model(Event::ChannelPinsUpdate(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -213,7 +227,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.channel_pins_update(context, event);
});
},
- Event::ChannelRecipientAdd(mut event) => {
+ DispatchEvent::Model(Event::ChannelRecipientAdd(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -228,7 +242,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
);
});
},
- Event::ChannelRecipientRemove(mut event) => {
+ DispatchEvent::Model(Event::ChannelRecipientRemove(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -242,7 +256,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
);
});
},
- Event::ChannelUpdate(mut event) => {
+ DispatchEvent::Model(Event::ChannelUpdate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -258,7 +272,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildBanAdd(mut event) => {
+ DispatchEvent::Model(Event::GuildBanAdd(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -266,7 +280,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_ban_addition(context, event.guild_id, event.user);
});
},
- Event::GuildBanRemove(mut event) => {
+ DispatchEvent::Model(Event::GuildBanRemove(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -274,7 +288,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_ban_removal(context, event.guild_id, event.user);
});
},
- Event::GuildCreate(mut event) => {
+ DispatchEvent::Model(Event::GuildCreate(mut event)) => {
#[cfg(feature = "cache")]
let _is_new = {
let cache = CACHE.read();
@@ -317,7 +331,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildDelete(mut event) => {
+ DispatchEvent::Model(Event::GuildDelete(mut event)) => {
let _full = update!(event);
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -330,7 +344,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildEmojisUpdate(mut event) => {
+ DispatchEvent::Model(Event::GuildEmojisUpdate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -340,7 +354,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_emojis_update(context, event.guild_id, event.emojis);
});
},
- Event::GuildIntegrationsUpdate(mut event) => {
+ DispatchEvent::Model(Event::GuildIntegrationsUpdate(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -348,7 +362,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_integrations_update(context, event.guild_id);
});
},
- Event::GuildMemberAdd(mut event) => {
+ DispatchEvent::Model(Event::GuildMemberAdd(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -358,7 +372,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_member_addition(context, event.guild_id, event.member);
});
},
- Event::GuildMemberRemove(mut event) => {
+ DispatchEvent::Model(Event::GuildMemberRemove(mut event)) => {
let _member = update!(event);
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -371,7 +385,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildMemberUpdate(mut event) => {
+ DispatchEvent::Model(Event::GuildMemberUpdate(mut event)) => {
let _before = update!(event);
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -392,7 +406,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildMembersChunk(mut event) => {
+ DispatchEvent::Model(Event::GuildMembersChunk(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -402,7 +416,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_members_chunk(context, event.guild_id, event.members);
});
},
- Event::GuildRoleCreate(mut event) => {
+ DispatchEvent::Model(Event::GuildRoleCreate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -412,7 +426,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_role_create(context, event.guild_id, event.role);
});
},
- Event::GuildRoleDelete(mut event) => {
+ DispatchEvent::Model(Event::GuildRoleDelete(mut event)) => {
let _role = update!(event);
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -425,7 +439,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildRoleUpdate(mut event) => {
+ DispatchEvent::Model(Event::GuildRoleUpdate(mut event)) => {
let _before = update!(event);
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -438,7 +452,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::GuildUnavailable(mut event) => {
+ DispatchEvent::Model(Event::GuildUnavailable(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -448,7 +462,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.guild_unavailable(context, event.guild_id);
});
},
- Event::GuildUpdate(mut event) => {
+ DispatchEvent::Model(Event::GuildUpdate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -468,8 +482,8 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
});
},
// Already handled by the framework check macro
- Event::MessageCreate(_) => {},
- Event::MessageDeleteBulk(mut event) => {
+ DispatchEvent::Model(Event::MessageCreate(_)) => {},
+ DispatchEvent::Model(Event::MessageDeleteBulk(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -477,7 +491,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.message_delete_bulk(context, event.channel_id, event.ids);
});
},
- Event::MessageDelete(mut event) => {
+ DispatchEvent::Model(Event::MessageDelete(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -485,7 +499,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.message_delete(context, event.channel_id, event.message_id);
});
},
- Event::MessageUpdate(mut event) => {
+ DispatchEvent::Model(Event::MessageUpdate(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -493,7 +507,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.message_update(context, event);
});
},
- Event::PresencesReplace(mut event) => {
+ DispatchEvent::Model(Event::PresencesReplace(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -503,7 +517,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.presence_replace(context, event.presences);
});
},
- Event::PresenceUpdate(mut event) => {
+ DispatchEvent::Model(Event::PresenceUpdate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -513,7 +527,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.presence_update(context, event);
});
},
- Event::ReactionAdd(mut event) => {
+ DispatchEvent::Model(Event::ReactionAdd(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -521,7 +535,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.reaction_add(context, event.reaction);
});
},
- Event::ReactionRemove(mut event) => {
+ DispatchEvent::Model(Event::ReactionRemove(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -529,7 +543,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.reaction_remove(context, event.reaction);
});
},
- Event::ReactionRemoveAll(mut event) => {
+ DispatchEvent::Model(Event::ReactionRemoveAll(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -537,7 +551,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.reaction_remove_all(context, event.channel_id, event.message_id);
});
},
- Event::Ready(mut event) => {
+ DispatchEvent::Model(Event::Ready(mut event)) => {
update!(event);
let event_handler = Arc::clone(event_handler);
@@ -563,12 +577,12 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
});
}}
},
- Event::Resumed(mut event) => {
+ DispatchEvent::Model(Event::Resumed(mut event)) => {
let context = context(data, runner_tx, shard_id);
event_handler.resume(context, event);
},
- Event::TypingStart(mut event) => {
+ DispatchEvent::Model(Event::TypingStart(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -576,7 +590,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.typing_start(context, event);
});
},
- Event::Unknown(mut event) => {
+ DispatchEvent::Model(Event::Unknown(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -584,7 +598,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.unknown(context, event.kind, event.value);
});
},
- Event::UserUpdate(mut event) => {
+ DispatchEvent::Model(Event::UserUpdate(mut event)) => {
let _before = update!(event);
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -597,7 +611,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
}}
});
},
- Event::VoiceServerUpdate(mut event) => {
+ DispatchEvent::Model(Event::VoiceServerUpdate(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
@@ -605,7 +619,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.voice_server_update(context, event);
});
},
- Event::VoiceStateUpdate(mut event) => {
+ DispatchEvent::Model(Event::VoiceStateUpdate(mut event)) => {
update!(event);
let context = context(data, runner_tx, shard_id);
@@ -615,7 +629,7 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
event_handler.voice_state_update(context, event.guild_id, event.voice_state);
});
},
- Event::WebhookUpdate(mut event) => {
+ DispatchEvent::Model(Event::WebhookUpdate(mut event)) => {
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);