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}