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