Skip to content
Snippets Groups Projects
mod.rs 1.14 KiB
Newer Older
Stephen D's avatar
Stephen D committed
mod joke;
mod react;
Stephen D's avatar
Stephen D committed
mod sus;
Stephen D's avatar
Stephen D committed
mod xbasic;

use crate::handlers::joke::*;
use crate::handlers::react::*;
Stephen D's avatar
Stephen D committed
use crate::handlers::sus::*;
Stephen D's avatar
Stephen D committed
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()),
Stephen D's avatar
Stephen D committed
				Box::new(SusHandler::default()),
Stephen D's avatar
Stephen D committed
			],
		}
	}
}