tulpje_cache/event/
interaction.rs

1use twilight_model::{
2    application::interaction::InteractionData, gateway::payload::incoming::InteractionCreate,
3};
4
5use crate::{Error, UpdateCache};
6
7impl UpdateCache for InteractionCreate {
8    async fn update(&self, cache: &crate::Cache) -> Result<(), Error> {
9        // Cache interaction member
10        if let Some(member) = &self.member
11            && let Some(guild_id) = self.guild_id
12            && let Some(user) = &member.user
13        {
14            cache.cache_user(user, self.guild_id).await?;
15
16            cache
17                .cache_borrowed_partial_member(guild_id, member, user.id)
18                .await?;
19        }
20
21        // Cache interaction user
22        if let Some(user) = &self.user {
23            cache.cache_user(user, None).await?;
24        }
25
26        // Cache resolved interaction data
27        if let Some(InteractionData::ApplicationCommand(data)) = &self.data
28            && let Some(resolved) = &data.resolved
29        {
30            // Cache resolved users and members
31            for user in resolved.users.values() {
32                cache.cache_user(user, self.guild_id).await?;
33
34                // member should always match, because resolved members
35                // are guaranteed to have a matching resolved user
36                if let Some(guild_id) = self.guild_id
37                    && let Some(member) = resolved.members.get(&user.id)
38                {
39                    cache
40                        .cache_borrowed_interaction_member(guild_id, member, user.id)
41                        .await?;
42                }
43            }
44
45            // Cache resolved roles
46            if let Some(guild_id) = self.guild_id {
47                cache
48                    .cache_roles(guild_id, resolved.roles.values().cloned())
49                    .await?;
50            }
51        }
52
53        Ok(())
54    }
55}