tulpje_cache/event/
message.rs1use 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 !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}