twilight_model/channel/message/
message_pin.rs

1use crate::channel::Message;
2use crate::util::Timestamp;
3use serde::{Deserialize, Serialize};
4
5/// Message Pin object. [docs]
6///
7/// [docs]: https://discord.com/developers/docs/resources/message#message-pin-object
8#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
9pub struct MessagePin {
10    /// When the message was pinned.
11    pub pinned_at: Timestamp,
12    /// The message which was pinned.
13    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}