slack_rust/event_api/
event.rs

1//! [Event API Types](https://api.slack.com/events?filter=Events)
2
3use crate::channels::channel::Channel;
4use crate::event_api::app::AppRequest;
5use crate::team::teams::Team;
6use crate::views::view::View;
7use serde::{Deserialize, Serialize};
8use serde_with::skip_serializing_none;
9
10/// [Event API](https://api.slack.com/events?filter=Events)
11#[skip_serializing_none]
12#[derive(Deserialize, Serialize, Debug, PartialEq)]
13#[serde(tag = "type")]
14pub enum Event {
15    /// User clicked into your App Home
16    #[serde(rename = "app_home_opened")]
17    AppHomeOpened {
18        user: String,
19        channel: String,
20        event_ts: String,
21        tab: String,
22        view: View,
23    },
24    /// Subscribe to only the message events that mention your app or bot
25    #[serde(rename = "app_mention")]
26    AppMention {
27        user: String,
28        text: String,
29        ts: String,
30        channel: String,
31        event_ts: String,
32    },
33    /// Indicates your app's event subscriptions are being rate limited
34    #[serde(rename = "app_rate_limited")]
35    AppRateLimited {
36        token: String,
37        team_id: String,
38        minute_rate_limited: i32,
39        api_app_id: String,
40    },
41    /// User requested an app
42    #[serde(rename = "app_requested")]
43    AppRequested { app_request: AppRequest },
44    /// Your Slack app was uninstalled.
45    #[serde(rename = "event_callback")]
46    AppUninstalled(CallbackEvent),
47    /// A channel was archived
48    #[serde(rename = "channel_archive")]
49    ChannelArchive { channel: String, user: String },
50    /// A channel was created
51    #[serde(rename = "channel_created")]
52    ChannelCreated { channel: Channel },
53    /// A channel was deleted
54    #[serde(rename = "channel_deleted")]
55    ChannelDeleted { channel: String },
56    /// Bulk updates were made to a channel's history
57    #[serde(rename = "channel_history_changed")]
58    ChannelHistoryChanged {
59        latest: String,
60        ts: String,
61        event_ts: String,
62    },
63    /// A channel ID changed
64    #[serde(rename = "channel_id_changed")]
65    ChannelIDChanged {
66        old_channel_id: String,
67        new_channel_id: String,
68        event_ts: String,
69    },
70    /// You left a channel
71    #[serde(rename = "channel_left")]
72    ChannelLeft { channel: String },
73    /// A channel was renamed
74    #[serde(rename = "channel_rename")]
75    ChannelRename { channel: Channel },
76    /// A channel has been shared with an external workspace
77    #[serde(rename = "channel_shared")]
78    ChannelShared {
79        connected_team_id: String,
80        channel: String,
81        event_ts: String,
82    },
83    /// A channel was unarchived
84    #[serde(rename = "channel_unarchive")]
85    ChannelUnarchive { channel: String, user: String },
86    ///A channel has been unshared with an external workspace
87    #[serde(rename = "channel_unshared")]
88    ChannelUnshared {
89        previously_connected_team_id: String,
90        channel: String,
91        is_ext_shared: bool,
92        event_ts: String,
93    },
94    /// A custom emoji has been added or changed
95    #[serde(rename = "emoji_changed")]
96    EmojiChanged {
97        subtype: String,
98        names: Vec<String>,
99        event_ts: String,
100    },
101    /// An enterprise grid migration has finished on this workspace.
102    #[serde(rename = "event_callback")]
103    GridMigrationFinished(CallbackEvent),
104    /// An enterprise grid migration has started on this workspace.
105    #[serde(rename = "event_callback")]
106    GridMigrationStarted(CallbackEvent),
107    /// A private channel was archived
108    #[serde(rename = "group_archive")]
109    GroupArchive { channel: String },
110    /// You closed a private channel
111    #[serde(rename = "group_close")]
112    GroupClose { user: String, channel: String },
113    /// A private channel was deleted
114    #[serde(rename = "group_deleted")]
115    GroupDeleted { channel: String },
116    /// A private channel was deleted
117    #[serde(rename = "group_history_changed")]
118    GroupHistoryChanged {
119        latest: String,
120        ts: String,
121        event_ts: String,
122    },
123    /// You left a private channel
124    #[serde(rename = "group_left")]
125    GroupLeft { channel: String },
126    /// You created a group DM
127    #[serde(rename = "group_open")]
128    GroupOpen { user: String, channel: String },
129    /// A private channel was renamed
130    #[serde(rename = "group_rename")]
131    GroupRename { channel: Channel },
132    /// A private channel was unarchived
133    #[serde(rename = "group_unarchive")]
134    GroupUnarchive { channel: String },
135    /// You closed a DM
136    #[serde(rename = "im_close")]
137    ImClose { user: String, channel: String },
138    /// A DM was created
139    #[serde(rename = "im_created")]
140    ImCreated { user: String, channel: Channel },
141    /// Bulk updates were made to a DM's history
142    #[serde(rename = "im_history_changed")]
143    ImHistoryChanged {
144        latest: String,
145        ts: String,
146        event_ts: String,
147    },
148    /// You opened a DM
149    #[serde(rename = "im_open")]
150    ImOpen { user: String, channel: String },
151    /// User requested an invite
152    #[serde(rename = "invite_requested")]
153    InviteRequested {
154        id: String,
155        email: String,
156        date_created: i32,
157        requester_ids: Vec<String>,
158        channel_ids: Vec<String>,
159        invite_type: String,
160        real_name: String,
161        date_expire: i32,
162        request_reason: String,
163        team: Team,
164    },
165    // TODO: To be implemented in the future
166    /// A message was posted containing one or more links relevant to your application
167    #[serde(rename = "link_shared")]
168    LinkShared,
169    /// A user joined a public or private channel
170    #[serde(rename = "member_joined_channel")]
171    MemberJoinedChannel {
172        user: String,
173        channel: String,
174        channel_type: String,
175        team: String,
176        inviter: String,
177    },
178    /// A user left a public or private channel
179    #[serde(rename = "member_joined_channel")]
180    MemberLeftChannel {
181        user: String,
182        channel: String,
183        channel_type: String,
184        team: String,
185    },
186    /// A message was sent to a channel
187    #[serde(rename = "member_joined_channel")]
188    Message {
189        channel: String,
190        user: String,
191        channel_type: String,
192        text: String,
193        ts: String,
194    },
195    #[serde(skip)]
196    None,
197}
198
199impl Event {
200    pub fn block_type(&self) -> EventType {
201        match self {
202            Event::AppHomeOpened { .. } => EventType::AppHomeOpened,
203            Event::AppMention { .. } => EventType::AppMention,
204            Event::AppRateLimited { .. } => EventType::AppRateLimited,
205            Event::AppRequested { .. } => EventType::AppRequested,
206            Event::AppUninstalled(_) => EventType::AppUninstalled,
207            Event::ChannelArchive { .. } => EventType::ChannelArchive,
208            Event::ChannelCreated { .. } => EventType::ChannelCreated,
209            Event::ChannelDeleted { .. } => EventType::ChannelDeleted,
210            Event::ChannelHistoryChanged { .. } => EventType::ChannelHistoryChanged,
211            Event::ChannelIDChanged { .. } => EventType::ChannelIDChanged,
212            Event::ChannelLeft { .. } => EventType::ChannelLeft,
213            Event::ChannelRename { .. } => EventType::ChannelRename,
214            Event::ChannelShared { .. } => EventType::ChannelShared,
215            Event::ChannelUnarchive { .. } => EventType::ChannelUnarchive,
216            Event::ChannelUnshared { .. } => EventType::ChannelUnshared,
217            Event::EmojiChanged { .. } => EventType::EmojiChanged,
218            Event::GridMigrationFinished(_) => EventType::GridMigrationFinished,
219            Event::GridMigrationStarted(_) => EventType::GridMigrationStarted,
220            Event::GroupArchive { .. } => EventType::GroupArchive,
221            Event::GroupClose { .. } => EventType::GroupClose,
222            Event::GroupDeleted { .. } => EventType::GroupDeleted,
223            Event::GroupHistoryChanged { .. } => EventType::GroupHistoryChanged,
224            Event::GroupLeft { .. } => EventType::GroupLeft,
225            Event::GroupOpen { .. } => EventType::GroupOpen,
226            Event::GroupRename { .. } => EventType::GroupRename,
227            Event::GroupUnarchive { .. } => EventType::GroupUnarchive,
228            Event::ImClose { .. } => EventType::ImClose,
229            Event::ImCreated { .. } => EventType::ImCreated,
230            Event::ImHistoryChanged { .. } => EventType::ImHistoryChanged,
231            Event::ImOpen { .. } => EventType::ImOpen,
232            Event::InviteRequested { .. } => EventType::InviteRequested,
233            Event::LinkShared => EventType::LinkShared,
234            Event::MemberJoinedChannel { .. } => EventType::MemberJoinedChannel,
235            Event::MemberLeftChannel { .. } => EventType::MemberLeftChannel,
236            Event::Message { .. } => EventType::Message,
237            Event::None => EventType::None,
238        }
239    }
240}
241
242/// [Event API Type](https://api.slack.com/events?filter=Events)
243#[derive(Deserialize, Serialize, Debug, PartialEq)]
244#[serde(rename_all = "snake_case")]
245pub enum EventType {
246    AppHomeOpened,
247    AppMention,
248    AppRateLimited,
249    AppRequested,
250    AppUninstalled,
251    ChannelArchive,
252    ChannelCreated,
253    ChannelDeleted,
254    ChannelHistoryChanged,
255    ChannelIDChanged,
256    ChannelLeft,
257    ChannelRename,
258    ChannelShared,
259    ChannelUnarchive,
260    ChannelUnshared,
261    EmojiChanged,
262    GridMigrationFinished,
263    GridMigrationStarted,
264    GroupArchive,
265    GroupClose,
266    GroupDeleted,
267    GroupHistoryChanged,
268    GroupLeft,
269    GroupOpen,
270    GroupRename,
271    GroupUnarchive,
272    ImClose,
273    ImCreated,
274    ImHistoryChanged,
275    ImOpen,
276    InviteRequested,
277    LinkShared,
278    MemberJoinedChannel,
279    MemberLeftChannel,
280    Message,
281    #[serde(skip)]
282    None,
283}
284
285#[skip_serializing_none]
286#[derive(Deserialize, Serialize, Debug, PartialEq)]
287pub struct CallbackEvent {
288    token: String,
289    team_id: String,
290    api_app_id: String,
291    #[serde(rename = "event")]
292    callback_event: CallbackEventInner,
293    event_id: String,
294    event_time: i32,
295}
296
297#[skip_serializing_none]
298#[derive(Deserialize, Serialize, Debug, PartialEq)]
299pub struct CallbackEventInner {
300    #[serde(rename = "type")]
301    pub type_filed: CallbackEventType,
302    pub enterprise_id: Option<String>,
303}
304
305#[derive(Deserialize, Serialize, Debug, PartialEq)]
306#[serde(rename_all = "snake_case")]
307pub enum CallbackEventType {
308    AppUninstalled,
309    GridMigrationFinished,
310    GridMigrationStarted,
311}