Skip to main content

slack_morphism/models/events/
interaction.rs

1use rsb_derive::Builder;
2use serde::{Deserialize, Serialize};
3use serde_with::{serde_as, skip_serializing_none};
4
5use crate::blocks::*;
6use crate::models::messages::*;
7use crate::*;
8use std::collections::HashMap;
9
10#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
11#[serde(tag = "type")]
12pub enum SlackInteractionEvent {
13    #[serde(rename = "block_actions")]
14    BlockActions(SlackInteractionBlockActionsEvent),
15    #[serde(rename = "block_suggestion")]
16    BlockSuggestion(SlackInteractionBlockSuggestionEvent),
17    #[serde(rename = "dialog_submission")]
18    DialogSubmission(SlackInteractionDialogueSubmissionEvent),
19    #[serde(rename = "message_action")]
20    MessageAction(SlackInteractionMessageActionEvent),
21    #[serde(rename = "shortcut")]
22    Shortcut(SlackInteractionShortcutEvent),
23    #[serde(rename = "view_submission")]
24    ViewSubmission(SlackInteractionViewSubmissionEvent),
25    #[serde(rename = "view_closed")]
26    ViewClosed(SlackInteractionViewClosedEvent),
27}
28
29#[skip_serializing_none]
30#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
31pub struct SlackInteractionBlockActionsEvent {
32    pub team: SlackBasicTeamInfo,
33    pub user: Option<SlackBasicUserInfo>,
34    pub api_app_id: SlackAppId,
35    pub container: SlackInteractionActionContainer,
36    pub trigger_id: SlackTriggerId,
37    pub channel: Option<SlackBasicChannelInfo>,
38    pub message: Option<SlackHistoryMessage>,
39    pub view: Option<SlackView>,
40    pub response_url: Option<SlackResponseUrl>,
41    pub actions: Option<Vec<SlackInteractionActionInfo>>,
42    pub state: Option<SlackActionState>,
43}
44
45#[skip_serializing_none]
46#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
47pub struct SlackInteractionBlockSuggestionEvent {
48    pub team: SlackBasicTeamInfo,
49    pub user: SlackBasicUserInfo,
50    pub api_app_id: SlackAppId,
51    pub block_id: SlackBlockId,
52    pub action_id: SlackActionId,
53    pub container: SlackInteractionActionContainer,
54    pub view: Option<SlackView>,
55    pub value: String,
56    pub message: Option<SlackHistoryMessage>,
57}
58
59#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
60#[serde(tag = "type")]
61pub enum SlackInteractionActionContainer {
62    #[serde(rename = "message")]
63    Message(SlackInteractionActionMessageContainer),
64    #[serde(rename = "message_attachment")]
65    MessageAttachment(SlackInteractionActionMessageAttachmentContainer),
66    #[serde(rename = "view")]
67    View(SlackInteractionActionViewContainer),
68}
69
70#[skip_serializing_none]
71#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
72pub struct SlackInteractionActionMessageContainer {
73    pub message_ts: SlackTs,
74    pub channel_id: Option<SlackChannelId>,
75    pub is_ephemeral: Option<bool>,
76    pub is_app_unfurl: Option<bool>,
77}
78
79#[skip_serializing_none]
80#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
81pub struct SlackInteractionActionMessageAttachmentContainer {
82    pub message_ts: SlackTs,
83    pub attachment_id: SlackMessageAttachmentId,
84    pub channel_id: Option<SlackChannelId>,
85    pub is_ephemeral: Option<bool>,
86    pub is_app_unfurl: Option<bool>,
87}
88
89#[skip_serializing_none]
90#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
91pub struct SlackInteractionActionViewContainer {
92    pub view_id: SlackViewId,
93}
94
95#[skip_serializing_none]
96#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
97pub struct SlackInteractionActionInfo {
98    #[serde(rename = "type")]
99    pub action_type: SlackActionType,
100    pub action_id: SlackActionId,
101    pub block_id: Option<SlackBlockId>,
102    pub text: Option<SlackBlockText>,
103    pub value: Option<String>,
104    pub selected_option: Option<SlackBlockChoiceItem<SlackBlockText>>,
105    pub action_ts: Option<SlackTs>,
106}
107
108#[serde_as]
109#[skip_serializing_none]
110#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
111pub struct SlackInteractionDialogueSubmissionEvent {
112    pub team: SlackBasicTeamInfo,
113    pub user: SlackBasicUserInfo,
114    pub channel: Option<SlackBasicChannelInfo>,
115    #[serde(default)]
116    #[serde_as(as = "serde_with::NoneAsEmptyString")]
117    pub callback_id: Option<SlackCallbackId>,
118    pub state: Option<String>,
119    pub submission: HashMap<String, String>,
120}
121
122#[skip_serializing_none]
123#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
124pub struct SlackInteractionMessageActionEvent {
125    pub team: SlackBasicTeamInfo,
126    pub user: SlackBasicUserInfo,
127    pub channel: Option<SlackBasicChannelInfo>,
128    pub message: Option<SlackHistoryMessage>,
129    pub callback_id: SlackCallbackId,
130    pub trigger_id: SlackTriggerId,
131    pub response_url: SlackResponseUrl,
132    pub actions: Option<Vec<SlackInteractionActionInfo>>,
133}
134
135#[skip_serializing_none]
136#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
137pub struct SlackInteractionShortcutEvent {
138    pub team: SlackBasicTeamInfo,
139    pub user: SlackBasicUserInfo,
140    pub callback_id: SlackCallbackId,
141    pub trigger_id: SlackTriggerId,
142    pub actions: Option<Vec<SlackInteractionActionInfo>>,
143}
144
145#[skip_serializing_none]
146#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
147pub struct SlackInteractionViewSubmissionEvent {
148    pub team: SlackBasicTeamInfo,
149    pub user: SlackBasicUserInfo,
150    pub view: SlackStatefulView,
151    pub trigger_id: Option<SlackTriggerId>,
152}
153
154#[skip_serializing_none]
155#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
156pub struct SlackInteractionViewClosedEvent {
157    pub team: SlackBasicTeamInfo,
158    pub user: SlackBasicUserInfo,
159    pub view: SlackStatefulView,
160    pub trigger_id: Option<SlackTriggerId>,
161}
162
163#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
164#[serde(untagged)]
165pub enum SlackBlockSuggestionResponse {
166    Options(SlackBlockSuggestionOptions),
167    OptionGroups(SlackBlockSuggestionOptionGroups),
168}
169
170#[skip_serializing_none]
171#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
172pub struct SlackBlockSuggestionOptions {
173    pub options: Vec<SlackBlockChoiceItem<SlackBlockPlainTextOnly>>,
174}
175
176#[skip_serializing_none]
177#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
178pub struct SlackBlockSuggestionOptionGroups {
179    pub option_groups: Vec<SlackBlockOptionGroup<SlackBlockPlainTextOnly>>,
180}