1use crate::channel::Message;
2use crate::util::Timestamp;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
9pub struct MessagePin {
10 pub pinned_at: Timestamp,
12 pub message: Message,
14}
15
16#[cfg(test)]
17mod tests {
18 use super::MessagePin;
19 use crate::channel::Message;
20 use crate::channel::message::sticker::StickerFormatType;
21 use crate::channel::message::{MessageCall, MessageFlags, MessageSticker, MessageType};
22 use crate::guild::{MemberFlags, PartialMember};
23 use crate::id::Id;
24 use crate::test::image_hash;
25 use crate::user::User;
26 use crate::util::Timestamp;
27 use serde_test::Token;
28 use std::str::FromStr;
29 #[test]
30 #[allow(clippy::too_many_lines, deprecated)]
31 fn message_pin() {
32 let joined_at = Some(Timestamp::from_str("2020-01-01T00:00:00.000000+00:00").unwrap());
33 let timestamp = Timestamp::from_micros(1_580_608_922_020_000).expect("non zero");
34 let flags = MemberFlags::BYPASSES_VERIFICATION | MemberFlags::DID_REJOIN;
35
36 let msg_value = Message {
37 activity: None,
38 application: None,
39 application_id: None,
40 attachments: Vec::new(),
41 author: User {
42 accent_color: None,
43 avatar: Some(image_hash::AVATAR),
44 avatar_decoration: None,
45 avatar_decoration_data: None,
46 banner: None,
47 bot: false,
48 discriminator: 1,
49 email: None,
50 flags: None,
51 global_name: Some("test".to_owned()),
52 id: Id::new(3),
53 locale: None,
54 mfa_enabled: None,
55 name: "test".to_owned(),
56 premium_type: None,
57 primary_guild: None,
58 public_flags: None,
59 system: None,
60 verified: None,
61 },
62 call: Some(MessageCall {
63 ended_timestamp: None,
64 participants: Vec::new(),
65 }),
66 channel_id: Id::new(2),
67 components: Vec::new(),
68 content: "ping".to_owned(),
69 edited_timestamp: None,
70 embeds: Vec::new(),
71 flags: Some(MessageFlags::empty()),
72 guild_id: Some(Id::new(1)),
73 id: Id::new(4),
74 interaction: None,
75 kind: MessageType::Regular,
76 member: Some(PartialMember {
77 avatar: None,
78 avatar_decoration_data: None,
79 banner: None,
80 communication_disabled_until: None,
81 deaf: false,
82 flags,
83 joined_at,
84 mute: false,
85 nick: Some("member nick".to_owned()),
86 permissions: None,
87 premium_since: None,
88 roles: Vec::new(),
89 user: None,
90 }),
91 mention_channels: Vec::new(),
92 mention_everyone: false,
93 mention_roles: Vec::new(),
94 mentions: Vec::new(),
95 message_snapshots: Vec::new(),
96 pinned: false,
97 poll: None,
98 reactions: Vec::new(),
99 reference: None,
100 role_subscription_data: None,
101 sticker_items: vec![MessageSticker {
102 format_type: StickerFormatType::Png,
103 id: Id::new(1),
104 name: "sticker name".to_owned(),
105 }],
106 referenced_message: None,
107 timestamp,
108 thread: None,
109 tts: false,
110 webhook_id: None,
111 interaction_metadata: None,
112 };
113
114 let value = MessagePin {
115 pinned_at: Timestamp::from_secs(1).unwrap(),
116 message: msg_value,
117 };
118
119 serde_test::assert_tokens(
120 &value,
121 &[
122 Token::Struct {
123 name: "MessagePin",
124 len: 2,
125 },
126 Token::Str("pinned_at"),
127 Token::Str("1970-01-01T00:00:01.000000+00:00"),
128 Token::Str("message"),
129 Token::Struct {
130 name: "Message",
131 len: 19,
132 },
133 Token::Str("attachments"),
134 Token::Seq { len: Some(0) },
135 Token::SeqEnd,
136 Token::Str("author"),
137 Token::Struct {
138 name: "User",
139 len: 10,
140 },
141 Token::Str("accent_color"),
142 Token::None,
143 Token::Str("avatar"),
144 Token::Some,
145 Token::Str(image_hash::AVATAR_INPUT),
146 Token::Str("avatar_decoration"),
147 Token::None,
148 Token::Str("avatar_decoration_data"),
149 Token::None,
150 Token::Str("banner"),
151 Token::None,
152 Token::Str("bot"),
153 Token::Bool(false),
154 Token::Str("discriminator"),
155 Token::Str("0001"),
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("username"),
163 Token::Str("test"),
164 Token::StructEnd,
165 Token::Str("call"),
166 Token::Some,
167 Token::Struct {
168 name: "MessageCall",
169 len: 2,
170 },
171 Token::Str("ended_timestamp"),
172 Token::None,
173 Token::Str("participants"),
174 Token::Seq { len: Some(0) },
175 Token::SeqEnd,
176 Token::StructEnd,
177 Token::Str("channel_id"),
178 Token::NewtypeStruct { name: "Id" },
179 Token::Str("2"),
180 Token::Str("content"),
181 Token::Str("ping"),
182 Token::Str("edited_timestamp"),
183 Token::None,
184 Token::Str("embeds"),
185 Token::Seq { len: Some(0) },
186 Token::SeqEnd,
187 Token::Str("flags"),
188 Token::Some,
189 Token::U64(0),
190 Token::Str("guild_id"),
191 Token::Some,
192 Token::NewtypeStruct { name: "Id" },
193 Token::Str("1"),
194 Token::Str("id"),
195 Token::NewtypeStruct { name: "Id" },
196 Token::Str("4"),
197 Token::Str("type"),
198 Token::U8(0),
199 Token::Str("member"),
200 Token::Some,
201 Token::Struct {
202 name: "PartialMember",
203 len: 8,
204 },
205 Token::Str("communication_disabled_until"),
206 Token::None,
207 Token::Str("deaf"),
208 Token::Bool(false),
209 Token::Str("flags"),
210 Token::U64(flags.bits()),
211 Token::Str("joined_at"),
212 Token::Some,
213 Token::Str("2020-01-01T00:00:00.000000+00:00"),
214 Token::Str("mute"),
215 Token::Bool(false),
216 Token::Str("nick"),
217 Token::Some,
218 Token::Str("member nick"),
219 Token::Str("roles"),
220 Token::Seq { len: Some(0) },
221 Token::SeqEnd,
222 Token::Str("user"),
223 Token::None,
224 Token::StructEnd,
225 Token::Str("mention_everyone"),
226 Token::Bool(false),
227 Token::Str("mention_roles"),
228 Token::Seq { len: Some(0) },
229 Token::SeqEnd,
230 Token::Str("mentions"),
231 Token::Seq { len: Some(0) },
232 Token::SeqEnd,
233 Token::Str("pinned"),
234 Token::Bool(false),
235 Token::Str("sticker_items"),
236 Token::Seq { len: Some(1) },
237 Token::Struct {
238 name: "MessageSticker",
239 len: 3,
240 },
241 Token::Str("format_type"),
242 Token::U8(1),
243 Token::Str("id"),
244 Token::NewtypeStruct { name: "Id" },
245 Token::Str("1"),
246 Token::Str("name"),
247 Token::Str("sticker name"),
248 Token::StructEnd,
249 Token::SeqEnd,
250 Token::Str("timestamp"),
251 Token::Str("2020-02-02T02:02:02.020000+00:00"),
252 Token::Str("tts"),
253 Token::Bool(false),
254 Token::StructEnd,
255 Token::StructEnd,
256 ],
257 );
258 }
259}