slack_morphism/models/events/
interaction.rs1use 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}