mod horse; mod joke; mod react; mod sus; mod xbasic; use crate::handlers::horse::HorseHandler; use crate::handlers::joke::*; use crate::handlers::react::*; use crate::handlers::sus::*; use crate::handlers::xbasic::*; use diesel::{Connection, PgConnection}; use dotenv::dotenv; use serenity::async_trait; use serenity::model::channel::Message; use serenity::model::prelude::Ready; use serenity::prelude::*; use std::env; use std::sync::Arc; use tokio::sync::Mutex; #[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 { let conn = Arc::new(Mutex::new(establish_connection())); Self { handlers: vec![ Box::new(XbasicHandler::new(conn)), Box::new(JokeHandler::default()), Box::new(ReactHandler::default()), Box::new(SusHandler::default()), Box::new(HorseHandler::default()), ], } } } fn establish_connection() -> PgConnection { dotenv().ok(); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); PgConnection::establish(&database_url).expect("Error connecting to database") }