aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/context.rs2
-rw-r--r--src/client/dispatch.rs3
-rw-r--r--src/ext/cache/mod.rs27
-rw-r--r--src/model/id.rs4
-rw-r--r--src/model/utils.rs6
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) {