diff options
| -rw-r--r-- | src/client/context.rs | 2 | ||||
| -rw-r--r-- | src/client/dispatch.rs | 3 | ||||
| -rw-r--r-- | src/ext/cache/mod.rs | 27 | ||||
| -rw-r--r-- | src/model/id.rs | 4 | ||||
| -rw-r--r-- | src/model/utils.rs | 6 |
5 files changed, 32 insertions, 10 deletions
diff --git a/src/client/context.rs b/src/client/context.rs index 943741b..f420537 100644 --- a/src/client/context.rs +++ b/src/client/context.rs @@ -833,7 +833,7 @@ impl Context { feature_cache_enabled! {{ if let Some(channel) = CACHE.read().unwrap().get_channel(channel_id) { - return Ok(channel.clone()); + return Ok(channel.clone_inner()); } }} diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs index 1332d8e..f15b432 100644 --- a/src/client/dispatch.rs +++ b/src/client/dispatch.rs @@ -257,7 +257,8 @@ fn handle_event(event: Event, feature_cache! {{ let before = CACHE.read() .unwrap() - .get_channel(event.channel.id()); + .get_channel(event.channel.id()) + .map(|x| x.clone_inner()); update!(update_with_channel_update, event); thread::spawn(move || { diff --git a/src/ext/cache/mod.rs b/src/ext/cache/mod.rs index 0552a14..a8d62c9 100644 --- a/src/ext/cache/mod.rs +++ b/src/ext/cache/mod.rs @@ -114,13 +114,21 @@ impl Cache { self.calls.get(&group_id.into()) } - pub fn get_channel<C: Into<ChannelId>>(&self, id: C) -> Option<Channel> { + pub fn get_channel<C: Into<ChannelId>>(&self, id: C) -> Option<ChannelRef> { let id = id.into(); + if let Some(private_channel) = self.private_channels.get(&id) { + return Some(ChannelRef::Private(private_channel)); + } + + if let Some(group) = self.groups.get(&id) { + return Some(ChannelRef::Group(group)); + } + for guild in self.guilds.values() { for channel in guild.channels.values() { if channel.id == id { - return Some(Channel::Guild(channel.clone())); + return Some(ChannelRef::Guild(channel)); } } } @@ -849,16 +857,27 @@ fn update_presence(presences: &mut HashMap<UserId, Presence>, } /// A reference to a private channel, guild's channel, or group. -#[derive(Debug, Clone, Copy)] +#[derive(Clone, Copy, Debug)] pub enum ChannelRef<'a> { /// A group's channel Group(&'a Group), /// A guild channel and its guild - Guild(&'a Guild, &'a GuildChannel), + Guild(&'a GuildChannel), /// A private channel Private(&'a PrivateChannel), } +impl<'a> ChannelRef<'a> { + /// Clones the inner value of the variant. + pub fn clone_inner(&self) -> Channel { + match *self { + ChannelRef::Group(group) => Channel::Group(group.clone()), + ChannelRef::Guild(channel) => Channel::Guild(channel.clone()), + ChannelRef::Private(private) => Channel::Private(private.clone()), + } + } +} + fn opt_modify<T: Clone>(dest: &mut T, src: &Option<T>) { if let Some(val) = src.as_ref() { dest.clone_from(val); diff --git a/src/model/id.rs b/src/model/id.rs index 7cc4f31..cba72ae 100644 --- a/src/model/id.rs +++ b/src/model/id.rs @@ -11,7 +11,7 @@ impl ChannelId { /// Search the cache for the channel with the Id. #[cfg(all(feature = "cache", feature = "methods"))] pub fn find(&self) -> Option<Channel> { - CACHE.read().unwrap().get_channel(*self) + CACHE.read().unwrap().get_channel(*self).map(|x| x.clone_inner()) } /// Search the cache for the channel. If it can't be found, the channel is @@ -20,7 +20,7 @@ impl ChannelId { pub fn get(&self) -> Result<Channel> { feature_cache_enabled! {{ if let Some(channel) = CACHE.read().unwrap().get_channel(*self) { - return Ok(channel.clone()); + return Ok(channel.clone_inner()); } }} diff --git a/src/model/utils.rs b/src/model/utils.rs index 23fdfc5..d4ee1c3 100644 --- a/src/model/utils.rs +++ b/src/model/utils.rs @@ -21,6 +21,8 @@ use ::utils::{decode_array, into_array}; use super::permissions::{self, Permissions}; #[cfg(all(feature = "cache", feature = "methods"))] use ::client::CACHE; +#[cfg(all(feature = "cache", feature = "methods"))] +use ::ext::cache::ChannelRef; #[macro_escape] macro_rules! missing { @@ -284,10 +286,10 @@ pub fn user_has_perms(channel_id: ChannelId, }; let guild_id = match channel { - Channel::Group(_) | Channel::Private(_) => { + ChannelRef::Group(_) | ChannelRef::Private(_) => { return Ok(permissions == permissions::MANAGE_MESSAGES); }, - Channel::Guild(channel) => channel.guild_id, + ChannelRef::Guild(channel) => channel.guild_id, }; let guild = match cache.get_guild(guild_id) { |