aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoracdenisSK <[email protected]>2017-09-11 16:03:13 +0200
committeracdenisSK <[email protected]>2017-09-11 16:03:29 +0200
commit97e84fe136c5649ca3529c11790d9988dfe3bb92 (patch)
treec37c0e988d6e2495cb3ff56333c1a140a3421e8a /src
parentFixed admin bypass perm to framework allowed_roles (diff)
downloadserenity-97e84fe136c5649ca3529c11790d9988dfe3bb92.tar.xz
serenity-97e84fe136c5649ca3529c11790d9988dfe3bb92.zip
Add `Context::handle`
Diffstat (limited to 'src')
-rw-r--r--src/client/context.rs6
-rw-r--r--src/client/dispatch.rs86
2 files changed, 48 insertions, 44 deletions
diff --git a/src/client/context.rs b/src/client/context.rs
index 1bd5ed7..3802134 100644
--- a/src/client/context.rs
+++ b/src/client/context.rs
@@ -3,6 +3,7 @@ use typemap::ShareMap;
use gateway::Shard;
use model::*;
use parking_lot::Mutex;
+use tokio_core::reactor::Handle;
#[cfg(feature = "cache")]
use super::CACHE;
@@ -40,14 +41,17 @@ pub struct Context {
/// Note that if you are sharding, in relevant terms, this is the shard
/// which received the event being dispatched.
pub shard: Arc<Mutex<Shard>>,
+ /// A tokio handle for spawning efficient tasks inside commands and events.
+ pub handle: Handle,
}
impl Context {
/// Create a new Context to be passed to an event handler.
- pub(crate) fn new(shard: Arc<Mutex<Shard>>, data: Arc<Mutex<ShareMap>>) -> Context {
+ pub(crate) fn new(shard: Arc<Mutex<Shard>>, data: Arc<Mutex<ShareMap>>, handle: Handle) -> Context {
Context {
data,
shard,
+ handle,
}
}
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs
index 428c11e..f6d9dd3 100644
--- a/src/client/dispatch.rs
+++ b/src/client/dispatch.rs
@@ -42,8 +42,8 @@ macro_rules! now {
() => (Utc::now().time().second() * 1000)
}
-fn context(conn: &Arc<Mutex<Shard>>, data: &Arc<Mutex<ShareMap>>) -> Context {
- Context::new(conn.clone(), data.clone())
+fn context(conn: &Arc<Mutex<Shard>>, data: &Arc<Mutex<ShareMap>>, handle: &Handle) -> Context {
+ Context::new(conn.clone(), data.clone(), handle.clone())
}
#[cfg(feature = "standard_framework")]
@@ -65,7 +65,7 @@ pub fn dispatch<H: EventHandler + 'static>(event: Event,
tokio_handle: &Handle) {
match event {
Event::MessageCreate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
dispatch_message(
context.clone(),
event.message.clone(),
@@ -95,7 +95,7 @@ pub fn dispatch<H: EventHandler + 'static>(event: Event,
tokio_handle: &Handle) {
match event {
Event::MessageCreate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
dispatch_message(context, event.message, event_handler, tokio_handle);
},
other => handle_event(other, conn, data, event_handler, tokio_handle),
@@ -144,7 +144,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelCreate(event) => {
update!(update_with_channel_create, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
// This different channel_create dispacthing is only due to the fact that
// each time the bot receives a dm, this event is also fired.
@@ -175,7 +175,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelDelete(event) => {
update!(update_with_channel_delete, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
match event.channel {
Channel::Private(_) |
@@ -197,7 +197,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}
},
Event::ChannelPinsUpdate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -208,7 +208,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelRecipientAdd(mut event) => {
update!(update_with_channel_recipient_add, @event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -223,7 +223,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelRecipientRemove(event) => {
update!(update_with_channel_recipient_remove, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -238,7 +238,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelUpdate(event) => {
update!(update_with_channel_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -255,7 +255,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}}
},
Event::GuildBanAdd(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -264,7 +264,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::GuildBanRemove(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -291,7 +291,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
if cache.unavailable_guilds.is_empty() {
let h = event_handler.clone();
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let guild_amount = cache
.guilds
@@ -306,7 +306,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}
}
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -323,7 +323,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildDelete(event) => {
let _full = update!(update_with_guild_delete, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -341,7 +341,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildEmojisUpdate(event) => {
update!(update_with_guild_emojis_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -354,7 +354,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::GuildIntegrationsUpdate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -365,7 +365,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildMemberAdd(mut event) => {
update!(update_with_guild_member_add, @event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -379,7 +379,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildMemberRemove(event) => {
let _member = update!(update_with_guild_member_remove, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -396,7 +396,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildMemberUpdate(event) => {
let _before = update!(update_with_guild_member_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {
@@ -425,7 +425,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildMembersChunk(event) => {
update!(update_with_guild_members_chunk, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -440,7 +440,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildRoleCreate(event) => {
update!(update_with_guild_role_create, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -450,7 +450,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildRoleDelete(event) => {
let _role = update!(update_with_guild_role_delete, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -467,7 +467,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildRoleUpdate(event) => {
let _before = update!(update_with_guild_role_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -485,7 +485,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildUnavailable(event) => {
update!(update_with_guild_unavailable, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -496,7 +496,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildUpdate(event) => {
update!(update_with_guild_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {
@@ -522,7 +522,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
// Already handled by the framework check macro
Event::MessageCreate(_) => {},
Event::MessageDeleteBulk(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -535,7 +535,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::MessageDelete(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -548,7 +548,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::MessageUpdate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -559,7 +559,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::PresencesReplace(event) => {
update!(update_with_presences_replace, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -570,7 +570,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::PresenceUpdate(mut event) => {
update!(update_with_presence_update, @event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -580,7 +580,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::ReactionAdd(event) => {
let h = event_handler.clone();
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
tokio_handle.spawn_fn(move || {
h.on_reaction_add(context, event.reaction);
Ok(())
@@ -588,14 +588,14 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::ReactionRemove(event) => {
let h = event_handler.clone();
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
tokio_handle.spawn_fn(move || {
h.on_reaction_remove(context, event.reaction);
Ok(())
});
},
Event::ReactionRemoveAll(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -616,7 +616,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
let _ = wait_for_guilds()
.map(|_| {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -625,7 +625,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
});
} else {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -636,7 +636,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}
},
Event::Resumed(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -645,7 +645,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::TypingStart(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -654,7 +654,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::Unknown(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -664,7 +664,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::UserUpdate(event) => {
let _before = update!(update_with_user_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
feature_cache! {{
@@ -680,7 +680,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}}
},
Event::VoiceServerUpdate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -691,7 +691,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::VoiceStateUpdate(event) => {
update!(update_with_voice_state_update, event);
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {
@@ -704,7 +704,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
});
},
Event::WebhookUpdate(event) => {
- let context = context(conn, data);
+ let context = context(conn, data, tokio_handle);
let h = event_handler.clone();
tokio_handle.spawn_fn(move || {