Skip to main content

panda/client/
handler.rs

1// models
2use super::session::SessionData;
3use crate::models::gateway::events::*;
4
5use std::{error::Error, sync::Arc};
6
7// async
8// Futures
9use futures::future::BoxFuture;
10
11pub(crate) type EventResult = Result<(), Box<dyn Error>>;
12
13/// Helper macro to create futures function trait
14macro_rules! event_trait {
15    ($event: tt) => {
16        dyn Fn(Arc<SessionData<S>>, $event) -> BoxFuture<'static, EventResult> + Send + Sync
17    };
18}
19
20// READY function trait
21type ReadyFn<S> = event_trait!(Ready);
22
23// CHANNEL functions trait
24type ChannelCreateFn<S> = event_trait!(ChannelCreate);
25type ChannelUpdateFn<S> = event_trait!(ChannelUpdate);
26type ChannelDeleteFn<S> = event_trait!(ChannelDelete);
27type ChannelPinsUpdateFn<S> = event_trait!(ChannelPinsUpdate);
28
29// GUILD functions trait
30type GuildCreateFn<S> = event_trait!(GuildCreate);
31type GuildUpdateFn<S> = event_trait!(GuildUpdate);
32type GuildDeleteFn<S> = event_trait!(GuildDelete);
33type GuildBanAddFn<S> = event_trait!(GuildBanAdd);
34type GuildBanRemoveFn<S> = event_trait!(GuildBanRemove);
35type GuildEmojisUpdateFn<S> = event_trait!(GuildEmojisUpdate);
36type GuildIntegrationsUpdateFn<S> = event_trait!(GuildIntegrationsUpdate);
37type GuildMemberAddFn<S> = event_trait!(GuildMemberAdd);
38type GuildMemberUpdateFn<S> = event_trait!(GuildMemberUpdate);
39type GuildMemberRemoveFn<S> = event_trait!(GuildMemberRemove);
40type GuildMembersChunkFn<S> = event_trait!(GuildMembersChunk);
41type GuildRoleCreateFn<S> = event_trait!(GuildRoleCreate);
42type GuildRoleUpdateFn<S> = event_trait!(GuildRoleUpdate);
43type GuildRoleDeleteFn<S> = event_trait!(GuildRoleDelete);
44
45// MESSAGE functions trait
46type MessageCreateFn<S> = event_trait!(MessageCreate);
47type MessageUpdateFn<S> = event_trait!(MessageUpdate);
48type MessageDeleteFn<S> = event_trait!(MessageDelete);
49type MessageDeleteBulkFn<S> = event_trait!(MessageDeleteBulk);
50type MessageReactionAddFn<S> = event_trait!(MessageReactionAdd);
51type MessageReactionRemoveFn<S> = event_trait!(MessageReactionRemove);
52type MessageReactionRemoveAllFn<S> = event_trait!(MessageReactionRemoveAll);
53type MessageReactionRemoveEmojiFn<S> = event_trait!(MessageReactionRemoveEmoji);
54
55// Presence functions trait
56type PresenceUpdateFn<S> = event_trait!(PresenceUpdate);
57type TypingStartFn<S> = event_trait!(TypingStart);
58type UserUpdateFn<S> = event_trait!(UserUpdate);
59
60type OptionBox<T> = Option<Box<T>>;
61
62/// This struct it's where all functions created by the user will be saved
63pub(crate) struct EventHandler<S> {
64    pub(crate) ready: OptionBox<ReadyFn<S>>,
65
66    // Channel
67    pub(crate) channel_create: OptionBox<ChannelCreateFn<S>>,
68    pub(crate) channel_update: OptionBox<ChannelUpdateFn<S>>,
69    pub(crate) channel_delete: OptionBox<ChannelDeleteFn<S>>,
70    pub(crate) channel_pins_update: OptionBox<ChannelPinsUpdateFn<S>>,
71
72    // Guild
73    pub(crate) guild_create: OptionBox<GuildCreateFn<S>>,
74    pub(crate) guild_update: OptionBox<GuildUpdateFn<S>>,
75    pub(crate) guild_delete: OptionBox<GuildDeleteFn<S>>,
76    pub(crate) guild_ban_add: OptionBox<GuildBanAddFn<S>>,
77    pub(crate) guild_ban_remove: OptionBox<GuildBanRemoveFn<S>>,
78    pub(crate) guild_emojis_update: OptionBox<GuildEmojisUpdateFn<S>>,
79    pub(crate) guild_integrations_update: OptionBox<GuildIntegrationsUpdateFn<S>>,
80    pub(crate) guild_member_add: OptionBox<GuildMemberAddFn<S>>,
81    pub(crate) guild_member_remove: OptionBox<GuildMemberRemoveFn<S>>,
82    pub(crate) guild_member_update: OptionBox<GuildMemberUpdateFn<S>>,
83    pub(crate) guild_members_chunk: OptionBox<GuildMembersChunkFn<S>>,
84    pub(crate) guild_role_create: OptionBox<GuildRoleCreateFn<S>>,
85    pub(crate) guild_role_update: OptionBox<GuildRoleUpdateFn<S>>,
86    pub(crate) guild_role_delete: OptionBox<GuildRoleDeleteFn<S>>,
87
88    // Message
89    pub(crate) message_create: OptionBox<MessageCreateFn<S>>,
90    pub(crate) message_update: OptionBox<MessageUpdateFn<S>>,
91    pub(crate) message_delete: OptionBox<MessageDeleteFn<S>>,
92    pub(crate) message_delete_bulk: OptionBox<MessageDeleteBulkFn<S>>,
93    pub(crate) message_reaction_add: OptionBox<MessageReactionAddFn<S>>,
94    pub(crate) message_reaction_remove: OptionBox<MessageReactionRemoveFn<S>>,
95    pub(crate) message_reaction_remove_all: OptionBox<MessageReactionRemoveAllFn<S>>,
96    pub(crate) message_reaction_remove_emoji: OptionBox<MessageReactionRemoveEmojiFn<S>>,
97
98    // Presence
99    pub(crate) presence_update: OptionBox<PresenceUpdateFn<S>>,
100    pub(crate) typing_start: OptionBox<TypingStartFn<S>>,
101    pub(crate) user_update: OptionBox<UserUpdateFn<S>>,
102}
103
104impl<S> EventHandler<S> {
105    pub(crate) fn new() -> Self {
106        Self {
107            ready: None,
108
109            // Channel
110            channel_create: None,
111            channel_update: None,
112            channel_delete: None,
113            channel_pins_update: None,
114
115            // Guild
116            guild_create: None,
117            guild_update: None,
118            guild_delete: None,
119            guild_ban_add: None,
120            guild_ban_remove: None,
121            guild_emojis_update: None,
122            guild_integrations_update: None,
123            guild_member_add: None,
124            guild_member_remove: None,
125            guild_member_update: None,
126            guild_members_chunk: None,
127            guild_role_create: None,
128            guild_role_update: None,
129            guild_role_delete: None,
130
131            // Message
132            message_create: None,
133            message_update: None,
134            message_delete: None,
135            message_delete_bulk: None,
136            message_reaction_add: None,
137            message_reaction_remove: None,
138            message_reaction_remove_all: None,
139            message_reaction_remove_emoji: None,
140            // Presence
141            presence_update: None,
142            typing_start: None,
143            user_update: None,
144        }
145    }
146}