traq_bot_http/payloads/message.rs
1//! メッセージ関連のイベントペイロード
2//! ## types
3//! - [`MessageCreatedPayload`](MessageCreatedPayload)
4//! - [`MessageDeletedPayload`](MessageDeletedPayload)
5//! - [`MessageUpdatedPayload`](MessageUpdatedPayload)
6//! - [`DirectMessageCreatedPayload`](DirectMessageCreatedPayload)
7//! - [`DirectMessageDeletedPayload`](DirectMessageDeletedPayload)
8//! - [`DirectMessageUpdatedPayload`](DirectMessageUpdatedPayload)
9//! - [`BotMessageStampsUpdatedPayload`](BotMessageStampsUpdatedPayload)
10
11use serde::{Deserialize, Serialize};
12
13use super::types::{DeletedDirectMessage, DeletedMessage, Message, MessageStamp, TimeStamp, Uuid};
14
15/// `MESSAGE_CREATED`ペイロード
16/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_message_created.go#L10-L14)
17/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#message_created)
18///
19/// ## Example
20/// ```
21/// # fn main() -> Result<(), serde_json::Error> {
22/// use traq_bot_http::payloads::MessageCreatedPayload;
23/// let payload = r##"{
24/// "eventTime": "2019-05-08T13:33:51.690308239Z",
25/// "message": {
26/// "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
27/// "user": {
28/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
29/// "name": "takashi_trap",
30/// "displayName": "寺田 健二",
31/// "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
32/// "bot": false
33/// },
34/// "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e",
35/// "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
36/// "plainText": "@takashi_trap こんにちは",
37/// "embedded": [
38/// {
39/// "raw": "@takashi_trap",
40/// "type": "user",
41/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
42/// }
43/// ],
44/// "createdAt": "2019-05-08T13:33:51.632149265Z",
45/// "updatedAt": "2019-05-08T13:33:51.632149265Z"
46/// }
47/// }"##;
48/// let payload: MessageCreatedPayload = payload.parse()?;
49/// println!("{payload}");
50/// # Ok(())
51/// # }
52/// ```
53#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
54#[serde(rename_all = "camelCase")]
55pub struct MessageCreatedPayload {
56 #[serde(with = "crate::payloads::serde::timestamp")]
57 pub event_time: TimeStamp,
58 pub message: Message,
59}
60
61impl From<DirectMessageCreatedPayload> for MessageCreatedPayload {
62 fn from(payload: DirectMessageCreatedPayload) -> Self {
63 let DirectMessageCreatedPayload {
64 event_time,
65 message,
66 } = payload;
67 Self {
68 event_time,
69 message,
70 }
71 }
72}
73
74/// `MESSAGE_DELETED`ペイロード
75/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_message_deleted.go#L11-L18)
76/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#message_deleted)
77///
78/// ## Example
79/// ```
80/// # fn main() -> Result<(), serde_json::Error> {
81/// use traq_bot_http::payloads::MessageDeletedPayload;
82/// let payload = r##"{
83/// "eventTime": "2019-05-08T13:33:51.690308239Z",
84/// "message": {
85/// "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
86/// "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e"
87/// }
88/// }"##;
89/// let payload = serde_json::from_str::<MessageDeletedPayload>(payload)?;
90/// println!("{payload}");
91/// # Ok(())
92/// # }
93/// ```
94#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
95#[serde(rename_all = "camelCase")]
96pub struct MessageDeletedPayload {
97 #[serde(with = "crate::payloads::serde::timestamp")]
98 pub event_time: TimeStamp,
99 pub message: DeletedMessage,
100}
101
102/// `MESSAGE_UPDATED`ペイロード
103/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_updated.go#L10-L14)
104/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#message_updated)
105///
106/// ## Example
107/// ```
108/// # fn main() -> Result<(), serde_json::Error> {
109/// use traq_bot_http::payloads::MessageUpdatedPayload;
110/// let payload = r##"{
111/// "eventTime": "2019-05-08T13:33:51.690308239Z",
112/// "message": {
113/// "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
114/// "user": {
115/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
116/// "name": "takashi_trap",
117/// "displayName": "寺田 健二",
118/// "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
119/// "bot": false
120/// },
121/// "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e",
122/// "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
123/// "plainText": "@takashi_trap こんにちは",
124/// "embedded": [
125/// {
126/// "raw": "@takashi_trap",
127/// "type": "user",
128/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
129/// }
130/// ],
131/// "createdAt": "2019-05-08T13:33:51.632149265Z",
132/// "updatedAt": "2019-05-08T13:33:51.632149265Z"
133/// }
134/// }"##;
135/// let payload = serde_json::from_str::<MessageUpdatedPayload>(payload)?;
136/// println!("{payload}");
137/// # Ok(())
138/// # }
139/// ```
140#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
141#[serde(rename_all = "camelCase")]
142pub struct MessageUpdatedPayload {
143 #[serde(with = "crate::payloads::serde::timestamp")]
144 pub event_time: TimeStamp,
145 pub message: Message,
146}
147
148impl From<DirectMessageUpdatedPayload> for MessageUpdatedPayload {
149 fn from(payload: DirectMessageUpdatedPayload) -> Self {
150 let DirectMessageUpdatedPayload {
151 event_time,
152 message,
153 } = payload;
154 Self {
155 event_time,
156 message,
157 }
158 }
159}
160
161/// `DIRECT_MESSAGE_CREATED`ペイロード
162/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_created.go#L10-L14)
163/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#direct_message_created)
164///
165/// ## Example
166/// ```
167/// # fn main() -> Result<(), serde_json::Error> {
168/// use traq_bot_http::payloads::DirectMessageCreatedPayload;
169/// let payload = r##"{
170/// "eventTime": "2019-05-08T13:36:09.421492525Z",
171/// "message": {
172/// "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
173/// "user": {
174/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
175/// "name": "takashi_trap",
176/// "displayName": "寺田 健二",
177/// "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
178/// "bot": false
179/// },
180/// "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34",
181/// "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
182/// "plainText": "@takashi_trap こんにちは",
183/// "embedded": [
184/// {
185/// "raw": "@takashi_trap",
186/// "type": "user",
187/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
188/// }
189/// ],
190/// "createdAt": "2019-05-08T13:36:09.365393261Z",
191/// "updatedAt": "2019-05-08T13:36:09.365393261Z"
192/// }
193/// }"##;
194/// let payload = serde_json::from_str::<DirectMessageCreatedPayload>(payload)?;
195/// println!("{payload}");
196/// # Ok(())
197/// # }
198/// ```
199#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
200#[serde(rename_all = "camelCase")]
201pub struct DirectMessageCreatedPayload {
202 #[serde(with = "crate::payloads::serde::timestamp")]
203 pub event_time: TimeStamp,
204 pub message: Message,
205}
206
207impl From<MessageCreatedPayload> for DirectMessageCreatedPayload {
208 fn from(payload: MessageCreatedPayload) -> Self {
209 let MessageCreatedPayload {
210 event_time,
211 message,
212 } = payload;
213 Self {
214 event_time,
215 message,
216 }
217 }
218}
219
220/// `DIRECT_MESSAGE_DELETED`ペイロード
221/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_deleted.go#L11-L19)
222/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#direct_message_deleted)
223///
224/// ## Example
225/// ```
226/// # fn main() -> Result<(), serde_json::Error> {
227/// use traq_bot_http::payloads::DirectMessageDeletedPayload;
228/// let payload = r##"{
229/// "eventTime": "2019-05-08T13:36:09.421492525Z",
230/// "message": {
231/// "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
232/// "userId": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
233/// "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34"
234/// }
235/// }"##;
236/// let payload = serde_json::from_str::<DirectMessageDeletedPayload>(payload)?;
237/// println!("{payload}");
238/// # Ok(())
239/// # }
240/// ```
241#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
242#[serde(rename_all = "camelCase")]
243pub struct DirectMessageDeletedPayload {
244 #[serde(with = "crate::payloads::serde::timestamp")]
245 pub event_time: TimeStamp,
246 pub message: DeletedDirectMessage,
247}
248
249/// `DIRECT_MESSAGE_UPDATED`ペイロード
250/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_updated.go#L10-L14)
251/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#direct_message_updated)
252///
253/// ## Example
254/// ```
255/// # fn main() -> Result<(), serde_json::Error> {
256/// use traq_bot_http::payloads::DirectMessageUpdatedPayload;
257/// let payload = r##"{
258/// "eventTime": "2019-05-08T13:36:09.421492525Z",
259/// "message": {
260/// "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
261/// "user": {
262/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
263/// "name": "takashi_trap",
264/// "displayName": "寺田 健二",
265/// "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
266/// "bot": false
267/// },
268/// "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34",
269/// "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
270/// "plainText": "@takashi_trap こんにちは",
271/// "embedded": [
272/// {
273/// "raw": "@takashi_trap",
274/// "type": "user",
275/// "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
276/// }
277/// ],
278/// "createdAt": "2019-05-08T13:36:09.365393261Z",
279/// "updatedAt": "2019-05-08T13:36:09.365393261Z"
280/// }
281/// }"##;
282/// let payload = serde_json::from_str::<DirectMessageUpdatedPayload>(payload)?;
283/// println!("{payload}");
284/// # Ok(())
285/// # }
286/// ```
287#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
288#[serde(rename_all = "camelCase")]
289pub struct DirectMessageUpdatedPayload {
290 #[serde(with = "crate::payloads::serde::timestamp")]
291 pub event_time: TimeStamp,
292 pub message: Message,
293}
294
295impl From<MessageUpdatedPayload> for DirectMessageUpdatedPayload {
296 fn from(payload: MessageUpdatedPayload) -> Self {
297 let MessageUpdatedPayload {
298 event_time,
299 message,
300 } = payload;
301 Self {
302 event_time,
303 message,
304 }
305 }
306}
307
308/// `BOT_MESSAGE_STAMPS_UPDATED`ペイロード
309/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_bot_message_stamps_updated.go#L11-L16)
310/// - [traQ-bot-consoleのリファレンス](https://github.com/traPtitech/traQ-bot-console/blob/dev/src/docs/bot/events/message.md#bot_message_stamps_updated)
311///
312/// ## Example
313/// ```
314/// # fn main() -> Result<(), serde_json::Error> {
315/// use traq_bot_http::payloads::BotMessageStampsUpdatedPayload;
316/// let payload = r##"{
317/// "eventTime": "2020-10-17T03:35:34.5326265Z",
318/// "messageId": "200b6600-b2cd-4c1e-b366-9c40308cc087",
319/// "stamps": [
320/// {
321/// "stampId": "1cd58034-8998-4b1c-afe4-fcd591354a97",
322/// "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
323/// "count": 22,
324/// "createdAt": "2020-10-17T03:35:17.89545Z",
325/// "updatedAt": "2020-10-17T03:35:34Z"
326/// },
327/// {
328/// "stampId": "6fc62b49-dea0-45b8-8c0c-38035082b111",
329/// "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
330/// "count": 23,
331/// "createdAt": "2020-10-17T03:35:17.737127Z",
332/// "updatedAt": "2020-10-17T03:35:34Z"
333/// },
334/// {
335/// "stampId": "b77fad4e-b63f-42a2-916c-5cfe5af3d8b9",
336/// "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
337/// "count": 24,
338/// "createdAt": "2020-10-17T03:34:56.575099Z",
339/// "updatedAt": "2020-10-17T03:35:34Z"
340/// }
341/// ]
342/// }"##;
343/// let payload = serde_json::from_str::<BotMessageStampsUpdatedPayload>(payload)?;
344/// println!("{payload}");
345/// # Ok(())
346/// # }
347/// ```
348#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
349#[serde(rename_all = "camelCase")]
350pub struct BotMessageStampsUpdatedPayload {
351 #[serde(with = "crate::payloads::serde::timestamp")]
352 pub event_time: TimeStamp,
353 pub message_id: Uuid,
354 pub stamps: Vec<MessageStamp>,
355}
356
357#[cfg(test)]
358mod tests {
359 use super::*;
360 use crate::test_utils::{embedded_takashi_trap, takashi_trap, timestamp, uuid};
361
362 use std::fs::read_to_string;
363
364 #[test]
365 fn message_created_test() {
366 let data = read_to_string("testdata/message/message_created.json").unwrap();
367 let payload: MessageCreatedPayload = data.parse().unwrap();
368 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
369 println!("{pretty_payload}");
370 println!("{payload}");
371 assert_eq!(
372 payload,
373 MessageCreatedPayload {
374 event_time: timestamp("2019-05-08T13:33:51.690308239Z"),
375 message: Message {
376 id: uuid("bc9106b3-f9b2-4eca-9ba1-72b39b40954e"),
377 user: takashi_trap(),
378 channel_id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
379 text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
380 plain_text: "@takashi_trap こんにちは".to_string(),
381 embedded: vec![
382 embedded_takashi_trap(),
383 ],
384 created_at: timestamp("2019-05-08T13:33:51.632149265Z"),
385 updated_at: timestamp("2019-05-08T13:33:51.632149265Z"),
386 },
387 }
388 );
389 }
390
391 #[test]
392 fn message_deleted_test() {
393 let data = read_to_string("testdata/message/message_deleted.json").unwrap();
394 let payload: MessageDeletedPayload = data.parse().unwrap();
395 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
396 println!("{pretty_payload}");
397 println!("{payload}");
398 assert_eq!(
399 payload,
400 MessageDeletedPayload {
401 event_time: timestamp("2019-05-08T13:33:51.690308239Z"),
402 message: DeletedMessage {
403 id: uuid("bc9106b3-f9b2-4eca-9ba1-72b39b40954e"),
404 channel_id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
405 },
406 }
407 );
408 }
409
410 #[test]
411 fn message_updated_test() {
412 let data = read_to_string("testdata/message/message_updated.json").unwrap();
413 let payload: MessageUpdatedPayload = data.parse().unwrap();
414 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
415 println!("{pretty_payload}");
416 println!("{payload}");
417 assert_eq!(
418 payload,
419 MessageUpdatedPayload {
420 event_time: timestamp("2019-05-08T13:33:51.690308239Z"),
421 message: Message {
422 id: uuid("bc9106b3-f9b2-4eca-9ba1-72b39b40954e"),
423 user: takashi_trap(),
424 channel_id: uuid("9aba50da-f605-4cd0-a428-5e4558cb911e"),
425 text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
426 plain_text: "@takashi_trap こんにちは".to_string(),
427 embedded: vec![
428 embedded_takashi_trap(),
429 ],
430 created_at: timestamp("2019-05-08T13:33:51.632149265Z"),
431 updated_at: timestamp("2019-05-08T13:33:51.632149265Z"),
432 }
433 }
434 );
435 }
436
437 #[test]
438 fn direct_message_created_test() {
439 let data = read_to_string("testdata/message/direct_message_created.json").unwrap();
440 let payload: DirectMessageCreatedPayload = data.parse().unwrap();
441 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
442 println!("{pretty_payload}");
443 println!("{payload}");
444 assert_eq!(
445 payload,
446 DirectMessageCreatedPayload {
447 event_time: timestamp("2019-05-08T13:36:09.421492525Z"),
448 message: Message {
449 id: uuid("2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8"),
450 user: takashi_trap(),
451 channel_id: uuid("c5a5a697-3bad-4540-b2da-93dc88181d34"),
452 text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
453 plain_text: "@takashi_trap こんにちは".to_string(),
454 embedded: vec![
455 embedded_takashi_trap(),
456 ],
457 created_at: timestamp("2019-05-08T13:36:09.365393261Z"),
458 updated_at: timestamp("2019-05-08T13:36:09.365393261Z"),
459 },
460 }
461 );
462 }
463
464 #[test]
465 fn direct_message_deleted_test() {
466 let data = read_to_string("testdata/message/direct_message_deleted.json").unwrap();
467 let payload: DirectMessageDeletedPayload = data.parse().unwrap();
468 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
469 println!("{pretty_payload}");
470 println!("{payload}");
471 assert_eq!(
472 payload,
473 DirectMessageDeletedPayload {
474 event_time: timestamp("2019-05-08T13:36:09.421492525Z"),
475 message: DeletedDirectMessage {
476 id: uuid("2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8"),
477 user_id: uuid("dfdff0c9-5de0-46ee-9721-2525e8bb3d45"),
478 channel_id: uuid("c5a5a697-3bad-4540-b2da-93dc88181d34"),
479 }
480 }
481 );
482 }
483
484 #[test]
485 fn direct_message_updated_test() {
486 let data = read_to_string("testdata/message/direct_message_updated.json").unwrap();
487 let payload: DirectMessageUpdatedPayload = data.parse().unwrap();
488 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
489 println!("{pretty_payload}");
490 println!("{payload}");
491 assert_eq!(
492 payload,
493 DirectMessageUpdatedPayload {
494 event_time: timestamp("2019-05-08T13:36:09.421492525Z"),
495 message: Message {
496 id: uuid("2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8"),
497 user: takashi_trap(),
498 channel_id: uuid("c5a5a697-3bad-4540-b2da-93dc88181d34"),
499 text: r#"!{"type": "user", "raw": "@takashi_trap", "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"} こんにちは"#.to_string(),
500 plain_text: "@takashi_trap こんにちは".to_string(),
501 embedded: vec![
502 embedded_takashi_trap(),
503 ],
504 created_at: timestamp("2019-05-08T13:36:09.365393261Z"),
505 updated_at: timestamp("2019-05-08T13:36:09.365393261Z"),
506 },
507 }
508 );
509 }
510
511 #[test]
512 fn bot_message_stamps_updated_test() {
513 let data = read_to_string("testdata/message/bot_message_stamps_updated.json").unwrap();
514 let payload: BotMessageStampsUpdatedPayload = data.parse().unwrap();
515 let pretty_payload = serde_json::to_string_pretty(&payload).unwrap();
516 println!("{pretty_payload}");
517 println!("{payload}");
518 assert_eq!(
519 payload,
520 BotMessageStampsUpdatedPayload {
521 event_time: timestamp("2020-10-17T03:35:34.5326265Z"),
522 message_id: uuid("200b6600-b2cd-4c1e-b366-9c40308cc087"),
523 stamps: vec![
524 MessageStamp {
525 stamp_id: uuid("1cd58034-8998-4b1c-afe4-fcd591354a97"),
526 user_id: uuid("b80551a5-2768-4d29-ad78-8e0e92330c8d"),
527 count: 22,
528 created_at: timestamp("2020-10-17T03:35:17.89545Z"),
529 updated_at: timestamp("2020-10-17T03:35:34Z"),
530 },
531 MessageStamp {
532 stamp_id: uuid("6fc62b49-dea0-45b8-8c0c-38035082b111"),
533 user_id: uuid("b80551a5-2768-4d29-ad78-8e0e92330c8d"),
534 count: 23,
535 created_at: timestamp("2020-10-17T03:35:17.737127Z"),
536 updated_at: timestamp("2020-10-17T03:35:34Z"),
537 },
538 MessageStamp {
539 stamp_id: uuid("b77fad4e-b63f-42a2-916c-5cfe5af3d8b9"),
540 user_id: uuid("b80551a5-2768-4d29-ad78-8e0e92330c8d"),
541 count: 24,
542 created_at: timestamp("2020-10-17T03:34:56.575099Z"),
543 updated_at: timestamp("2020-10-17T03:35:34Z"),
544 },
545 ],
546 }
547 );
548 }
549}