aboutsummaryrefslogtreecommitdiff
path: root/src/client/dispatch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/dispatch.rs')
-rw-r--r--src/client/dispatch.rs132
1 files changed, 73 insertions, 59 deletions
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs
index 827875e..9545a6f 100644
--- a/src/client/dispatch.rs
+++ b/src/client/dispatch.rs
@@ -1,9 +1,10 @@
use std::sync::Arc;
use parking_lot::Mutex;
+use super::bridge::gateway::ShardClientMessage;
use super::event_handler::EventHandler;
use super::Context;
+use std::sync::mpsc::Sender;
use typemap::ShareMap;
-use gateway::Shard;
use model::event::Event;
use model::{Channel, Message};
@@ -35,19 +36,26 @@ macro_rules! now {
() => (Utc::now().time().second() * 1000)
}
-fn context(conn: Arc<Mutex<Shard>>, data: Arc<Mutex<ShareMap>>) -> Context {
- Context::new(conn, data)
+fn context(
+ data: Arc<Mutex<ShareMap>>,
+ runner_tx: Sender<ShardClientMessage>,
+ shard_id: u64,
+) -> Context {
+ Context::new(data, runner_tx, shard_id)
}
#[cfg(feature = "framework")]
-pub fn dispatch<H: EventHandler + 'static>(event: Event,
- conn: Arc<Mutex<Shard>>,
- framework: Arc<Mutex<Option<Box<Framework + Send>>>>,
- data: Arc<Mutex<ShareMap>>,
- event_handler: Arc<H>) {
+pub fn dispatch<H: EventHandler + 'static>(
+ event: Event,
+ framework: Arc<Mutex<Option<Box<Framework + Send>>>>,
+ data: Arc<Mutex<ShareMap>>,
+ event_handler: Arc<H>,
+ runner_tx: Sender<ShardClientMessage>,
+ shard_id: u64,
+) {
match event {
Event::MessageCreate(event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
dispatch_message(
context.clone(),
event.message.clone(),
@@ -58,21 +66,24 @@ pub fn dispatch<H: EventHandler + 'static>(event: Event,
framework.dispatch(context, event.message);
}
},
- other => handle_event(other, conn, data, event_handler),
+ other => handle_event(other, data, event_handler, runner_tx, shard_id),
}
}
#[cfg(not(feature = "framework"))]
-pub fn dispatch<H: EventHandler + 'static>(event: Event,
- conn: Arc<Mutex<Shard>>,
- data: Arc<Mutex<ShareMap>>,
- event_handler: Arc<H>) {
+pub fn dispatch<H: EventHandler + 'static>(
+ event: Event,
+ data: Arc<Mutex<ShareMap>>,
+ event_handler: Arc<H>,
+ runner_tx: Sender<ShardClientMessage>,
+ shard_id: u64,
+) {
match event {
Event::MessageCreate(event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
dispatch_message(context, event.message, event_handler);
},
- other => handle_event(other, conn, data, event_handler),
+ other => handle_event(other, data, event_handler, runner_tx, shard_id),
}
}
@@ -91,10 +102,13 @@ fn dispatch_message<H>(
}
#[allow(cyclomatic_complexity, unused_assignments, unused_mut)]
-fn handle_event<H: EventHandler + 'static>(event: Event,
- conn: Arc<Mutex<Shard>>,
- data: Arc<Mutex<ShareMap>>,
- event_handler: Arc<H>) {
+fn handle_event<H: EventHandler + 'static>(
+ event: Event,
+ data: Arc<Mutex<ShareMap>>,
+ event_handler: Arc<H>,
+ runner_tx: Sender<ShardClientMessage>,
+ shard_id: u64,
+) {
#[cfg(feature = "cache")]
let mut last_guild_create_time = now!();
@@ -113,7 +127,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelCreate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
// This different channel_create dispatching is only due to the fact that
// each time the bot receives a dm, this event is also fired.
@@ -134,7 +148,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::ChannelDelete(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
match event.channel {
Channel::Private(_) | Channel::Group(_) => {},
@@ -147,28 +161,28 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}
},
Event::ChannelPinsUpdate(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.channel_pins_update(context, event);
},
Event::ChannelRecipientAdd(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.channel_recipient_addition(context, event.channel_id, event.user);
},
Event::ChannelRecipientRemove(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.channel_recipient_removal(context, event.channel_id, event.user);
},
Event::ChannelUpdate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
let before = CACHE.read().channel(event.channel.id());
@@ -178,12 +192,12 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}}
},
Event::GuildBanAdd(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_ban_addition(context, event.guild_id, event.user);
},
Event::GuildBanRemove(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_ban_removal(context, event.guild_id, event.user);
},
@@ -204,7 +218,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
let cache = CACHE.read();
if cache.unavailable_guilds.is_empty() {
- let context = context(Arc::clone(&conn), Arc::clone(&data));
+ let context = context(Arc::clone(&data), runner_tx.clone(), shard_id);
let guild_amount = cache
.guilds
@@ -216,7 +230,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}
}
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
event_handler.guild_create(context, event.guild, _is_new);
@@ -226,7 +240,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildDelete(mut event) => {
let _full = update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
event_handler.guild_delete(context, event.guild, _full);
@@ -237,25 +251,25 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildEmojisUpdate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_emojis_update(context, event.guild_id, event.emojis);
},
Event::GuildIntegrationsUpdate(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_integrations_update(context, event.guild_id);
},
Event::GuildMemberAdd(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_member_addition(context, event.guild_id, event.member);
},
Event::GuildMemberRemove(mut event) => {
let _member = update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
event_handler.guild_member_removal(context, event.guild_id, event.user, _member);
@@ -265,7 +279,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildMemberUpdate(mut event) => {
let _before = update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
// This is safe to unwrap, as the update would have created
@@ -284,20 +298,20 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildMembersChunk(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_members_chunk(context, event.guild_id, event.members);
},
Event::GuildRoleCreate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_role_create(context, event.guild_id, event.role);
},
Event::GuildRoleDelete(mut event) => {
let _role = update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
event_handler.guild_role_delete(context, event.guild_id, event.role_id, _role);
@@ -307,7 +321,7 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
},
Event::GuildRoleUpdate(mut event) => {
let _before = update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
event_handler.guild_role_update(context, event.guild_id, _before, event.role);
@@ -318,14 +332,14 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
Event::GuildUnavailable(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.guild_unavailable(context, event.guild_id);
},
Event::GuildUpdate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
let before = CACHE.read()
@@ -341,46 +355,46 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
// Already handled by the framework check macro
Event::MessageCreate(_) => {},
Event::MessageDeleteBulk(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.message_delete_bulk(context, event.channel_id, event.ids);
},
Event::MessageDelete(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.message_delete(context, event.channel_id, event.message_id);
},
Event::MessageUpdate(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.message_update(context, event);
},
Event::PresencesReplace(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.presence_replace(context, event.presences);
},
Event::PresenceUpdate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.presence_update(context, event);
},
Event::ReactionAdd(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.reaction_add(context, event.reaction);
},
Event::ReactionRemove(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.reaction_remove(context, event.reaction);
},
Event::ReactionRemoveAll(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.reaction_remove_all(context, event.channel_id, event.message_id);
},
@@ -393,35 +407,35 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
let _ = wait_for_guilds()
.map(move |_| {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.ready(context, event.ready);
});
} else {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.ready(context, event.ready);
}
}
},
Event::Resumed(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.resume(context, event);
},
Event::TypingStart(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.typing_start(context, event);
},
Event::Unknown(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.unknown(context, event.kind, event.value);
},
Event::UserUpdate(mut event) => {
let _before = update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
feature_cache! {{
event_handler.user_update(context, _before.unwrap(), event.current_user);
@@ -430,19 +444,19 @@ fn handle_event<H: EventHandler + 'static>(event: Event,
}}
},
Event::VoiceServerUpdate(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.voice_server_update(context, event);
},
Event::VoiceStateUpdate(mut event) => {
update!(event);
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.voice_state_update(context, event.guild_id, event.voice_state);
},
Event::WebhookUpdate(mut event) => {
- let context = context(conn, data);
+ let context = context(data, runner_tx, shard_id);
event_handler.webhook_update(context, event.guild_id, event.channel_id);
},