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    /// Standard markdown rendered by Slack; not combinable with `text`/`blocks`; ≤ 12 000 chars.
36    /// https://docs.slack.dev/messaging/formatting-message-text#markdown-text
37    ///
38    /// Write-only: Slack never returns it on received messages; it appears in inbound
39    /// message models only because the content struct is shared.
40    pub markdown_text: Option<String>,
41    pub blocks: Option<Vec<SlackBlock>>,
42    pub attachments: Option<Vec<SlackMessageAttachment>>,
43    pub upload: Option<bool>,
44    pub files: Option<Vec<SlackFile>>,
45    pub reactions: Option<Vec<SlackReaction>>,
46    pub metadata: Option<SlackMessageMetadata>,
47}
48
49#[skip_serializing_none]
50#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
51pub struct SlackMessageSender {
52    pub user: Option<SlackUserId>,
53    pub bot_id: Option<SlackBotId>,
54    pub username: Option<String>,
55    pub display_as_bot: Option<bool>,
56    pub user_profile: Option<SlackUserProfile>,
57    pub bot_profile: Option<SlackBotInfo>,
58}
59
60#[skip_serializing_none]
61#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
62pub struct SlackParentMessageParams {
63    pub reply_count: Option<usize>,
64    pub reply_users_count: Option<usize>,
65    pub latest_reply: Option<SlackTs>,
66    pub reply_users: Option<Vec<SlackUserId>>,
67    pub subscribed: Option<bool>,
68    pub last_read: Option<SlackTs>,
69}
70
71#[skip_serializing_none]
72#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
73pub struct SlackMessage {
74    #[serde(flatten)]
75    pub origin: SlackMessageOrigin,
76    #[serde(flatten)]
77    pub content: SlackMessageContent,
78    #[serde(flatten)]
79    pub sender: SlackMessageSender,
80    #[serde(flatten)]
81    pub parent: SlackParentMessageParams,
82}
83
84#[skip_serializing_none]
85#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
86pub struct SlackHistoryMessage {
87    #[serde(flatten)]
88    pub origin: SlackMessageOrigin,
89    #[serde(flatten)]
90    pub content: SlackMessageContent,
91    #[serde(flatten)]
92    pub sender: SlackMessageSender,
93    #[serde(flatten)]
94    pub parent: SlackParentMessageParams,
95    pub subtype: Option<SlackMessageEventType>,
96    pub edited: Option<SlackMessageEdited>,
97}
98
99#[skip_serializing_none]
100#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
101pub struct SlackUpdatedMessage {
102    #[serde(flatten)]
103    pub sender: SlackMessageSender,
104    #[serde(flatten)]
105    pub content: SlackMessageContent,
106    pub edited: Option<SlackMessageEdited>,
107}
108
109#[skip_serializing_none]
110#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
111pub struct SlackMessageEdited {
112    pub user: SlackUserId,
113    pub ts: SlackTs,
114}
115
116#[skip_serializing_none]
117#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
118pub enum SlackMessageResponseType {
119    #[serde(rename = "in_channel")]
120    InChannel,
121    #[serde(rename = "ephemeral")]
122    Ephemeral,
123}
124
125#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
126pub struct SlackMessageAttachmentId(i64);
127
128// This model is not well typed since Slack message attachments are deprecated
129// Please avoid using this if you can
130#[skip_serializing_none]
131#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
132pub struct SlackMessageAttachment {
133    pub id: Option<SlackMessageAttachmentId>,
134    pub color: Option<String>,
135    pub fallback: Option<String>,
136    pub title: Option<String>,
137    pub fields: Option<Vec<SlackMessageAttachmentFieldObject>>,
138    pub mrkdwn_in: Option<Vec<String>>,
139    pub text: Option<String>,
140    pub blocks: Option<Vec<SlackBlock>>,
141}
142
143// This model is not well typed since Slack message attachments are deprecated
144// Please avoid using this if you can
145#[skip_serializing_none]
146#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
147pub struct SlackMessageAttachmentFieldObject {
148    pub title: Option<String>,
149    pub value: Option<String>,
150    pub short: Option<bool>,
151}