1use super::session::SessionData;
3use crate::models::gateway::events::*;
4
5use std::{error::Error, sync::Arc};
6
7use futures::future::BoxFuture;
10
11pub(crate) type EventResult = Result<(), Box<dyn Error>>;
12
13macro_rules! event_trait {
15 ($event: tt) => {
16 dyn Fn(Arc<SessionData<S>>, $event) -> BoxFuture<'static, EventResult> + Send + Sync
17 };
18}
19
20type ReadyFn<S> = event_trait!(Ready);
22
23type ChannelCreateFn<S> = event_trait!(ChannelCreate);
25type ChannelUpdateFn<S> = event_trait!(ChannelUpdate);
26type ChannelDeleteFn<S> = event_trait!(ChannelDelete);
27type ChannelPinsUpdateFn<S> = event_trait!(ChannelPinsUpdate);
28
29type 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
45type 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
55type 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
62pub(crate) struct EventHandler<S> {
64 pub(crate) ready: OptionBox<ReadyFn<S>>,
65
66 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 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 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 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_create: None,
111 channel_update: None,
112 channel_delete: None,
113 channel_pins_update: None,
114
115 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_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_update: None,
142 typing_start: None,
143 user_update: None,
144 }
145 }
146}