diff options
| author | zeyla <[email protected]> | 2018-07-09 16:08:27 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-07-09 16:08:27 -0700 |
| commit | e6026308b33c80aa33f0001c89cd271cc5cb6687 (patch) | |
| tree | 2f8f50244c4d7a1234922fef61a72eb8dddbf4c5 /src/model/event.rs | |
| parent | Remove deprecated use of Colour associated methods (diff) | |
| download | serenity-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.rs | 81 |
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>, |