twilight_model/gateway/payload/incoming/
member_update.rs1use crate::{
2 guild::MemberFlags,
3 id::{
4 Id,
5 marker::{GuildMarker, RoleMarker},
6 },
7 user::User,
8 util::{ImageHash, Timestamp},
9};
10use serde::{Deserialize, Serialize};
11
12#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
13pub struct MemberUpdate {
14 pub avatar: Option<ImageHash>,
16 pub communication_disabled_until: Option<Timestamp>,
17 pub guild_id: Id<GuildMarker>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub flags: Option<MemberFlags>,
20 pub deaf: Option<bool>,
21 pub joined_at: Option<Timestamp>,
22 pub mute: Option<bool>,
23 pub nick: Option<String>,
24 #[serde(default)]
34 pub pending: bool,
35 pub premium_since: Option<Timestamp>,
36 pub roles: Vec<Id<RoleMarker>>,
37 pub user: User,
38}
39
40#[cfg(test)]
41mod tests {
42 use super::MemberUpdate;
43 use crate::{guild::MemberFlags, id::Id, test::image_hash, user::User, util::Timestamp};
44 use serde_test::Token;
45
46 #[test]
47 #[allow(clippy::too_many_lines)]
48 fn member_update() {
49 let joined_at = Some(Timestamp::from_micros(1_488_234_110_121_000).expect("non zero"));
50 let communication_disabled_until =
51 Timestamp::from_micros(1_641_027_600_000_000).expect("non zero");
52
53 let value = MemberUpdate {
54 avatar: None,
55 communication_disabled_until: Some(communication_disabled_until),
56 guild_id: Id::new(1_234),
57 flags: Some(MemberFlags::empty()),
58 deaf: Some(false),
59 joined_at,
60 mute: Some(false),
61 nick: Some("Twilight".to_string()),
62 pending: false,
63 premium_since: None,
64 roles: vec![],
65 user: User {
66 accent_color: None,
67 avatar_decoration: None,
68 avatar_decoration_data: None,
69 banner: None,
70 name: "Twilight Sparkle".to_string(),
71 id: Id::new(424_242),
72 discriminator: 1234,
73 avatar: Some(image_hash::AVATAR),
74 bot: false,
75 email: None,
76 flags: None,
77 global_name: Some("test".to_string()),
78 locale: None,
79 mfa_enabled: None,
80 premium_type: None,
81 primary_guild: None,
82 public_flags: None,
83 system: None,
84 verified: None,
85 },
86 };
87
88 serde_test::assert_tokens(
89 &value,
90 &[
91 Token::Struct {
92 name: "MemberUpdate",
93 len: 12,
94 },
95 Token::Str("avatar"),
96 Token::None,
97 Token::Str("communication_disabled_until"),
98 Token::Some,
99 Token::Str("2022-01-01T09:00:00.000000+00:00"),
100 Token::Str("guild_id"),
101 Token::NewtypeStruct { name: "Id" },
102 Token::Str("1234"),
103 Token::Str("flags"),
104 Token::Some,
105 Token::U64(0),
106 Token::Str("deaf"),
107 Token::Some,
108 Token::Bool(false),
109 Token::Str("joined_at"),
110 Token::Some,
111 Token::Str("2017-02-27T22:21:50.121000+00:00"),
112 Token::Str("mute"),
113 Token::Some,
114 Token::Bool(false),
115 Token::Str("nick"),
116 Token::Some,
117 Token::Str("Twilight"),
118 Token::Str("pending"),
119 Token::Bool(false),
120 Token::Str("premium_since"),
121 Token::None,
122 Token::Str("roles"),
123 Token::Seq { len: Some(0) },
124 Token::SeqEnd,
125 Token::Str("user"),
126 Token::Struct {
127 name: "User",
128 len: 10,
129 },
130 Token::Str("accent_color"),
131 Token::None,
132 Token::Str("avatar"),
133 Token::Some,
134 Token::Str(image_hash::AVATAR_INPUT),
135 Token::Str("avatar_decoration"),
136 Token::None,
137 Token::Str("avatar_decoration_data"),
138 Token::None,
139 Token::Str("banner"),
140 Token::None,
141 Token::Str("bot"),
142 Token::Bool(false),
143 Token::Str("discriminator"),
144 Token::Str("1234"),
145 Token::Str("global_name"),
146 Token::Some,
147 Token::Str("test"),
148 Token::Str("id"),
149 Token::NewtypeStruct { name: "Id" },
150 Token::Str("424242"),
151 Token::Str("username"),
152 Token::Str("Twilight Sparkle"),
153 Token::StructEnd,
154 Token::StructEnd,
155 ],
156 )
157 }
158}