aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2018-04-26 21:13:53 -0700
committerZeyla Hellyer <[email protected]>2018-04-26 21:15:17 -0700
commit526c366eb355ff2cdfd5769621448d35926fe123 (patch)
tree3a819dfa35d3807ab52035554a6f4aab5e130e4a
parentFix voice hang on `.stop()` (diff)
downloadserenity-526c366eb355ff2cdfd5769621448d35926fe123.tar.xz
serenity-526c366eb355ff2cdfd5769621448d35926fe123.zip
Fix panics on guild member update dispatches
Fixes panics for Guild Member Update dispatches, a retrieval for the new version of the member sooner and checking that the member exists prior to dispatching. Closes #264.
-rw-r--r--src/client/dispatch.rs22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs
index 9413701..b91b8d7 100644
--- a/src/client/dispatch.rs
+++ b/src/client/dispatch.rs
@@ -1,7 +1,8 @@
use gateway::InterMessage;
use model::{
+ channel::{Channel, Message},
event::Event,
- channel::{Channel, Message}
+ guild::Member,
};
use std::sync::Arc;
use parking_lot::Mutex;
@@ -391,20 +392,21 @@ fn handle_event<H: EventHandler + Send + Sync + 'static>(
},
DispatchEvent::Model(Event::GuildMemberUpdate(mut event)) => {
let _before = update!(event);
+
+ let _after: Option<Member> = feature_cache! {{
+ CACHE.read().member(event.guild_id, event.user.id)
+ } else {
+ None
+ }};
+
let context = context(data, runner_tx, shard_id);
let event_handler = Arc::clone(event_handler);
threadpool.execute(move || {
feature_cache! {{
- // This is safe to unwrap, as the update would have created
- // the member if it did not exist. So, there is be _no_ way
- // that this could fail under any circumstance.
- let after = CACHE.read()
- .member(event.guild_id, event.user.id)
- .unwrap()
- .clone();
-
- event_handler.guild_member_update(context, _before, after);
+ if let Some(after) = _after {
+ event_handler.guild_member_update(context, _before, after);
+ }
} else {
event_handler.guild_member_update(context, event);
}}