twilight_model/channel/message/
pins_listing.rs

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