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 selected_options: Option<Vec<SlackBlockChoiceItem<SlackBlockText>>>,
106    pub action_ts: Option<SlackTs>,
107}
108
109#[serde_as]
110#[skip_serializing_none]
111#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
112pub struct SlackInteractionDialogueSubmissionEvent {
113    pub team: SlackBasicTeamInfo,
114    pub user: SlackBasicUserInfo,
115    pub channel: Option<SlackBasicChannelInfo>,
116    #[serde(default)]
117    #[serde_as(as = "serde_with::NoneAsEmptyString")]
118    pub callback_id: Option<SlackCallbackId>,
119    pub state: Option<String>,
120    pub submission: HashMap<String, String>,
121}
122
123#[skip_serializing_none]
124#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
125pub struct SlackInteractionMessageActionEvent {
126    pub team: SlackBasicTeamInfo,
127    pub user: SlackBasicUserInfo,
128    pub channel: Option<SlackBasicChannelInfo>,
129    pub message: Option<SlackHistoryMessage>,
130    pub callback_id: SlackCallbackId,
131    pub trigger_id: SlackTriggerId,
132    pub response_url: SlackResponseUrl,
133    pub actions: Option<Vec<SlackInteractionActionInfo>>,
134}
135
136#[skip_serializing_none]
137#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
138pub struct SlackInteractionShortcutEvent {
139    pub team: SlackBasicTeamInfo,
140    pub user: SlackBasicUserInfo,
141    pub callback_id: SlackCallbackId,
142    pub trigger_id: SlackTriggerId,
143    pub actions: Option<Vec<SlackInteractionActionInfo>>,
144}
145
146#[skip_serializing_none]
147#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
148pub struct SlackInteractionViewSubmissionEvent {
149    pub team: SlackBasicTeamInfo,
150    pub user: SlackBasicUserInfo,
151    pub view: SlackStatefulView,
152    pub trigger_id: Option<SlackTriggerId>,
153}
154
155#[skip_serializing_none]
156#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
157pub struct SlackInteractionViewClosedEvent {
158    pub team: SlackBasicTeamInfo,
159    pub user: SlackBasicUserInfo,
160    pub view: SlackStatefulView,
161    pub trigger_id: Option<SlackTriggerId>,
162}
163
164#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
165#[serde(untagged)]
166pub enum SlackBlockSuggestionResponse {
167    Options(SlackBlockSuggestionOptions),
168    OptionGroups(SlackBlockSuggestionOptionGroups),
169}
170
171#[skip_serializing_none]
172#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
173pub struct SlackBlockSuggestionOptions {
174    pub options: Vec<SlackBlockChoiceItem<SlackBlockPlainTextOnly>>,
175}
176
177#[skip_serializing_none]
178#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
179pub struct SlackBlockSuggestionOptionGroups {
180    pub option_groups: Vec<SlackBlockOptionGroup<SlackBlockPlainTextOnly>>,
181}