about summary refs log tree commit diff
path: root/src/database.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/database.rs')
-rw-r--r--src/database.rs81
1 files changed, 79 insertions, 2 deletions
diff --git a/src/database.rs b/src/database.rs
index 3f86c5b..218a602 100644
--- a/src/database.rs
+++ b/src/database.rs
@@ -1,7 +1,6 @@
 use std::{path::Path, sync::Mutex};
 
 use rusqlite::{Connection, OptionalExtension, params};
-use twilight_http::request::guild;
 
 #[derive(Debug)]
 pub struct Database {
@@ -91,6 +90,52 @@ impl Database {
 		Ok(vec)
 	}
 
+	pub fn get_leaderboard_settings(&self, guild: u64) -> Result<LeaderboardSettings, Error> {
+		let conn = self.conn.lock().unwrap();
+
+		Ok(conn
+			.query_row(
+				"SELECT guild_id, permission, role FROM leaderboards WHERE guild_id = ?1",
+				params![guild],
+				|row| {
+					let permission_str: String = row.get(1)?;
+					Ok(LeaderboardSettings {
+						permission: PermissionSetting::from_str(&permission_str),
+						role: row.get(2)?,
+					})
+				},
+			)
+			.unwrap())
+	}
+
+	pub fn set_leaderboard_permission(
+		&self,
+		guild: u64,
+		perm: PermissionSetting,
+	) -> Result<(), Error> {
+		let conn = self.conn.lock().unwrap();
+
+		conn.execute(
+			"UPDATE leaderboards SET permission = ?1 WHERE guild_id = ?2",
+			params![perm.as_str(), guild],
+		)
+		.unwrap();
+
+		Ok(())
+	}
+
+	pub fn set_leaderboard_permission_role(&self, guild: u64, role: u64) -> Result<(), Error> {
+		let conn = self.conn.lock().unwrap();
+
+		conn.execute(
+			"UPDATE leaderboards SET role = ?1 WHERE guild_id = ?2",
+			params![role, guild],
+		)
+		.unwrap();
+
+		Ok(())
+	}
+
 	pub fn add_user_to_leaderboard(&self, guild: u64, row: BoardRow) -> Result<(), Error> {
 		// Don't deadlock!
 		let lb = self.leaderboard_id(guild)?;
@@ -129,10 +174,42 @@ impl Database {
 	}
 }
 
+pub enum PermissionSetting {
+	// Anyone can change the score
+	None,
+	// A role is required to change the score
+	RoleRequired,
+}
+
+impl PermissionSetting {
+	/// From trusted input such as the database. Panics if malformed
+	pub fn from_str(s: &str) -> Self {
+		match s {
+			"none" => Self::None,
+			"role-required" => Self::RoleRequired,
+			_ => panic!(),
+		}
+	}
+
+	pub fn as_str(&self) -> &'static str {
+		match self {
+			Self::None => "none",
+			Self::RoleRequired => "role-required",
+		}
+	}
+}
+
+pub struct LeaderboardSettings {
+	pub permission: PermissionSetting,
+	pub role: Option<u64>,
+}
+
 const CREATE_TABLE_LEADERBOARDS: &'static str = "\
 	CREATE TABLE IF NOT EXISTS leaderboards(
 		id INTEGER PRIMARY KEY AUTOINCREMENT,
-		guild_id INTEGER
+		guild_id INTEGER NOT NULL,
+		permission TEXT NOT NULL DEFAULT \"none\",
+		role INTEGER
 	);";
 
 const CREATE_TABLE_LEADERBOARD: &'static str = "\