aboutsummaryrefslogtreecommitdiff
path: root/src/model/event.rs
diff options
context:
space:
mode:
authorzeyla <[email protected]>2018-07-09 16:08:27 -0700
committerGitHub <[email protected]>2018-07-09 16:08:27 -0700
commite6026308b33c80aa33f0001c89cd271cc5cb6687 (patch)
tree2f8f50244c4d7a1234922fef61a72eb8dddbf4c5 /src/model/event.rs
parentRemove deprecated use of Colour associated methods (diff)
downloadserenity-e6026308b33c80aa33f0001c89cd271cc5cb6687.tar.xz
serenity-e6026308b33c80aa33f0001c89cd271cc5cb6687.zip
Add a message cache API (#345)
This adds an API for message caching. By default this caches 0 messages per channel. This can be customized when instantiating: ```rust use serenity::cache::{Cache, Settings}; let mut settings = Settings::new(); // Cache 10 messages per channel. settings.max_messages(10); let cache = Cache::new_with_settings(settings); ``` After instantiation: ```rust use serenity::cache::Cache; let mut cache = Cache::new(); cache.settings_mut().max_messages(10); ``` And during runtime through the global cache: ```rust use serenity::CACHE; CACHE.write().settings_mut().max_messages(10); ```
Diffstat (limited to 'src/model/event.rs')
-rw-r--r--src/model/event.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/model/event.rs b/src/model/event.rs
index d78e7df..7a7e3de 100644
--- a/src/model/event.rs
+++ b/src/model/event.rs
@@ -153,6 +153,9 @@ impl CacheUpdate for ChannelDeleteEvent {
Channel::Private(_) | Channel::Group(_) => unreachable!(),
};
+ // Remove the cached messages for the channel.
+ cache.messages.remove(&self.channel.id());
+
None
}
}
@@ -400,7 +403,11 @@ impl CacheUpdate for GuildDeleteEvent {
// Remove channel entries for the guild if the guild is found.
cache.guilds.remove(&self.guild.id).map(|guild| {
for channel_id in guild.write().channels.keys() {
+ // Remove the channel from the cache.
cache.channels.remove(channel_id);
+
+ // Remove the channel's cached messages.
+ cache.messages.remove(channel_id);
}
guild
@@ -759,6 +766,40 @@ pub struct MessageCreateEvent {
pub message: Message,
}
+#[cfg(feature = "cache")]
+impl CacheUpdate for MessageCreateEvent {
+ /// The oldest message, if the channel's message cache was already full.
+ type Output = Message;
+
+ fn update(&mut self, cache: &mut Cache) -> Option<Self::Output> {
+ let max = cache.settings().max_messages;
+
+ if max == 0 {
+ return None;
+ }
+
+ let messages = cache.messages
+ .entry(self.message.channel_id)
+ .or_insert_with(Default::default);
+ let queue = cache.message_queue
+ .entry(self.message.channel_id)
+ .or_insert_with(Default::default);
+
+ let mut removed_msg = None;
+
+ if messages.len() == max {
+ if let Some(id) = queue.pop_front() {
+ removed_msg = messages.remove(&id);
+ }
+ }
+
+ queue.push_back(self.message.id);
+ messages.insert(self.message.id, self.message.clone());
+
+ removed_msg
+ }
+}
+
impl<'de> Deserialize<'de> for MessageCreateEvent {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
Ok(Self {
@@ -805,6 +846,46 @@ pub struct MessageUpdateEvent {
pub embeds: Option<Vec<Value>>,
}
+#[cfg(feature = "cache")]
+impl CacheUpdate for MessageUpdateEvent {
+ type Output = ();
+
+ fn update(&mut self, cache: &mut Cache) -> Option<Self::Output> {
+ let messages = cache.messages.get_mut(&self.channel_id)?;
+ let message = messages.get_mut(&self.id)?;
+
+ if let Some(attachments) = self.attachments.clone() {
+ message.attachments = attachments;
+ }
+
+ if let Some(content) = self.content.clone() {
+ message.content = content;
+ }
+
+ if let Some(edited_timestamp) = self.edited_timestamp.clone() {
+ message.edited_timestamp = Some(edited_timestamp);
+ }
+
+ if let Some(mentions) = self.mentions.clone() {
+ message.mentions = mentions;
+ }
+
+ if let Some(mention_everyone) = self.mention_everyone {
+ message.mention_everyone = mention_everyone;
+ }
+
+ if let Some(mention_roles) = self.mention_roles.clone() {
+ message.mention_roles = mention_roles;
+ }
+
+ if let Some(pinned) = self.pinned {
+ message.pinned = pinned;
+ }
+
+ None
+ }
+}
+
#[derive(Clone, Debug, Serialize)]
pub struct PresenceUpdateEvent {
pub guild_id: Option<GuildId>,