diff --git a/Config.example.toml b/Config.example.toml index 74ae408..a039d2b 100644 --- a/Config.example.toml +++ b/Config.example.toml @@ -50,9 +50,9 @@ authSystem = "elyby" special = [0,0,0,1,0,0] # 6 pride = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # 25 -# Your nickname here +# With advancedUsers you can set additional parameters # [advancedUsers.your uuid here] -# username = "Bot" +# username = "Your_username_here" # authSystem = "mojang" # can be: mojang, elyby, internal (cant be authenticated) # special = [0,1,0,0,0,0] # and set badges what you want! :D # pride = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] diff --git a/src/main.rs b/src/main.rs index 50dcba6..6f29695 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,6 @@ use axum::{ extract::DefaultBodyLimit, middleware::from_extractor, routing::{delete, get, post, put}, Router }; use dashmap::DashMap; -use utils::collect_advanced_users; use std::sync::Arc; use tokio::sync::{broadcast, Mutex}; use tower_http::trace::TraceLayer; @@ -28,9 +27,11 @@ use profile as api_profile; // Utils mod utils; +use utils::update_advanced_users; // Config mod config; +use config::Config; #[derive(Debug, Clone)] pub struct AppState { @@ -66,7 +67,7 @@ async fn main() -> Result<()> { info!("The Sculptor v{}", SCULPTOR_VERSION); // Config - let config = Arc::new(Mutex::new(config::Config::parse(config_file.clone().into()))); + let config = Arc::new(Mutex::new(Config::parse(config_file.clone().into()))); let listen = config.lock().await.listen.clone(); // State @@ -77,26 +78,20 @@ async fn main() -> Result<()> { }; // Automatic update of configuration while the server is running - let config_update = state.config.clone(); + let config_update = Arc::clone(&state.config); let user_manager = Arc::clone(&state.user_manager); + update_advanced_users(&config_update.lock().await.advanced_users, &user_manager); tokio::spawn(async move { loop { - let new_config = config::Config::parse(config_file.clone().into()); + tokio::time::sleep(std::time::Duration::from_secs(10)).await; + let new_config = Config::parse(config_file.clone().into()); let mut config = config_update.lock().await; if new_config != *config { info!("Server configuration modification detected!"); *config = new_config; - // let collected = collect_advanced_users(&config.advanced_users); - // for (uuid, userinfo) in collected { - // user_manager.insert_user(uuid, userinfo); - // } + update_advanced_users(&config.advanced_users, &user_manager); } - let collected = collect_advanced_users(&config.advanced_users); - for (uuid, userinfo) in collected { - user_manager.insert_user(uuid, userinfo); - } - tokio::time::sleep(std::time::Duration::from_secs(10)).await; } }); diff --git a/src/utils.rs b/src/utils.rs index 3816abe..0db2562 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,7 +5,7 @@ use rand::{distributions::Alphanumeric, thread_rng, Rng}; use ring::digest::{self, digest}; use uuid::Uuid; -use crate::auth::{AuthSystem, Userinfo}; +use crate::auth::{AuthSystem, UManager, Userinfo}; // Core functions pub fn rand() -> [u8; 50] { @@ -36,8 +36,25 @@ pub fn get_correct_array(value: &toml::Value) -> Vec { .map(move |x| x.as_integer().unwrap() as u8) .collect() } -pub fn collect_advanced_users(value: &toml::Table) -> Vec<(Uuid, Userinfo)> { - value +// pub fn collect_advanced_users(value: &toml::Table) -> Vec<(Uuid, Userinfo)> { +// value +// .iter() +// .map( |(uuid, userdata)| { +// let auth_system = AuthSystem::from_str(userdata.as_table().unwrap().get("authSystem").expect("Can't find authSystem in advancedUser!").as_str().unwrap()).unwrap(); +// let username = userdata.as_table().unwrap().get("username").expect("Can't find username in advancedUser!").as_str().unwrap().to_string(); +// ( +// Uuid::parse_str(uuid).unwrap(), +// Userinfo { username, +// uuid: Uuid::parse_str(uuid).unwrap(), +// auth_system, +// token: None +// } +// )}) +// .collect() +// } + +pub fn update_advanced_users(value: &toml::Table, umanager: &UManager) { + let users: Vec<(Uuid, Userinfo)> = value .iter() .map( |(uuid, userdata)| { let auth_system = AuthSystem::from_str(userdata.as_table().unwrap().get("authSystem").expect("Can't find authSystem in advancedUser!").as_str().unwrap()).unwrap(); @@ -50,9 +67,14 @@ pub fn collect_advanced_users(value: &toml::Table) -> Vec<(Uuid, Userinfo)> { token: None } )}) - .collect() + .collect(); + + for (uuid, userinfo) in users { + umanager.insert_user(uuid, userinfo); + } } + pub fn format_uuid(uuid: &Uuid) -> String { // let uuid = Uuid::parse_str(&uuid)?; TODO: Вероятно format_uuid стоит убрать // .map_err(|_| tide::Error::from_str(StatusCode::InternalServerError, "Failed to parse UUID"))?;