use crate::channels::channel::Channel;
use crate::event_api::app::AppRequest;
use crate::team::teams::Team;
use crate::views::view::View;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[skip_serializing_none]
#[derive(Deserialize, Serialize, Debug, PartialEq)]
#[serde(tag = "type")]
pub enum Event {
#[serde(rename = "app_home_opened")]
AppHomeOpened {
user: String,
channel: String,
event_ts: String,
tab: String,
view: View,
},
#[serde(rename = "app_mention")]
AppMention {
user: String,
text: String,
ts: String,
channel: String,
event_ts: String,
},
#[serde(rename = "app_rate_limited")]
AppRateLimited {
token: String,
team_id: String,
minute_rate_limited: i32,
api_app_id: String,
},
#[serde(rename = "app_requested")]
AppRequested { app_request: AppRequest },
#[serde(rename = "event_callback")]
AppUninstalled(CallbackEvent),
#[serde(rename = "channel_archive")]
ChannelArchive { channel: String, user: String },
#[serde(rename = "channel_created")]
ChannelCreated { channel: Channel },
#[serde(rename = "channel_deleted")]
ChannelDeleted { channel: String },
#[serde(rename = "channel_history_changed")]
ChannelHistoryChanged {
latest: String,
ts: String,
event_ts: String,
},
#[serde(rename = "channel_id_changed")]
ChannelIDChanged {
old_channel_id: String,
new_channel_id: String,
event_ts: String,
},
#[serde(rename = "channel_left")]
ChannelLeft { channel: String },
#[serde(rename = "channel_rename")]
ChannelRename { channel: Channel },
#[serde(rename = "channel_shared")]
ChannelShared {
connected_team_id: String,
channel: String,
event_ts: String,
},
#[serde(rename = "channel_unarchive")]
ChannelUnarchive { channel: String, user: String },
#[serde(rename = "channel_unshared")]
ChannelUnshared {
previously_connected_team_id: String,
channel: String,
is_ext_shared: bool,
event_ts: String,
},
#[serde(rename = "emoji_changed")]
EmojiChanged {
subtype: String,
names: Vec<String>,
event_ts: String,
},
#[serde(rename = "event_callback")]
GridMigrationFinished(CallbackEvent),
#[serde(rename = "event_callback")]
GridMigrationStarted(CallbackEvent),
#[serde(rename = "group_archive")]
GroupArchive { channel: String },
#[serde(rename = "group_close")]
GroupClose { user: String, channel: String },
#[serde(rename = "group_deleted")]
GroupDeleted { channel: String },
#[serde(rename = "group_history_changed")]
GroupHistoryChanged {
latest: String,
ts: String,
event_ts: String,
},
#[serde(rename = "group_left")]
GroupLeft { channel: String },
#[serde(rename = "group_open")]
GroupOpen { user: String, channel: String },
#[serde(rename = "group_rename")]
GroupRename { channel: Channel },
#[serde(rename = "group_unarchive")]
GroupUnarchive { channel: String },
#[serde(rename = "im_close")]
ImClose { user: String, channel: String },
#[serde(rename = "im_created")]
ImCreated { user: String, channel: Channel },
#[serde(rename = "im_history_changed")]
ImHistoryChanged {
latest: String,
ts: String,
event_ts: String,
},
#[serde(rename = "im_open")]
ImOpen { user: String, channel: String },
#[serde(rename = "invite_requested")]
InviteRequested {
id: String,
email: String,
date_created: i32,
requester_ids: Vec<String>,
channel_ids: Vec<String>,
invite_type: String,
real_name: String,
date_expire: i32,
request_reason: String,
team: Team,
},
#[serde(rename = "link_shared")]
LinkShared,
#[serde(rename = "member_joined_channel")]
MemberJoinedChannel {
user: String,
channel: String,
channel_type: String,
team: String,
inviter: String,
},
#[serde(rename = "member_joined_channel")]
MemberLeftChannel {
user: String,
channel: String,
channel_type: String,
team: String,
},
#[serde(rename = "member_joined_channel")]
Message {
channel: String,
user: String,
channel_type: String,
text: String,
ts: String,
},
#[serde(skip)]
None,
}
impl Event {
pub fn block_type(&self) -> EventType {
match self {
Event::AppHomeOpened { .. } => EventType::AppHomeOpened,
Event::AppMention { .. } => EventType::AppMention,
Event::AppRateLimited { .. } => EventType::AppRateLimited,
Event::AppRequested { .. } => EventType::AppRequested,
Event::AppUninstalled(_) => EventType::AppUninstalled,
Event::ChannelArchive { .. } => EventType::ChannelArchive,
Event::ChannelCreated { .. } => EventType::ChannelCreated,
Event::ChannelDeleted { .. } => EventType::ChannelDeleted,
Event::ChannelHistoryChanged { .. } => EventType::ChannelHistoryChanged,
Event::ChannelIDChanged { .. } => EventType::ChannelIDChanged,
Event::ChannelLeft { .. } => EventType::ChannelLeft,
Event::ChannelRename { .. } => EventType::ChannelRename,
Event::ChannelShared { .. } => EventType::ChannelShared,
Event::ChannelUnarchive { .. } => EventType::ChannelUnarchive,
Event::ChannelUnshared { .. } => EventType::ChannelUnshared,
Event::EmojiChanged { .. } => EventType::EmojiChanged,
Event::GridMigrationFinished(_) => EventType::GridMigrationFinished,
Event::GridMigrationStarted(_) => EventType::GridMigrationStarted,
Event::GroupArchive { .. } => EventType::GroupArchive,
Event::GroupClose { .. } => EventType::GroupClose,
Event::GroupDeleted { .. } => EventType::GroupDeleted,
Event::GroupHistoryChanged { .. } => EventType::GroupHistoryChanged,
Event::GroupLeft { .. } => EventType::GroupLeft,
Event::GroupOpen { .. } => EventType::GroupOpen,
Event::GroupRename { .. } => EventType::GroupRename,
Event::GroupUnarchive { .. } => EventType::GroupUnarchive,
Event::ImClose { .. } => EventType::ImClose,
Event::ImCreated { .. } => EventType::ImCreated,
Event::ImHistoryChanged { .. } => EventType::ImHistoryChanged,
Event::ImOpen { .. } => EventType::ImOpen,
Event::InviteRequested { .. } => EventType::InviteRequested,
Event::LinkShared => EventType::LinkShared,
Event::MemberJoinedChannel { .. } => EventType::MemberJoinedChannel,
Event::MemberLeftChannel { .. } => EventType::MemberLeftChannel,
Event::Message { .. } => EventType::Message,
Event::None => EventType::None,
}
}
}
#[derive(Deserialize, Serialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum EventType {
AppHomeOpened,
AppMention,
AppRateLimited,
AppRequested,
AppUninstalled,
ChannelArchive,
ChannelCreated,
ChannelDeleted,
ChannelHistoryChanged,
ChannelIDChanged,
ChannelLeft,
ChannelRename,
ChannelShared,
ChannelUnarchive,
ChannelUnshared,
EmojiChanged,
GridMigrationFinished,
GridMigrationStarted,
GroupArchive,
GroupClose,
GroupDeleted,
GroupHistoryChanged,
GroupLeft,
GroupOpen,
GroupRename,
GroupUnarchive,
ImClose,
ImCreated,
ImHistoryChanged,
ImOpen,
InviteRequested,
LinkShared,
MemberJoinedChannel,
MemberLeftChannel,
Message,
#[serde(skip)]
None,
}
#[skip_serializing_none]
#[derive(Deserialize, Serialize, Debug, PartialEq)]
pub struct CallbackEvent {
token: String,
team_id: String,
api_app_id: String,
#[serde(rename = "event")]
callback_event: CallbackEventInner,
event_id: String,
event_time: i32,
}
#[skip_serializing_none]
#[derive(Deserialize, Serialize, Debug, PartialEq)]
pub struct CallbackEventInner {
#[serde(rename = "type")]
pub type_filed: CallbackEventType,
pub enterprise_id: Option<String>,
}
#[derive(Deserialize, Serialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum CallbackEventType {
AppUninstalled,
GridMigrationFinished,
GridMigrationStarted,
}