Skip to main content

slack_morphism/models/messages/
mod.rs

1use crate::blocks::*;
2use crate::events::SlackMessageEventType;
3use crate::*;
4use rsb_derive::Builder;
5use rvstruct::ValueStruct;
6use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8
9mod templates;
10
11use crate::SlackFile;
12pub use templates::*;
13
14#[skip_serializing_none]
15#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
16pub struct SlackMessageOrigin {
17    pub ts: SlackTs,
18    pub channel: Option<SlackChannelId>,
19    pub channel_type: Option<SlackChannelType>,
20    pub thread_ts: Option<SlackTs>,
21    pub client_msg_id: Option<SlackClientMessageId>,
22}
23
24#[skip_serializing_none]
25#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
26pub struct SlackMessageMetadata {
27    pub event_type: String,
28    pub event_payload: Option<std::collections::HashMap<String, String>>,
29}
30
31#[skip_serializing_none]
32#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
33pub struct SlackMessageContent {
34    pub text: Option<String>,
35    pub blocks: Option<Vec<SlackBlock>>,
36    pub attachments: Option<Vec<SlackMessageAttachment>>,
37    pub upload: Option<bool>,
38    pub files: Option<Vec<SlackFile>>,
39    pub reactions: Option<Vec<SlackReaction>>,
40    pub metadata: Option<SlackMessageMetadata>,
41}
42
43#[skip_serializing_none]
44#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
45pub struct SlackMessageSender {
46    pub user: Option<SlackUserId>,
47    pub bot_id: Option<SlackBotId>,
48    pub username: Option<String>,
49    pub display_as_bot: Option<bool>,
50    pub user_profile: Option<SlackUserProfile>,
51    pub bot_profile: Option<SlackBotInfo>,
52}
53
54#[skip_serializing_none]
55#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
56pub struct SlackParentMessageParams {
57    pub reply_count: Option<usize>,
58    pub reply_users_count: Option<usize>,
59    pub latest_reply: Option<SlackTs>,
60    pub reply_users: Option<Vec<SlackUserId>>,
61    pub subscribed: Option<bool>,
62    pub last_read: Option<SlackTs>,
63}
64
65#[skip_serializing_none]
66#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
67pub struct SlackMessage {
68    #[serde(flatten)]
69    pub origin: SlackMessageOrigin,
70    #[serde(flatten)]
71    pub content: SlackMessageContent,
72    #[serde(flatten)]
73    pub sender: SlackMessageSender,
74    #[serde(flatten)]
75    pub parent: SlackParentMessageParams,
76}
77
78#[skip_serializing_none]
79#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
80pub struct SlackHistoryMessage {
81    #[serde(flatten)]
82    pub origin: SlackMessageOrigin,
83    #[serde(flatten)]
84    pub content: SlackMessageContent,
85    #[serde(flatten)]
86    pub sender: SlackMessageSender,
87    #[serde(flatten)]
88    pub parent: SlackParentMessageParams,
89    pub subtype: Option<SlackMessageEventType>,
90    pub edited: Option<SlackMessageEdited>,
91}
92
93#[skip_serializing_none]
94#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
95pub struct SlackUpdatedMessage {
96    #[serde(flatten)]
97    pub sender: SlackMessageSender,
98    #[serde(flatten)]
99    pub content: SlackMessageContent,
100    pub edited: Option<SlackMessageEdited>,
101}
102
103#[skip_serializing_none]
104#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
105pub struct SlackMessageEdited {
106    pub user: SlackUserId,
107    pub ts: SlackTs,
108}
109
110#[skip_serializing_none]
111#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
112pub enum SlackMessageResponseType {
113    #[serde(rename = "in_channel")]
114    InChannel,
115    #[serde(rename = "ephemeral")]
116    Ephemeral,
117}
118
119#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
120pub struct SlackMessageAttachmentId(i64);
121
122// This model is not well typed since Slack message attachments are deprecated
123// Please avoid using this if you can
124#[skip_serializing_none]
125#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
126pub struct SlackMessageAttachment {
127    pub id: Option<SlackMessageAttachmentId>,
128    pub color: Option<String>,
129    pub fallback: Option<String>,
130    pub title: Option<String>,
131    pub fields: Option<Vec<SlackMessageAttachmentFieldObject>>,
132    pub mrkdwn_in: Option<Vec<String>>,
133    pub text: Option<String>,
134    pub blocks: Option<Vec<SlackBlock>>,
135}
136
137// This model is not well typed since Slack message attachments are deprecated
138// Please avoid using this if you can
139#[skip_serializing_none]
140#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
141pub struct SlackMessageAttachmentFieldObject {
142    pub title: Option<String>,
143    pub value: Option<String>,
144    pub short: Option<bool>,
145}