twilight_model/gateway/payload/incoming/
member_update.rs

1use 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    /// 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                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}