From e3834bd289935622d5f2fae4a612d56806639ffb Mon Sep 17 00:00:00 2001 From: Raphael Date: Thu, 12 Feb 2026 20:10:54 +0100 Subject: [PATCH] feat(events/mod): adding the Interaction handle autodetect --- src/events/mod.rs | 51 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/src/events/mod.rs b/src/events/mod.rs index eaace30..0871fd2 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -1,19 +1,64 @@ -include!("./mod_gen.rs"); +pub mod bot; use crate::commands::SlashCommand; use serenity::all::*; +#[serenity::async_trait] +pub trait BotEvent: Send + Sync { + fn event_type(&self) -> &'static str; + + async fn on_ready(&self, _ctx: &Context, _ready: &Ready, _commands: &[Box]) {} + async fn on_interaction_create( + &self, + _ctx: &Context, + _interaction: &Interaction, + _commands: &[Box], + ) { + } + async fn on_message(&self, _ctx: &Context, _msg: &Message) {} +} + +pub struct EventEntry { + pub create: fn() -> Box, +} + +inventory::collect!(EventEntry); + +pub fn import() -> Vec> { + inventory::iter:: + .into_iter() + .map(|entry| (entry.create)()) + .collect() +} + pub struct Bot { pub commands: Vec>, + pub events: Vec>, } #[serenity::async_trait] impl EventHandler for Bot { async fn ready(&self, ctx: Context, ready: Ready) { - bot::ready::handle(&ctx, &ready, &self.commands).await; + for event in self.events.iter().filter(|e| e.event_type() == "ready") { + event.on_ready(&ctx, &ready, &self.commands).await; + } } async fn interaction_create(&self, ctx: Context, interaction: Interaction) { - bot::interaction_create::handle(&ctx, &interaction, &self.commands).await; + for event in self + .events + .iter() + .filter(|e| e.event_type() == "interaction_create") + { + event + .on_interaction_create(&ctx, &interaction, &self.commands) + .await; + } + } + + async fn message(&self, ctx: Context, msg: Message) { + for event in self.events.iter().filter(|e| e.event_type() == "message") { + event.on_message(&ctx, &msg).await; + } } }