twilight_model/gateway/payload/incoming/
member_update.rs1use crate::{
2 guild::MemberFlags,
3 id::{
4 marker::{GuildMarker, RoleMarker},
5 Id,
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 public_flags: None,
72 id: Id::new(424_242),
73 discriminator: 1234,
74 avatar: Some(image_hash::AVATAR),
75 bot: false,
76 email: None,
77 flags: None,
78 global_name: Some("test".to_string()),
79 locale: None,
80 mfa_enabled: None,
81 premium_type: None,
82 system: None,
83 verified: None,
84 },
85 };
86
87 serde_test::assert_tokens(
88 &value,
89 &[
90 Token::Struct {
91 name: "MemberUpdate",
92 len: 12,
93 },
94 Token::Str("avatar"),
95 Token::None,
96 Token::Str("communication_disabled_until"),
97 Token::Some,
98 Token::Str("2022-01-01T09:00:00.000000+00:00"),
99 Token::Str("guild_id"),
100 Token::NewtypeStruct { name: "Id" },
101 Token::Str("1234"),
102 Token::Str("flags"),
103 Token::Some,
104 Token::U64(0),
105 Token::Str("deaf"),
106 Token::Some,
107 Token::Bool(false),
108 Token::Str("joined_at"),
109 Token::Some,
110 Token::Str("2017-02-27T22:21:50.121000+00:00"),
111 Token::Str("mute"),
112 Token::Some,
113 Token::Bool(false),
114 Token::Str("nick"),
115 Token::Some,
116 Token::Str("Twilight"),
117 Token::Str("pending"),
118 Token::Bool(false),
119 Token::Str("premium_since"),
120 Token::None,
121 Token::Str("roles"),
122 Token::Seq { len: Some(0) },
123 Token::SeqEnd,
124 Token::Str("user"),
125 Token::Struct {
126 name: "User",
127 len: 10,
128 },
129 Token::Str("accent_color"),
130 Token::None,
131 Token::Str("avatar"),
132 Token::Some,
133 Token::Str(image_hash::AVATAR_INPUT),
134 Token::Str("avatar_decoration"),
135 Token::None,
136 Token::Str("avatar_decoration_data"),
137 Token::None,
138 Token::Str("banner"),
139 Token::None,
140 Token::Str("bot"),
141 Token::Bool(false),
142 Token::Str("discriminator"),
143 Token::Str("1234"),
144 Token::Str("global_name"),
145 Token::Some,
146 Token::Str("test"),
147 Token::Str("id"),
148 Token::NewtypeStruct { name: "Id" },
149 Token::Str("424242"),
150 Token::Str("username"),
151 Token::Str("Twilight Sparkle"),
152 Token::StructEnd,
153 Token::StructEnd,
154 ],
155 )
156 }
157}