use ahhhh::YellResponder; use best_doctor::BestDoctorResponder; use fufufu::FufufuResponder; use serenity::async_trait; use serenity::model::channel::Message; use serenity::prelude::{Context, EventHandler}; mod ahhhh; mod best_doctor; mod fufufu; pub(crate) struct Handler { responders: Vec>, } impl Default for Handler { fn default() -> Self { Self { responders: vec![ Box::new(BestDoctorResponder), Box::new(FufufuResponder), Box::new(YellResponder), ], } } } #[async_trait] impl EventHandler for Handler { async fn message(&self, ctx: Context, message: Message) { for responder in self.responders.iter() { responder.message(ctx.clone(), message.clone()).await; } } } #[macro_export] macro_rules! simple_responder { // $phrase should be `expr`, see https://github.com/dtolnay/async-trait/issues/46 // above issue is blocked on rustc bug, see https://github.com/rust-lang/rust/issues/43081 ($name:tt, $regex:expr, $phrase:tt) => { lazy_static! { static ref REGEX: Regex = Regex::new($regex).unwrap(); } pub(crate) struct $name; #[async_trait] impl EventHandler for $name { async fn message(&self, ctx: Context, message: Message) { if REGEX.is_match(&message.content_safe(ctx.clone()).await) { message.channel_id.say(ctx, $phrase).await.unwrap(); } } } }; }