diff options
| author | alex <[email protected]> | 2017-06-28 13:41:52 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-06-28 13:41:52 +0200 |
| commit | 54f82aeacef32914ec66ac22dd8cae53872e15c5 (patch) | |
| tree | b80cc1db5b5c147c88e4c589c5aa0f2192dcd326 /src/client/dispatch.rs | |
| parent | Add an `on_cached` event (#114) (diff) | |
| download | serenity-54f82aeacef32914ec66ac22dd8cae53872e15c5.tar.xz serenity-54f82aeacef32914ec66ac22dd8cae53872e15c5.zip | |
Add reaction actions (#115)
Fixes #87
Diffstat (limited to 'src/client/dispatch.rs')
| -rw-r--r-- | src/client/dispatch.rs | 103 |
1 files changed, 87 insertions, 16 deletions
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs index f617b14..4021838 100644 --- a/src/client/dispatch.rs +++ b/src/client/dispatch.rs @@ -6,11 +6,11 @@ use super::Context; use typemap::ShareMap; use ::gateway::Shard; use ::model::event::Event; -use ::model::{Message, GuildId}; -use chrono::{UTC, Timelike}; +use ::model::{Message, Reaction, GuildId}; +use chrono::{Utc, Timelike}; #[cfg(feature="framework")] -use ::ext::framework::Framework; +use ::ext::framework::{Framework, ReactionAction}; #[cfg(feature="cache")] use super::CACHE; @@ -61,7 +61,7 @@ macro_rules! update { } macro_rules! now { - () => (UTC::now().time().second() * 1000) + () => (Utc::now().time().second() * 1000) } fn context(conn: &Arc<Mutex<Shard>>, @@ -90,6 +90,58 @@ pub fn dispatch(event: Event, dispatch_message(context, event.message, event_store); } }, + Event::ReactionAdd(event) => { + let context = context(conn, data); + let framework = framework.lock().unwrap(); + + if framework.initialized { + dispatch_reaction_add(context.clone(), + event.reaction.clone(), + event_store); + + let res = framework.reaction_actions + .iter() + .find(|&(ra, ..)| { + if let ReactionAction::Add(ref kind) = *ra { + *kind == event.reaction.emoji + } else { + false + } + }); + + if let Some((_, f)) = res { + f(context, event.reaction.message_id, event.reaction.channel_id); + } + } else { + dispatch_reaction_add(context, event.reaction, event_store); + } + }, + Event::ReactionRemove(event) => { + let context = context(conn, data); + let framework = framework.lock().unwrap(); + + if framework.initialized { + dispatch_reaction_remove(context.clone(), + event.reaction.clone(), + event_store); + + let res = framework.reaction_actions + .iter() + .find(|&(ra, _)| { + if let ReactionAction::Remove(ref kind) = *ra { + *kind == event.reaction.emoji + } else { + false + } + }); + + if let Some((_, f)) = res { + f(context, event.reaction.message_id, event.reaction.channel_id); + } + } else { + dispatch_reaction_remove(context, event.reaction, event_store); + } + }, other => handle_event(other, conn, data, event_store), } } @@ -106,6 +158,14 @@ pub fn dispatch(event: Event, event.message, event_store); }, + Event::ReactionAdd(event) => { + let context = context(conn, data); + dispatch_reaction_add(context, event.reaction); + }, + Event::ReactionRemove(event) => { + let context = context(conn, data); + dispatch_reaction_remove(context, event.reaction); + }, other => handle_event(other, conn, data, event_store), } } @@ -126,6 +186,26 @@ fn dispatch_message(context: Context, } } +fn dispatch_reaction_add(context: Context, + reaction: Reaction, + event_store: &Arc<RwLock<EventStore>>) { + if let Some(handler) = handler!(on_reaction_add, event_store) { + thread::spawn(move || { + (handler)(context, reaction); + }); + } +} + +fn dispatch_reaction_remove(context: Context, + reaction: Reaction, + event_store: &Arc<RwLock<EventStore>>) { + if let Some(handler) = handler!(on_reaction_remove, event_store) { + thread::spawn(move || { + (handler)(context, reaction); + }); + } +} + #[allow(cyclomatic_complexity, unused_assignments, unused_mut)] fn handle_event(event: Event, conn: &Arc<Mutex<Shard>>, @@ -457,20 +537,11 @@ fn handle_event(event: Event, thread::spawn(move || (handler)(context, event)); } }, - Event::ReactionAdd(event) => { - if let Some(handler) = handler!(on_reaction_add, event_store) { - let context = context(conn, data); - thread::spawn(move || (handler)(context, event.reaction)); - } - }, - Event::ReactionRemove(event) => { - if let Some(handler) = handler!(on_reaction_remove, event_store) { - let context = context(conn, data); + // Already handled by the framework check macro + Event::ReactionAdd(_) => {}, + Event::ReactionRemove(_) => {}, - thread::spawn(move || (handler)(context, event.reaction)); - } - }, Event::ReactionRemoveAll(event) => { if let Some(handler) = handler!(on_reaction_remove_all, event_store) { let context = context(conn, data); |