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 = "view")]
65    View(SlackInteractionActionViewContainer),
66}
67
68#[skip_serializing_none]
69#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
70pub struct SlackInteractionActionMessageContainer {
71    pub message_ts: SlackTs,
72    pub channel_id: Option<SlackChannelId>,
73    pub is_ephemeral: Option<bool>,
74    pub is_app_unfurl: Option<bool>,
75}
76
77#[skip_serializing_none]
78#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
79pub struct SlackInteractionActionViewContainer {
80    pub view_id: SlackViewId,
81}
82
83#[skip_serializing_none]
84#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
85pub struct SlackInteractionActionInfo {
86    #[serde(rename = "type")]
87    pub action_type: SlackActionType,
88    pub action_id: SlackActionId,
89    pub block_id: Option<SlackBlockId>,
90    pub text: Option<SlackBlockText>,
91    pub value: Option<String>,
92    pub selected_option: Option<SlackBlockChoiceItem<SlackBlockText>>,
93    pub action_ts: Option<SlackTs>,
94}
95
96#[serde_as]
97#[skip_serializing_none]
98#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
99pub struct SlackInteractionDialogueSubmissionEvent {
100    pub team: SlackBasicTeamInfo,
101    pub user: SlackBasicUserInfo,
102    pub channel: Option<SlackBasicChannelInfo>,
103    #[serde(default)]
104    #[serde_as(as = "serde_with::NoneAsEmptyString")]
105    pub callback_id: Option<SlackCallbackId>,
106    pub state: Option<String>,
107    pub submission: HashMap<String, String>,
108}
109
110#[skip_serializing_none]
111#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
112pub struct SlackInteractionMessageActionEvent {
113    pub team: SlackBasicTeamInfo,
114    pub user: SlackBasicUserInfo,
115    pub channel: Option<SlackBasicChannelInfo>,
116    pub message: Option<SlackHistoryMessage>,
117    pub callback_id: SlackCallbackId,
118    pub trigger_id: SlackTriggerId,
119    pub response_url: SlackResponseUrl,
120    pub actions: Option<Vec<SlackInteractionActionInfo>>,
121}
122
123#[skip_serializing_none]
124#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
125pub struct SlackInteractionShortcutEvent {
126    pub team: SlackBasicTeamInfo,
127    pub user: SlackBasicUserInfo,
128    pub callback_id: SlackCallbackId,
129    pub trigger_id: SlackTriggerId,
130    pub actions: Option<Vec<SlackInteractionActionInfo>>,
131}
132
133#[skip_serializing_none]
134#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
135pub struct SlackInteractionViewSubmissionEvent {
136    pub team: SlackBasicTeamInfo,
137    pub user: SlackBasicUserInfo,
138    pub view: SlackStatefulView,
139    pub trigger_id: Option<SlackTriggerId>,
140}
141
142#[skip_serializing_none]
143#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
144pub struct SlackInteractionViewClosedEvent {
145    pub team: SlackBasicTeamInfo,
146    pub user: SlackBasicUserInfo,
147    pub view: SlackStatefulView,
148    pub trigger_id: Option<SlackTriggerId>,
149}
150
151#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
152#[serde(untagged)]
153pub enum SlackBlockSuggestionResponse {
154    Options(SlackBlockSuggestionOptions),
155    OptionGroups(SlackBlockSuggestionOptionGroups),
156}
157
158#[skip_serializing_none]
159#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
160pub struct SlackBlockSuggestionOptions {
161    pub options: Vec<SlackBlockChoiceItem<SlackBlockPlainTextOnly>>,
162}
163
164#[skip_serializing_none]
165#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
166pub struct SlackBlockSuggestionOptionGroups {
167    pub option_groups: Vec<SlackBlockOptionGroup<SlackBlockPlainTextOnly>>,
168}