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}