tulpje_cache/event/
message.rs

1use twilight_model::gateway::payload::incoming::{
2    MessageCreate, MessageDelete, MessageDeleteBulk, MessageUpdate,
3};
4
5use crate::{Cache, Error, UpdateCache, models::message::CachedMessage};
6
7impl UpdateCache for MessageCreate {
8    async fn update(&self, cache: &Cache) -> Result<(), Error> {
9        cache.cache_user(&self.author, self.guild_id).await?;
10
11        if let (Some(member), Some(guild_id)) = (&self.member, self.guild_id) {
12            cache
13                .cache_borrowed_partial_member(guild_id, member, self.author.id)
14                .await?;
15        }
16
17        let mut channel_messages = cache
18            .channel_messages
19            .get(&self.channel_id)
20            .await?
21            .unwrap_or_default();
22
23        if channel_messages.len() >= cache.config.message_cache_size
24            && let Some(popped_id) = channel_messages.pop_back()
25        {
26            cache.messages.remove(&popped_id).await?;
27        }
28        channel_messages.push_front(self.id);
29
30        cache
31            .channel_messages
32            .insert(&self.channel_id, &channel_messages)
33            .await?;
34        cache
35            .messages
36            .insert(&self.id, &CachedMessage::from(self.0.clone()))
37            .await?;
38
39        Ok(())
40    }
41}
42
43impl UpdateCache for MessageDelete {
44    async fn update(&self, cache: &Cache) -> Result<(), Error> {
45        cache.messages.remove(&self.id).await?;
46
47        let mut channel_messages = cache
48            .channel_messages
49            .get(&self.channel_id)
50            .await?
51            .unwrap_or_default();
52
53        if let Some(idx) = channel_messages.iter().position(|id| *id == self.id) {
54            channel_messages.remove(idx);
55            cache
56                .channel_messages
57                .insert(&self.channel_id, &channel_messages)
58                .await?;
59        }
60
61        Ok(())
62    }
63}
64
65impl UpdateCache for MessageDeleteBulk {
66    async fn update(&self, cache: &Cache) -> Result<(), Error> {
67        let mut channel_messages = cache
68            .channel_messages
69            .get(&self.channel_id)
70            .await?
71            .unwrap_or_default();
72
73        cache.messages.remove_multi(&self.ids).await?;
74        for id in &self.ids {
75            if let Some(idx) = channel_messages
76                .iter()
77                .position(|message_id| message_id == id)
78            {
79                channel_messages.remove(idx);
80            }
81        }
82
83        cache
84            .channel_messages
85            .insert(&self.channel_id, &channel_messages)
86            .await?;
87
88        Ok(())
89    }
90}
91
92impl UpdateCache for MessageUpdate {
93    async fn update(&self, cache: &Cache) -> Result<(), Error> {
94        cache.cache_user(&self.author, self.guild_id).await?;
95
96        if let (Some(member), Some(guild_id)) = (&self.member, self.guild_id) {
97            cache
98                .cache_borrowed_partial_member(guild_id, member, self.author.id)
99                .await?;
100        }
101
102        // if the message was still in the cache, there's nothing to do after
103        // updating it
104        if !cache
105            .messages
106            .insert(&self.id, &CachedMessage::from(self.0.clone()))
107            .await?
108        {
109            return Ok(());
110        }
111
112        let mut channel_messages = cache
113            .channel_messages
114            .get(&self.channel_id)
115            .await?
116            .unwrap_or_default();
117
118        if channel_messages.len() >= cache.config.message_cache_size
119            && let Some(popped_id) = channel_messages.pop_back()
120        {
121            cache.messages.remove(&popped_id).await?;
122        }
123        channel_messages.push_front(self.id);
124
125        cache
126            .channel_messages
127            .insert(&self.channel_id, &channel_messages)
128            .await?;
129
130        Ok(())
131    }
132}