From 526c366eb355ff2cdfd5769621448d35926fe123 Mon Sep 17 00:00:00 2001 From: Zeyla Hellyer Date: Thu, 26 Apr 2018 21:13:53 -0700 Subject: 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. --- src/client/dispatch.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src') 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( }, DispatchEvent::Model(Event::GuildMemberUpdate(mut event)) => { let _before = update!(event); + + let _after: Option = 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); }} -- cgit v1.2.3