diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 419c0b738446b267fa8f3639117f7a98496cb4a8..0d86643e8aae906c0157c91e5e7161479c622fdc 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -10,10 +10,14 @@ 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, Mutex}; #[async_trait] pub(crate) trait LineHandler: Send + Sync { @@ -45,9 +49,11 @@ impl EventHandler for Dispatcher { impl Default for Dispatcher { fn default() -> Self { + let conn = Arc::new(Mutex::new(establish_connection())); + Self { handlers: vec![ - Box::new(XbasicHandler::default()), + Box::new(XbasicHandler::new(conn)), Box::new(JokeHandler::default()), Box::new(ReactHandler::default()), Box::new(SusHandler::default()), @@ -56,3 +62,10 @@ impl Default for Dispatcher { } } } + +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") +} diff --git a/src/handlers/xbasic.rs b/src/handlers/xbasic.rs index 6961004d0b11196e3cfd6d4996a35d0886a06758..0ae923893b342ff391068a5efec3dd11ce211936 100644 --- a/src/handlers/xbasic.rs +++ b/src/handlers/xbasic.rs @@ -1,8 +1,7 @@ use crate::framebuffer::FrameBuffer; use crate::handlers::LineHandler; use crate::program::Program; -use diesel::{Connection, PgConnection}; -use dotenv::dotenv; +use diesel::PgConnection; use serenity::async_trait; use serenity::http::AttachmentType; use serenity::model::channel::{Message, ReactionType}; @@ -10,7 +9,6 @@ use serenity::model::id::UserId; use serenity::prelude::*; use std::borrow::{Borrow, Cow}; use std::collections::HashMap; -use std::env; use std::str::FromStr; use std::sync::{Arc, Mutex}; use tokio::task; @@ -54,6 +52,13 @@ pub struct XbasicHandler { } impl XbasicHandler { + pub fn new(conn: Arc<Mutex<PgConnection>>) -> Self { + Self { + programs: Arc::new(Mutex::new(HashMap::new())), + conn, + } + } + async fn interpret_line(&self, msg: &Message, ctx: &Context, line: &str) { // TODO we lock the mutex to check, but unlock before locking again later // allows another thread to screw it up @@ -410,19 +415,3 @@ impl LineHandler for XbasicHandler { self.interpret_line(msg, ctx, line).await; } } - -impl Default for XbasicHandler { - fn default() -> Self { - Self { - programs: Arc::new(Mutex::new(HashMap::new())), - conn: Arc::new(Mutex::new(establish_connection())), - } - } -} - -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") -}