discord-kurante/src/passive/mod.rs

58 lines
1.5 KiB
Rust

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<Box<dyn EventHandler>>,
}
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();
}
}
}
};
}