Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions examples/cache-optimization/models/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub struct MinimalCachedMember {
pub user_id: Id<UserMarker>,
pub roles: Vec<Id<RoleMarker>>,
pub avatar: Option<ImageHash>,
pub banner: Option<ImageHash>,
}

impl From<Member> for MinimalCachedMember {
Expand All @@ -23,6 +24,7 @@ impl From<Member> for MinimalCachedMember {
user_id: member.user.id,
roles: member.roles,
avatar: member.avatar,
banner: member.banner,
}
}
}
Expand All @@ -33,6 +35,7 @@ impl From<(Id<UserMarker>, PartialMember)> for MinimalCachedMember {
user_id,
roles: member.roles,
avatar: member.avatar,
banner: member.banner,
}
}
}
Expand All @@ -43,13 +46,17 @@ impl From<ComputedInteractionMember> for MinimalCachedMember {
user_id: member.user_id,
roles: member.interaction_member.roles,
avatar: member.avatar,
banner: member.banner,
}
}
}

impl PartialEq<Member> for MinimalCachedMember {
fn eq(&self, other: &Member) -> bool {
self.user_id == other.user.id && self.roles == other.roles && self.avatar == other.avatar
self.user_id == other.user.id
&& self.roles == other.roles
&& self.avatar == other.avatar
&& self.banner == other.banner
}
}

Expand All @@ -61,12 +68,13 @@ impl PartialEq<PartialMember> for MinimalCachedMember {
.is_some_and(|user| user.id == self.user_id)
&& self.roles == other.roles
&& self.avatar == other.avatar
&& self.banner == other.banner
}
}

impl PartialEq<InteractionMember> for MinimalCachedMember {
fn eq(&self, other: &InteractionMember) -> bool {
self.roles == other.roles && self.avatar == other.avatar
self.roles == other.roles && self.avatar == other.avatar && self.banner == other.banner
}
}

Expand All @@ -75,6 +83,10 @@ impl CacheableMember for MinimalCachedMember {
self.avatar
}

fn banner(&self) -> Option<ImageHash> {
self.banner
}

fn communication_disabled_until(&self) -> Option<Timestamp> {
None
}
Expand All @@ -95,5 +107,6 @@ impl CacheableMember for MinimalCachedMember {
self.user_id = member_update.user.id;
self.roles.clone_from(&member_update.roles);
self.avatar = member_update.avatar;
self.banner = member_update.banner;
}
}
8 changes: 5 additions & 3 deletions twilight-cache-inmemory/src/event/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ impl<CacheModels: CacheableModels> InMemoryCache<CacheModels> {
) {
let id = (guild_id, user_id);

let (avatar, deaf, mute) = match self.members.get(&id) {
let (avatar, banner, deaf, mute) = match self.members.get(&id) {
Some(m) if &*m == member => return,
Some(m) => (m.avatar(), m.deaf(), m.mute()),
None => (None, None, None),
Some(m) => (m.avatar(), m.banner(), m.deaf(), m.mute()),
None => (None, None, None, None),
};

self.guild_members
Expand All @@ -90,6 +90,7 @@ impl<CacheModels: CacheableModels> InMemoryCache<CacheModels> {

let cached = CacheModels::Member::from(ComputedInteractionMember {
avatar,
banner,
deaf,
interaction_member: member.clone(),
mute,
Expand Down Expand Up @@ -324,6 +325,7 @@ mod tests {
// Test that a member update also updates the user.
cache.update(&MemberUpdate {
avatar: None,
banner: None,
communication_disabled_until: None,
guild_id,
flags: None,
Expand Down
16 changes: 15 additions & 1 deletion twilight-cache-inmemory/src/model/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ use twilight_model::{
pub struct ComputedInteractionMember {
/// Member's guild avatar.
pub avatar: Option<ImageHash>,
/// Member's guild banner.
pub banner: Option<ImageHash>,
/// Whether the member is deafened in a voice channel.
pub deaf: Option<bool>,
/// Member that performed the interaction.
Expand Down Expand Up @@ -64,6 +66,11 @@ impl CachedMember {
self.avatar
}

/// Member's guild banner.
pub const fn banner(&self) -> Option<ImageHash> {
self.banner
}

/// When the user can resume communication in a guild again.
///
/// Checking if this value is [`Some`] is not enough to know if a used is currently
Expand Down Expand Up @@ -166,6 +173,7 @@ impl From<ComputedInteractionMember> for CachedMember {
fn from(member: ComputedInteractionMember) -> Self {
let ComputedInteractionMember {
avatar,
banner,
deaf,
mute,
user_id,
Expand All @@ -174,7 +182,7 @@ impl From<ComputedInteractionMember> for CachedMember {
let InteractionMember {
avatar: _,
avatar_decoration_data,
banner,
banner: _,
communication_disabled_until,
flags,
joined_at,
Expand Down Expand Up @@ -242,6 +250,7 @@ impl From<(Id<UserMarker>, PartialMember)> for CachedMember {
impl PartialEq<Member> for CachedMember {
fn eq(&self, other: &Member) -> bool {
self.avatar == other.avatar
&& self.banner == other.banner
&& self.communication_disabled_until == other.communication_disabled_until
&& self.deaf == Some(other.deaf)
&& self.joined_at == other.joined_at
Expand Down Expand Up @@ -289,6 +298,10 @@ impl CacheableMember for CachedMember {
self.avatar
}

fn banner(&self) -> Option<ImageHash> {
self.banner
}

fn deaf(&self) -> Option<bool> {
self.deaf
}
Expand All @@ -299,6 +312,7 @@ impl CacheableMember for CachedMember {

fn update_with_member_update(&mut self, member_update: &MemberUpdate) {
self.avatar = member_update.avatar;
self.banner = member_update.banner;
self.deaf = member_update.deaf.or_else(|| self.deaf());
self.mute = member_update.mute.or_else(|| self.mute());
self.nick.clone_from(&member_update.nick);
Expand Down
2 changes: 2 additions & 0 deletions twilight-cache-inmemory/src/permission.rs
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,7 @@ mod tests {
});
cache.update(&MemberUpdate {
avatar: None,
banner: None,
communication_disabled_until: None,
guild_id: GUILD_ID,
deaf: None,
Expand Down Expand Up @@ -1120,6 +1121,7 @@ mod tests {
));
cache.update(&MemberUpdate {
avatar: None,
banner: None,
communication_disabled_until: Some(in_past),
guild_id: GUILD_ID,
deaf: None,
Expand Down
3 changes: 3 additions & 0 deletions twilight-cache-inmemory/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ pub trait CacheableMember:
/// Avatar of this member.
fn avatar(&self) -> Option<ImageHash>;

/// Banner of this member.
fn banner(&self) -> Option<ImageHash>;

/// Whether this member is deafened.
fn deaf(&self) -> Option<bool>;

Expand Down
5 changes: 3 additions & 2 deletions twilight-model/src/application/interaction/resolved.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ mod tests {
avatar: Some(image_hash::AVATAR),
avatar_decoration: None,
avatar_decoration_data: None,
banner: None,
banner: Some(image_hash::BANNER),
bot: false,
discriminator: 1,
email: None,
Expand Down Expand Up @@ -430,7 +430,8 @@ mod tests {
Token::Str("avatar_decoration_data"),
Token::None,
Token::Str("banner"),
Token::None,
Token::Some,
Token::Str(image_hash::BANNER_INPUT),
Token::Str("bot"),
Token::Bool(false),
Token::Str("discriminator"),
Expand Down
12 changes: 10 additions & 2 deletions twilight-model/src/channel/message/mention.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ use serde::{Deserialize, Serialize};
pub struct Mention {
/// Hash of the user's avatar, if any.
pub avatar: Option<ImageHash>,
/// Hash of the user's banner, if any.
pub banner: Option<ImageHash>,
/// Whether the user is a bot.
#[serde(default)]
pub bot: bool,
Expand Down Expand Up @@ -59,6 +61,7 @@ mod tests {
fn mention_without_member() {
let value = Mention {
avatar: None,
banner: None,
bot: false,
discriminator: 1,
id: Id::new(1),
Expand All @@ -72,10 +75,12 @@ mod tests {
&[
Token::Struct {
name: "Mention",
len: 6,
len: 7,
},
Token::Str("avatar"),
Token::None,
Token::Str("banner"),
Token::None,
Token::Str("bot"),
Token::Bool(false),
Token::Str("discriminator"),
Expand All @@ -99,6 +104,7 @@ mod tests {

let value = Mention {
avatar: None,
banner: None,
bot: false,
discriminator: 1,
id: Id::new(1),
Expand Down Expand Up @@ -126,10 +132,12 @@ mod tests {
&[
Token::Struct {
name: "Mention",
len: 7,
len: 8,
},
Token::Str("avatar"),
Token::None,
Token::Str("banner"),
Token::None,
Token::Str("bot"),
Token::Bool(false),
Token::Str("discriminator"),
Expand Down
8 changes: 7 additions & 1 deletion twilight-model/src/gateway/payload/incoming/invite_create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ pub struct InviteCreate {
pub struct PartialUser {
/// Hash of the user's avatar.
pub avatar: Option<ImageHash>,
/// Hash of the user's banner.
pub banner: Option<ImageHash>,
/// Discriminator used to differentiate people with the same [`username`].
///
/// [`username`]: Self::username
Expand Down Expand Up @@ -180,6 +182,7 @@ mod tests {
fn partial_user() {
let value = PartialUser {
avatar: Some(image_hash::AVATAR),
banner: Some(image_hash::BANNER),
discriminator: 123,
id: Id::new(1),
username: "twilight".to_owned(),
Expand All @@ -190,11 +193,14 @@ mod tests {
&[
Token::Struct {
name: "PartialUser",
len: 4,
len: 5,
},
Token::Str("avatar"),
Token::Some,
Token::Str(image_hash::AVATAR_INPUT),
Token::Str("banner"),
Token::Some,
Token::Str(image_hash::BANNER_INPUT),
Token::Str("discriminator"),
Token::Str("0123"),
Token::Str("id"),
Expand Down
7 changes: 6 additions & 1 deletion twilight-model/src/gateway/payload/incoming/member_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ use serde::{Deserialize, Serialize};
pub struct MemberUpdate {
/// Member's guild avatar.
pub avatar: Option<ImageHash>,
/// Member's guild banner.
pub banner: Option<ImageHash>,
pub communication_disabled_until: Option<Timestamp>,
pub guild_id: Id<GuildMarker>,
#[serde(skip_serializing_if = "Option::is_none")]
Expand Down Expand Up @@ -52,6 +54,7 @@ mod tests {

let value = MemberUpdate {
avatar: None,
banner: None,
communication_disabled_until: Some(communication_disabled_until),
guild_id: Id::new(1_234),
flags: Some(MemberFlags::empty()),
Expand Down Expand Up @@ -90,10 +93,12 @@ mod tests {
&[
Token::Struct {
name: "MemberUpdate",
len: 12,
len: 13,
},
Token::Str("avatar"),
Token::None,
Token::Str("banner"),
Token::None,
Token::Str("communication_disabled_until"),
Token::Some,
Token::Str("2022-01-01T09:00:00.000000+00:00"),
Expand Down
14 changes: 10 additions & 4 deletions twilight-model/src/guild/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ mod tests {
let value = Member {
avatar: Some(image_hash::AVATAR),
avatar_decoration_data: None,
banner: None,
banner: Some(image_hash::BANNER),
communication_disabled_until: None,
deaf: false,
flags,
Expand Down Expand Up @@ -104,11 +104,14 @@ mod tests {
&[
Token::Struct {
name: "Member",
len: 11,
len: 12,
},
Token::Str("avatar"),
Token::Some,
Token::Str(image_hash::AVATAR_INPUT),
Token::Str("banner"),
Token::Some,
Token::Str(image_hash::BANNER_INPUT),
Token::Str("communication_disabled_until"),
Token::None,
Token::Str("deaf"),
Expand Down Expand Up @@ -177,7 +180,7 @@ mod tests {
let value = Member {
avatar: Some(image_hash::AVATAR),
avatar_decoration_data: None,
banner: None,
banner: Some(image_hash::BANNER),
communication_disabled_until: Some(communication_disabled_until),
deaf: false,
flags,
Expand Down Expand Up @@ -215,11 +218,14 @@ mod tests {
&[
Token::Struct {
name: "Member",
len: 11,
len: 12,
},
Token::Str("avatar"),
Token::Some,
Token::Str(image_hash::AVATAR_INPUT),
Token::Str("banner"),
Token::Some,
Token::Str(image_hash::BANNER_INPUT),
Token::Str("communication_disabled_until"),
Token::Some,
Token::Str("2021-12-23T14:29:19.046000+00:00"),
Expand Down
1 change: 1 addition & 0 deletions twilight-model/src/guild/partial_member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub struct PartialMember {
pub avatar: Option<ImageHash>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_decoration_data: Option<AvatarDecorationData>,
/// Member's guild banner.
#[serde(skip_serializing_if = "Option::is_none")]
pub banner: Option<ImageHash>,
pub communication_disabled_until: Option<Timestamp>,
Expand Down
Loading
Loading