diff --git a/src/bin/cleanup_committee.rs b/src/bin/cleanup_committee.rs index 141af89..9a01f4c 100644 --- a/src/bin/cleanup_committee.rs +++ b/src/bin/cleanup_committee.rs @@ -41,7 +41,7 @@ async fn main() { let mut data = client.data.write().await; data.insert::(Arc::new(RwLock::new(config))); - data.insert::(Arc::new(db)); + data.insert::(Arc::new(RwLock::new(db))); } if let Err(why) = client.start().await { @@ -69,11 +69,13 @@ impl EventHandler for Handler { async fn guild_members_chunk(&self, ctx: Context, chunk: GuildMembersChunkEvent) { if (chunk.chunk_index + 1) == chunk.chunk_count { println!("Cache built successfully!"); - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() }; + let db = db_lock.read().await; + let config_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() diff --git a/src/bin/update_committee.rs b/src/bin/update_committee.rs index d90cbac..b8cc6c2 100644 --- a/src/bin/update_committee.rs +++ b/src/bin/update_committee.rs @@ -36,7 +36,7 @@ async fn main() { let mut data = client.data.write().await; data.insert::(Arc::new(RwLock::new(config))); - data.insert::(Arc::new(db)); + data.insert::(Arc::new(RwLock::new(db))); } if let Err(why) = client.start().await { diff --git a/src/bin/update_data.rs b/src/bin/update_data.rs index fe4138f..8f73ce9 100644 --- a/src/bin/update_data.rs +++ b/src/bin/update_data.rs @@ -38,7 +38,7 @@ async fn main() { let mut data = client.data.write().await; data.insert::(Arc::new(RwLock::new(config))); - data.insert::(Arc::new(db)); + data.insert::(Arc::new(RwLock::new(db))); } if let Err(why) = client.start().await { diff --git a/src/bin/update_server-icon.rs b/src/bin/update_server-icon.rs index c4f9eca..56957da 100644 --- a/src/bin/update_server-icon.rs +++ b/src/bin/update_server-icon.rs @@ -35,7 +35,7 @@ async fn main() { let mut data = client.data.write().await; data.insert::(Arc::new(RwLock::new(config))); - data.insert::(Arc::new(db)); + data.insert::(Arc::new(RwLock::new(db))); } if let Err(why) = client.start().await { @@ -50,10 +50,11 @@ impl EventHandler for Handler { let ctx = Arc::new(ctx); println!("{} is connected!", ready.user.name); - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() }; + let db = db_lock.read().await; let config_lock = { let data_read = ctx.data.read().await; diff --git a/src/bin/update_users.rs b/src/bin/update_users.rs index 3150bcf..0cb11ac 100644 --- a/src/bin/update_users.rs +++ b/src/bin/update_users.rs @@ -12,13 +12,8 @@ use skynet_discord_bot::{ }, get_config, Config, }; -use std::{ - process, - sync::{ - atomic::{AtomicUsize, Ordering}, - Arc, - }, -}; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::{process, sync::Arc}; use tokio::sync::RwLock; #[tokio::main] @@ -45,7 +40,7 @@ async fn main() { let mut data = client.data.write().await; data.insert::(Arc::new(RwLock::new(config))); - data.insert::(Arc::new(db)); + data.insert::(Arc::new(RwLock::new(db))); } if let Err(why) = client.start().await { @@ -84,11 +79,13 @@ impl EventHandler for Handler { } async fn check_bulk(ctx: &Context) { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() }; + let db = db_lock.read().await; + for server_config in get_server_config_bulk(&db).await { normal::update_server(ctx, &server_config, &[], &[]).await; } diff --git a/src/commands/add_server.rs b/src/commands/add_server.rs index eaf0971..4511c1b 100644 --- a/src/commands/add_server.rs +++ b/src/commands/add_server.rs @@ -56,10 +56,11 @@ pub async fn run(command: &CommandInteraction, ctx: &Context) -> String { return "Please provide a valid channel for ``Bot Channel``".to_string(); }; - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let server_data = Servers { server: command.guild_id.unwrap_or_default(), diff --git a/src/commands/count.rs b/src/commands/count.rs index 41b9d81..d354db0 100644 --- a/src/commands/count.rs +++ b/src/commands/count.rs @@ -27,10 +27,11 @@ pub mod committee { false }; - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let mut cs = vec![]; // pull it from a DB @@ -94,10 +95,11 @@ pub mod servers { use std::collections::HashMap; pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let mut committees = HashMap::new(); if let Some(x) = get_committees(&db).await { diff --git a/src/commands/minecraft.rs b/src/commands/minecraft.rs index 5098f11..61f4280 100644 --- a/src/commands/minecraft.rs +++ b/src/commands/minecraft.rs @@ -23,10 +23,11 @@ pub(crate) mod user { use sqlx::Error; pub async fn run(command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let config_lock = { let data_read = ctx.data.read().await; @@ -228,10 +229,11 @@ pub(crate) mod server { return String::from("Expected Server ID"); }; - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; match add_server(&db, &g_id, &server_minecraft).await { Ok(_) => {} @@ -288,10 +290,11 @@ pub(crate) mod server { Some(x) => x, }; - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let servers = get_minecraft_config_server(&db, g_id).await; @@ -363,10 +366,11 @@ pub(crate) mod server { return String::from("Expected Server ID"); }; - let db = { - let data = ctx.data.read().await; - data.get::().expect("Expected Databse in TypeMap.").clone() + let db_lock = { + let data_read = ctx.data.read().await; + data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; match server_remove(&db, &g_id, &server_minecraft).await { Ok(_) => {} diff --git a/src/commands/role_adder.rs b/src/commands/role_adder.rs index 0573b37..7f59c08 100644 --- a/src/commands/role_adder.rs +++ b/src/commands/role_adder.rs @@ -62,10 +62,11 @@ pub mod edit { false }; - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let server = command.guild_id.unwrap_or_default(); let server_data = RoleAdder { diff --git a/src/commands/server_icon.rs b/src/commands/server_icon.rs index d4a78d5..2ab087e 100644 --- a/src/commands/server_icon.rs +++ b/src/commands/server_icon.rs @@ -18,10 +18,11 @@ pub(crate) mod admin { use super::*; pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let config_lock = { let data_read = ctx.data.read().await; @@ -68,10 +69,11 @@ pub(crate) mod user { use sqlx::{Pool, Sqlite}; pub async fn run(command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let config_toml = get_config_icons::minimal(); @@ -143,10 +145,11 @@ pub(crate) mod user { use sqlx::{Pool, Sqlite}; pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let config_toml = get_config_icons::minimal(); diff --git a/src/commands/wolves.rs b/src/commands/wolves.rs index 843ca70..0c8ddfc 100644 --- a/src/commands/wolves.rs +++ b/src/commands/wolves.rs @@ -21,10 +21,11 @@ pub mod link { use serenity::all::{CommandDataOption, CommandDataOptionValue, CommandInteraction}; pub async fn run(command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; let config_lock = { let data_read = ctx.data.read().await; @@ -313,10 +314,11 @@ pub mod verify { use sqlx::Error; pub async fn run(command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Database in TypeMap.").clone() }; + let db = db_lock.read().await; // check if user has used /link_wolves let details = if let Some(x) = get_verify_from_db(&db, &command.user.id).await { @@ -492,10 +494,11 @@ pub mod unlink { use sqlx::{Pool, Sqlite}; pub async fn run(command: &CommandInteraction, ctx: &Context) -> String { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Databse in TypeMap.").clone() }; + let db = db_lock.read().await; // doesn't matter if there is one or not, it will be removed regardless delete_link(&db, &command.user.id).await; diff --git a/src/common/database.rs b/src/common/database.rs index 2eaf5df..0c18668 100644 --- a/src/common/database.rs +++ b/src/common/database.rs @@ -12,10 +12,11 @@ use sqlx::{ Error, FromRow, Pool, Row, Sqlite, }; use std::{str::FromStr, sync::Arc}; +use tokio::sync::RwLock; pub struct DataBase; impl TypeMapKey for DataBase { - type Value = Arc>; + type Value = Arc>>; } #[derive(Debug, Clone, Deserialize, Serialize)] diff --git a/src/common/set_roles.rs b/src/common/set_roles.rs index e11c637..9115986 100644 --- a/src/common/set_roles.rs +++ b/src/common/set_roles.rs @@ -17,11 +17,13 @@ pub mod normal { } pub async fn update_server(ctx: &Context, server: &Servers, remove_roles: &[Option], members_changed: &[UserId]) { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Database in TypeMap.").clone() }; + let db = db_lock.read().await; + let Servers { server, role_past, @@ -172,11 +174,13 @@ pub mod committee { use std::collections::HashMap; pub async fn check_committee(ctx: &Context) { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() }; + let db = db_lock.read().await; + let config_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() diff --git a/src/common/wolves.rs b/src/common/wolves.rs index 3744558..17305f6 100644 --- a/src/common/wolves.rs +++ b/src/common/wolves.rs @@ -69,10 +69,11 @@ pub mod cns { } pub async fn get_wolves(ctx: &Context) { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Database in TypeMap.").clone() }; + let db = db_lock.read().await; let config_lock = { let data_read = ctx.data.read().await; @@ -223,10 +224,11 @@ pub mod committees { } pub async fn get_cns(ctx: &Context) { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Database in TypeMap.").clone() }; + let db = db_lock.read().await; let config_lock = { let data_read = ctx.data.read().await; diff --git a/src/main.rs b/src/main.rs index 8dff675..aeebac7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,11 +41,13 @@ impl EventHandler for Handler { // handles previously linked accounts joining the server async fn guild_member_addition(&self, ctx: Context, new_member: Member) { - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() }; + let db = db_lock.read().await; + let config_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() @@ -107,11 +109,13 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use // handles role updates async fn guild_member_update(&self, ctx: Context, _old_data: Option, new_data: Option, _: GuildMemberUpdateEvent) { // get config/db - let db = { + let db_lock = { let data_read = ctx.data.read().await; data_read.get::().expect("Expected Config in TypeMap.").clone() }; + let db = db_lock.read().await; + // check if the role changed is part of the ones for this server if let Some(x) = new_data { on_role_change(&db, &ctx, x).await; @@ -300,7 +304,7 @@ async fn main() { let mut data = client.data.write().await; data.insert::(Arc::new(RwLock::new(config))); - data.insert::(Arc::new(db)); + data.insert::(Arc::new(RwLock::new(db))); } // Finally, start a single shard, and start listening to events.