tulpje_cache/event/
member.rs

1use twilight_model::gateway::payload::incoming::{
2    MemberAdd, MemberChunk, MemberRemove, MemberUpdate,
3};
4
5use crate::{Cache, Error, UpdateCache};
6
7impl UpdateCache for MemberAdd {
8    async fn update(&self, cache: &Cache) -> Result<(), Error> {
9        if let Some(mut guild) = cache.guilds.get(&self.guild_id).await? {
10            guild.member_count = guild.member_count.map(|count| count.saturating_add(1));
11            cache.guilds.insert(&guild.id, &guild).await?;
12        }
13
14        cache
15            .cache_member(self.guild_id, self.member.clone())
16            .await?;
17
18        Ok(())
19    }
20}
21
22impl UpdateCache for MemberChunk {
23    async fn update(&self, cache: &Cache) -> Result<(), Error> {
24        if !self.members.is_empty() {
25            cache
26                .cache_members(self.guild_id, self.members.clone())
27                .await?;
28        }
29
30        Ok(())
31    }
32}
33
34impl UpdateCache for MemberRemove {
35    async fn update(&self, cache: &Cache) -> Result<(), Error> {
36        if let Some(mut guild) = cache.guilds.get(&self.guild_id).await? {
37            guild.member_count = guild.member_count.map(|count| count.saturating_sub(1));
38            cache.guilds.insert(&guild.id, &guild).await?;
39        }
40
41        cache.members.remove(&(self.guild_id, self.user.id)).await?;
42        cache
43            .guild_members
44            .remove(&self.guild_id, &self.user.id)
45            .await?;
46
47        cache
48            .user_guilds
49            .remove(&self.user.id, &self.guild_id)
50            .await?;
51
52        // user is in no tracked guils, we can remove them from the cache completely
53        if !cache.user_guilds.is_empty(&self.user.id).await? {
54            cache.users.remove(&self.user.id).await?;
55        }
56
57        Ok(())
58    }
59}
60
61impl UpdateCache for MemberUpdate {
62    async fn update(&self, cache: &Cache) -> Result<(), Error> {
63        let key = (self.guild_id, self.user.id);
64        if let Some(mut member) = cache.members.get(&key).await? {
65            member.update_with_member_update(self);
66            cache.members.insert(&key, &member).await?;
67            cache.cache_user(&self.user, Some(self.guild_id)).await?;
68        }
69
70        Ok(())
71    }
72}