From a2168378897dddbbbdff919dda08a0f658161e11 Mon Sep 17 00:00:00 2001 From: ITOH Date: Fri, 7 Feb 2025 22:20:23 +0100 Subject: [PATCH] fix(cache): update User on MemberUpdate (#2417) Closes: #2416 --- twilight-cache-inmemory/src/event/member.rs | 52 ++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/twilight-cache-inmemory/src/event/member.rs b/twilight-cache-inmemory/src/event/member.rs index af9125acfe5..1379d5f3ffe 100644 --- a/twilight-cache-inmemory/src/event/member.rs +++ b/twilight-cache-inmemory/src/event/member.rs @@ -174,6 +174,7 @@ impl UpdateCache for MemberUpdate { if let Some(mut member) = cache.members.get_mut(&key) { member.update_with_member_update(self); + cache.cache_user(Cow::Borrowed(&self.user), Some(self.guild_id)); } } } @@ -182,7 +183,11 @@ impl UpdateCache for MemberUpdate { mod tests { use crate::{test, DefaultInMemoryCache}; use std::borrow::Cow; - use twilight_model::{gateway::payload::incoming::MemberRemove, id::Id}; + use twilight_model::{ + gateway::payload::incoming::{MemberRemove, MemberUpdate}, + guild::{Member, MemberFlags}, + id::Id, + }; #[test] fn cache_guild_member() { @@ -284,4 +289,49 @@ mod tests { }); assert!(!cache.users.contains_key(&user_id)); } + + #[test] + fn member_update_updates_user() { + let user_id = Id::new(2); + let guild_id = Id::new(3); + let cache = DefaultInMemoryCache::new(); + + let member = Member { + avatar: None, + communication_disabled_until: None, + deaf: false, + flags: MemberFlags::empty(), + joined_at: None, + mute: false, + nick: None, + pending: false, + premium_since: None, + roles: Vec::new(), + user: test::user(user_id), + }; + + cache.cache_member(guild_id, member); + + let mut updated_user = test::user(user_id); + updated_user.name = String::from("updated_username"); + + // Test that a member update also updates the user. + cache.update(&MemberUpdate { + avatar: None, + communication_disabled_until: None, + guild_id, + flags: None, + deaf: None, + joined_at: None, + mute: None, + nick: None, + pending: false, + premium_since: None, + roles: Vec::new(), + user: updated_user.clone(), + }); + + let cached_user = cache.user(user_id).unwrap(); + assert_eq!(cached_user.value(), &updated_user); + } }