diff options
author | gennyble <gen@nyble.dev> | 2025-04-19 12:07:10 -0500 |
---|---|---|
committer | gennyble <gen@nyble.dev> | 2025-04-19 12:07:10 -0500 |
commit | 0e19486350b36de6d88a289cf27ccf8f23008587 (patch) | |
tree | 12330fcd44eacd749e13f54edf28f2bd4d4bb105 /src/database.rs | |
parent | 463a22059bc67bb700c2e66df7dc528e45e57415 (diff) | |
download | leaberblord-0e19486350b36de6d88a289cf27ccf8f23008587.tar.gz leaberblord-0e19486350b36de6d88a289cf27ccf8f23008587.zip |
permissions and code cleanup
Diffstat (limited to 'src/database.rs')
-rw-r--r-- | src/database.rs | 81 |
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 = "\ |