From a31e3aa6c4c05c662db188af78dff9f6905b36b0 Mon Sep 17 00:00:00 2001
From: Stephen D <webmaster@scd31.com>
Date: Wed, 5 Oct 2022 17:11:05 -0300
Subject: [PATCH] make the DB stuff more generic

---
 src/handlers/mod.rs    | 15 ++++++++++++++-
 src/handlers/xbasic.rs | 27 ++++++++-------------------
 2 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs
index 419c0b7..0d86643 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 6961004..0ae9238 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")
-}
-- 
GitLab