twilight_model/channel/message/
interaction.rs1use crate::{
2 application::interaction::InteractionType,
3 guild::PartialMember,
4 id::{marker::InteractionMarker, Id},
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::{
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}