mod joke; mod react; mod xbasic; use crate::handlers::joke::*; use crate::handlers::react::*; use crate::handlers::xbasic::*; use serenity::async_trait; use serenity::model::channel::Message; use serenity::model::prelude::Ready; use serenity::prelude::*; #[async_trait] pub(crate) trait LineHandler: Send + Sync { async fn message(&self, ctx: &Context, msg: &Message) { for line in msg.content.split('\n') { self.line(ctx, msg, line).await } } async fn line(&self, _ctx: &Context, _msg: &Message, _line: &str) {} } pub(crate) struct Dispatcher { handlers: Vec<Box<dyn LineHandler>>, } #[async_trait] impl EventHandler for Dispatcher { async fn message(&self, ctx: Context, msg: Message) { for h in &self.handlers { h.message(&ctx, &msg).await; } } async fn ready(&self, _: Context, ready: Ready) { println!("{} is connected", ready.user.name); } } impl Default for Dispatcher { fn default() -> Self { Self { handlers: vec![ Box::new(XbasicHandler::default()), Box::new(JokeHandler::default()), Box::new(ReactHandler::default()), ], } } }