twilight_model/channel/message/
interaction.rs

1use crate::{
2    application::interaction::InteractionType,
3    guild::PartialMember,
4    id::{marker::InteractionMarker, Id},
5    user::User,
6};
7use serde::{Deserialize, Serialize};
8
9/// Associated interaction metadata.
10#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
11pub struct MessageInteraction {
12    /// ID of the interaction.
13    pub id: Id<InteractionMarker>,
14    /// Type of the interaction.
15    #[serde(rename = "type")]
16    pub kind: InteractionType,
17    /// If in a guild, the member who invoked the interaction.
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub member: Option<PartialMember>,
20    /// Name of the [`Command`].
21    ///
22    /// [`Command`]: crate::application::command::Command
23    pub name: String,
24    /// User who invoked the interaction.
25    pub user: User,
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31    use crate::{
32        guild::MemberFlags,
33        test::image_hash,
34        user::{PremiumType, UserFlags},
35        util::Timestamp,
36    };
37    use serde_test::Token;
38    use std::{error::Error, str::FromStr};
39
40    #[allow(clippy::too_many_lines)]
41    #[test]
42    fn message_interaction() -> Result<(), Box<dyn Error>> {
43        let joined_at = Some(Timestamp::from_str("2015-04-26T06:26:56.936000+00:00")?);
44        let flags = MemberFlags::BYPASSES_VERIFICATION | MemberFlags::DID_REJOIN;
45
46        let value = MessageInteraction {
47            id: Id::new(1),
48            kind: InteractionType::ApplicationCommand,
49            member: Some(PartialMember {
50                avatar: None,
51                communication_disabled_until: None,
52                deaf: false,
53                flags,
54                joined_at,
55                mute: true,
56                nick: Some("a nickname".to_owned()),
57                permissions: None,
58                premium_since: None,
59                roles: Vec::from([Id::new(2)]),
60                user: None,
61            }),
62            name: "search".into(),
63            user: User {
64                accent_color: None,
65                avatar: Some(image_hash::AVATAR),
66                avatar_decoration: None,
67                avatar_decoration_data: None,
68                banner: Some(image_hash::BANNER),
69                bot: false,
70                discriminator: 1,
71                email: Some("address@example.com".to_owned()),
72                flags: Some(UserFlags::PREMIUM_EARLY_SUPPORTER | UserFlags::VERIFIED_DEVELOPER),
73                global_name: Some("test".to_owned()),
74                id: Id::new(3),
75                locale: Some("en-us".to_owned()),
76                mfa_enabled: Some(true),
77                name: "test".to_owned(),
78                premium_type: Some(PremiumType::Nitro),
79                public_flags: Some(
80                    UserFlags::PREMIUM_EARLY_SUPPORTER | UserFlags::VERIFIED_DEVELOPER,
81                ),
82                system: None,
83                verified: Some(true),
84            },
85        };
86
87        serde_test::assert_tokens(
88            &value,
89            &[
90                Token::Struct {
91                    name: "MessageInteraction",
92                    len: 5,
93                },
94                Token::Str("id"),
95                Token::NewtypeStruct { name: "Id" },
96                Token::Str("1"),
97                Token::Str("type"),
98                Token::U8(InteractionType::ApplicationCommand as u8),
99                Token::Str("member"),
100                Token::Some,
101                Token::Struct {
102                    name: "PartialMember",
103                    len: 8,
104                },
105                Token::Str("communication_disabled_until"),
106                Token::None,
107                Token::Str("deaf"),
108                Token::Bool(false),
109                Token::Str("flags"),
110                Token::U64(flags.bits()),
111                Token::Str("joined_at"),
112                Token::Some,
113                Token::Str("2015-04-26T06:26:56.936000+00:00"),
114                Token::Str("mute"),
115                Token::Bool(true),
116                Token::Str("nick"),
117                Token::Some,
118                Token::Str("a nickname"),
119                Token::Str("roles"),
120                Token::Seq { len: Some(1) },
121                Token::NewtypeStruct { name: "Id" },
122                Token::Str("2"),
123                Token::SeqEnd,
124                Token::Str("user"),
125                Token::None,
126                Token::StructEnd,
127                Token::Str("name"),
128                Token::Str("search"),
129                Token::Str("user"),
130                Token::Struct {
131                    name: "User",
132                    len: 17,
133                },
134                Token::Str("accent_color"),
135                Token::None,
136                Token::Str("avatar"),
137                Token::Some,
138                Token::Str(image_hash::AVATAR_INPUT),
139                Token::Str("avatar_decoration"),
140                Token::None,
141                Token::Str("avatar_decoration_data"),
142                Token::None,
143                Token::Str("banner"),
144                Token::Some,
145                Token::Str(image_hash::BANNER_INPUT),
146                Token::Str("bot"),
147                Token::Bool(false),
148                Token::Str("discriminator"),
149                Token::Str("0001"),
150                Token::Str("email"),
151                Token::Some,
152                Token::Str("address@example.com"),
153                Token::Str("flags"),
154                Token::Some,
155                Token::U64(131_584),
156                Token::Str("global_name"),
157                Token::Some,
158                Token::Str("test"),
159                Token::Str("id"),
160                Token::NewtypeStruct { name: "Id" },
161                Token::Str("3"),
162                Token::Str("locale"),
163                Token::Some,
164                Token::Str("en-us"),
165                Token::Str("mfa_enabled"),
166                Token::Some,
167                Token::Bool(true),
168                Token::Str("username"),
169                Token::Str("test"),
170                Token::Str("premium_type"),
171                Token::Some,
172                Token::U8(2),
173                Token::Str("public_flags"),
174                Token::Some,
175                Token::U64(131_584),
176                Token::Str("verified"),
177                Token::Some,
178                Token::Bool(true),
179                Token::StructEnd,
180                Token::StructEnd,
181            ],
182        );
183
184        Ok(())
185    }
186}