twilight_model/gateway/payload/incoming/
member_update.rs

1use 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    /// Member's guild avatar.
15    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    /// Whether the user has yet to pass the guild's [Membership Screening]
25    /// requirements.
26    ///
27    /// Note: This field is still under refactoring by Discord. For more info,
28    /// check this [issue] and [pull request].
29    ///
30    /// [Membership Screening]: https://support.discord.com/hc/en-us/articles/1500000466882
31    /// [issue]: https://github.com/discord/discord-api-docs/issues/2567
32    /// [pull request]: https://github.com/discord/discord-api-docs/pull/2547
33    #[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}