traq_bot_http/payloads/
types.rs

1//! イベントペイロード内部で使われる型
2
3use serde::{Deserialize, Serialize};
4
5#[cfg(feature = "chrono")]
6use chrono::{DateTime, Utc};
7
8#[cfg(not(feature = "chrono"))]
9#[cfg(feature = "time")]
10use time::OffsetDateTime;
11
12use crate::macros::payload_impl;
13
14#[cfg(feature = "chrono")]
15/// タイムスタンプ([RFC3339 format](https://tools.ietf.org/html/rfc3339#section-5.6))を表現する型
16///
17/// デフォルトでは[`String`](https://doc.rust-lang.org/stable/alloc/string/struct.String.html)型、
18/// `time` featureで[`time::OffsetDateTime`](https://docs.rs/time/latest/time/struct.OffsetDateTime.html)型になる
19pub type TimeStamp = DateTime<Utc>;
20
21#[cfg(not(feature = "chrono"))]
22#[cfg(feature = "time")]
23/// タイムスタンプ([RFC3339 format](https://tools.ietf.org/html/rfc3339#section-5.6))を表現する型
24///
25/// デフォルトでは[`String`](https://doc.rust-lang.org/stable/alloc/string/struct.String.html)型、
26/// `chrono` featureで[`chrono::DateTime<chrono::Utc>`](https://docs.rs/chrono/latest/chrono/struct.DateTime.html)型になる
27pub type TimeStamp = OffsetDateTime;
28
29#[cfg(not(feature = "chrono"))]
30#[cfg(not(feature = "time"))]
31/// タイムスタンプ([RFC3339 format](https://tools.ietf.org/html/rfc3339#section-5.6))を表現する型
32///
33/// `time` featureで[`time::OffsetDateTime`](https://docs.rs/time/latest/time/struct.OffsetDateTime.html)型、
34/// `chrono` featureで[`chrono::DateTime<chrono::Utc>`](https://docs.rs/chrono/latest/chrono/struct.DateTime.html)型になる
35///
36/// *`chrono` featureが優先
37pub type TimeStamp = String;
38
39#[cfg(feature = "uuid")]
40/// UUIDを表現する型
41///
42/// デフォルトでは[`String`](https://doc.rust-lang.org/stable/alloc/string/struct.String.html)型
43pub type Uuid = uuid::Uuid;
44
45#[cfg(not(feature = "uuid"))]
46/// UUIDを表現する型
47///
48/// `uuid` featureで[`uuid::Uuid`](https://docs.rs/uuid/latest/uuid/struct.Uuid.html)型になる
49pub type Uuid = String;
50
51/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/common.go#L69-L75)
52///
53/// ## Example
54/// ```
55/// # fn main() -> Result<(), serde_json::Error> {
56/// use traq_bot_http::payloads::types::User;
57/// let payload = r##"{
58///     "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
59///     "name": "takashi_trap",
60///     "displayName": "寺田 健二",
61///     "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
62///     "bot": false
63/// }"##;
64/// let payload: User = payload.parse()?;
65/// println!("{payload}");
66/// # Ok(())
67/// # }
68/// ```
69#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
70#[serde(rename_all = "camelCase")]
71pub struct User {
72    pub id: Uuid,
73    pub name: String,
74    pub display_name: String,
75    pub icon_id: Uuid,
76    pub bot: bool,
77}
78
79payload_impl! {User}
80
81/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/common.go#L47-L55)
82///
83/// ## Example
84/// ```
85/// # fn main() -> Result<(), serde_json::Error> {
86/// use traq_bot_http::payloads::types::Channel;
87/// let payload = r##"{
88///     "id": "f86c925c-3002-4ba5-939a-c92344e534f9",
89///     "name": "po",
90///     "path": "#a/po",
91///     "parentId": "ea452867-553b-4808-a14f-a47ee0009ee6",
92///     "creator":{
93///         "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
94///         "name": "takashi_trap",
95///         "displayName": "寺田 健二",
96///         "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
97///         "bot": false
98///     },
99///     "createdAt": "2018-04-25T12:22:02Z",
100///     "updatedAt": "2018-04-25T12:22:02Z"
101/// }"##;
102/// let payload: Channel = payload.parse()?;
103/// println!("{payload}");
104/// # Ok(())
105/// # }
106/// ```
107#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
108#[serde(rename_all = "camelCase")]
109pub struct Channel {
110    pub id: Uuid,
111    pub name: String,
112    pub path: String,
113    pub parent_id: Uuid,
114    pub creator: User,
115    #[serde(with = "crate::payloads::serde::timestamp")]
116    pub created_at: TimeStamp,
117    #[serde(with = "crate::payloads::serde::timestamp")]
118    pub updated_at: TimeStamp,
119}
120
121payload_impl! {Channel}
122
123/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/utils/message/embedded.go#L9-L14)
124///
125/// ## Example
126/// ```
127/// # fn main() -> Result<(), serde_json::Error> {
128/// use traq_bot_http::payloads::types::EmbeddedInfo;
129/// let payload = r##"{
130///     "raw": "@takashi_trap",
131///     "type": "user",
132///     "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
133/// }"##;
134/// let payload: EmbeddedInfo = payload.parse()?;
135/// println!("{payload}");
136/// # Ok(())
137/// # }
138/// ```
139#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
140#[serde(rename_all = "camelCase")]
141pub struct EmbeddedInfo {
142    pub raw: String,
143    pub r#type: String,
144    pub id: Uuid,
145}
146
147payload_impl! {EmbeddedInfo}
148
149/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/common.go#L23-L32)
150///
151/// ## Example
152/// ```
153/// # fn main() -> Result<(), serde_json::Error> {
154/// use traq_bot_http::payloads::types::Message;
155/// let payload = r##"{
156///     "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
157///     "user": {
158///         "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
159///         "name": "takashi_trap",
160///         "displayName": "寺田 健二",
161///         "iconId": "2bc06cda-bdb9-4a68-8000-62f907f36a92",
162///         "bot": false
163///     },
164///     "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e",
165///     "text": "!{\"type\": \"user\", \"raw\": \"@takashi_trap\", \"id\": \"dfdff0c9-5de0-46ee-9721-2525e8bb3d45\"} こんにちは",
166///     "plainText": "@takashi_trap こんにちは",
167///     "embedded": [
168///         {
169///             "raw": "@takashi_trap",
170///             "type": "user",
171///             "id": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45"
172///         }
173///     ],
174///     "createdAt": "2019-05-08T13:33:51.632149265Z",
175///     "updatedAt": "2019-05-08T13:33:51.632149265Z"
176/// }"##;
177/// let payload: Message = payload.parse()?;
178/// println!("{payload}");
179/// # Ok(())
180/// # }
181/// ```
182#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
183#[serde(rename_all = "camelCase")]
184pub struct Message {
185    pub id: Uuid,
186    pub user: User,
187    pub channel_id: Uuid,
188    pub text: String,
189    pub plain_text: String,
190    pub embedded: Vec<EmbeddedInfo>,
191    #[serde(with = "crate::payloads::serde::timestamp")]
192    pub created_at: TimeStamp,
193    #[serde(with = "crate::payloads::serde::timestamp")]
194    pub updated_at: TimeStamp,
195}
196
197payload_impl! {Message}
198
199/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_message_deleted.go#L14-L17)
200///
201/// ### Example
202/// ```
203/// # fn main() -> Result<(), serde_json::Error> {
204/// use traq_bot_http::payloads::types::DeletedMessage;
205/// let payload = r##"{
206///     "id": "bc9106b3-f9b2-4eca-9ba1-72b39b40954e",
207///     "channelId": "9aba50da-f605-4cd0-a428-5e4558cb911e"
208/// }"##;
209/// let payload: DeletedMessage = payload.parse()?;
210/// println!("{payload}");
211/// # Ok(())
212/// # }
213/// ```
214#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
215#[serde(rename_all = "camelCase")]
216pub struct DeletedMessage {
217    pub id: Uuid,
218    pub channel_id: Uuid,
219}
220
221payload_impl! {DeletedMessage}
222
223/// - [traQの型定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/service/bot/event/payload/ev_direct_message_deleted.go#L14-L18)
224///
225/// ## Example
226/// ```
227/// # fn main() -> Result<(), serde_json::Error> {
228/// use traq_bot_http::payloads::types::DeletedDirectMessage;
229/// let payload = r##"{
230///     "id": "2d7ff3f5-c313-4f4a-a9bb-0b5f84d2b6f8",
231///     "userId": "dfdff0c9-5de0-46ee-9721-2525e8bb3d45",
232///     "channelId": "c5a5a697-3bad-4540-b2da-93dc88181d34"
233/// }"##;
234/// let payload: DeletedDirectMessage = payload.parse()?;
235/// println!("{payload}");
236/// # Ok(())
237/// # }
238/// ```
239#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
240#[serde(rename_all = "camelCase")]
241pub struct DeletedDirectMessage {
242    pub id: Uuid,
243    pub user_id: Uuid,
244    pub channel_id: Uuid,
245}
246
247payload_impl! {DeletedDirectMessage}
248
249/// - [traQの定義](https://github.com/traPtitech/traQ/blob/d2bc98f1e0e68f4acc371eb78e6a49a167446761/model/message_stamp.go#L9-L20)
250///
251/// ## Example
252/// ```
253/// # fn main() -> Result<(), serde_json::Error> {
254/// use traq_bot_http::payloads::types::MessageStamp;
255/// let payload = r##"{
256///     "stampId": "b77fad4e-b63f-42a2-916c-5cfe5af3d8b9",
257///     "userId": "b80551a5-2768-4d29-ad78-8e0e92330c8d",
258///     "count": 24,
259///     "createdAt": "2020-10-17T03:34:56.575099Z",
260///     "updatedAt": "2020-10-17T03:35:34Z"
261/// }"##;
262/// let payload: MessageStamp = payload.parse()?;
263/// println!("{payload}");
264/// # Ok(())
265/// # }
266/// ```
267#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
268#[serde(rename_all = "camelCase")]
269pub struct MessageStamp {
270    pub stamp_id: Uuid,
271    pub user_id: Uuid,
272    pub count: i32,
273    #[serde(with = "crate::payloads::serde::timestamp")]
274    pub created_at: TimeStamp,
275    #[serde(with = "crate::payloads::serde::timestamp")]
276    pub updated_at: TimeStamp,
277}
278
279payload_impl! {MessageStamp}
280
281/// [traQの定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/common.go#L92-L95)
282#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
283#[serde(rename_all = "camelCase")]
284pub struct GroupMember {
285    pub group_id: Uuid,
286    pub user_id: Uuid,
287}
288
289payload_impl! {GroupMember}
290
291/// - [traQの定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/common.go#L104)
292///
293/// ## Example
294/// ```
295/// # fn main() -> Result<(), serde_json::Error> {
296/// use traq_bot_http::payloads::types::UserGroupAdmin;
297/// let payload = r#"{
298///     "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
299///     "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
300/// }"#;
301/// let payload: UserGroupAdmin = payload.parse()?;
302/// println!("{payload}");
303/// # Ok(())
304/// # }
305/// ```
306#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
307#[serde(rename_all = "camelCase")]
308pub struct UserGroupAdmin {
309    pub group_id: Uuid,
310    pub user_id: Uuid,
311}
312
313payload_impl! {UserGroupAdmin}
314
315impl From<UserGroupAdmin> for GroupMember {
316    fn from(admin: UserGroupAdmin) -> Self {
317        Self {
318            group_id: admin.group_id,
319            user_id: admin.user_id,
320        }
321    }
322}
323
324impl From<GroupMember> for UserGroupAdmin {
325    fn from(member: GroupMember) -> Self {
326        Self {
327            group_id: member.group_id,
328            user_id: member.user_id,
329        }
330    }
331}
332
333/// - [traQの定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/common.go#L113-L116)
334///
335/// ## Example
336/// ```
337/// # fn main() -> Result<(), serde_json::Error> {
338/// use traq_bot_http::payloads::types::UserGroupMember;
339/// let payload = r##"{
340///     "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
341///     "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b",
342///     "role": ""
343/// }"##;
344/// let payload: UserGroupMember = payload.parse()?;
345/// println!("{payload}");
346/// # Ok(())
347/// # }
348/// ```
349#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
350#[serde(rename_all = "camelCase")]
351pub struct UserGroupMember {
352    pub group_id: Uuid,
353    pub user_id: Uuid,
354    pub role: String,
355}
356
357payload_impl! {UserGroupMember}
358
359/// - [traQの定義](https://github.com/traPtitech/traQ/blob/a1aaf12d089a9033461d0f1fcabb69a92873a3b1/service/bot/event/payload/common.go#L128-L138)
360///
361/// ## Example
362/// ```
363/// # fn main() -> Result<(), serde_json::Error> {
364/// use traq_bot_http::payloads::types::UserGroup;
365/// let payload = r##"{
366///     "id": "f265bde2-04cc-4856-9008-3db1d953a539",
367///     "name": "fugafuga",
368///     "description": "FUGA_FUGA",
369///     "type": "ふがふが",
370///     "icon": "81f6da0d-eaab-4c42-84ac-74f5111e1eaa",
371///     "admins": [
372///         {
373///             "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
374///             "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b"
375///         }
376///     ],
377///     "members": [
378///         {
379///             "groupId": "f265bde2-04cc-4856-9008-3db1d953a539",
380///             "userId": "8e6a088f-9274-42c0-bb20-cee7913d144b",
381///             "role": ""
382///         }
383///     ],
384///     "createdAt": "2023-08-25T04:04:32.912312Z",
385///     "updatedAt": "2023-08-25T04:04:32.912312Z"
386/// }"##;
387/// let payload: UserGroup = payload.parse()?;
388/// println!("{payload}");
389/// # Ok(())
390/// # }
391/// ```
392#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
393#[serde(rename_all = "camelCase")]
394pub struct UserGroup {
395    pub id: Uuid,
396    pub name: String,
397    pub description: String,
398    pub r#type: String,
399    pub icon: Uuid,
400    pub admins: Vec<UserGroupAdmin>,
401    pub members: Vec<UserGroupMember>,
402    #[serde(with = "crate::payloads::serde::timestamp")]
403    pub created_at: TimeStamp,
404    #[serde(with = "crate::payloads::serde::timestamp")]
405    pub updated_at: TimeStamp,
406}
407
408payload_impl! {UserGroup}