feat: add saving and reading server setting from config file

This commit is contained in:
2026-08-18 21:55:30 +02:00
parent aebf4f626f
commit 894c4c1cfb
7 changed files with 204 additions and 14 deletions

118
Cargo.lock generated
View File

@@ -127,12 +127,14 @@ dependencies = [
name = "checkers" name = "checkers"
version = "0.0.1" version = "0.0.1"
dependencies = [ dependencies = [
"dirs",
"env_logger", "env_logger",
"log", "log",
"postcard", "postcard",
"rand", "rand",
"serde", "serde",
"tokio", "tokio",
"toml",
"uuid", "uuid",
] ]
@@ -197,6 +199,27 @@ dependencies = [
"thiserror", "thiserror",
] ]
[[package]]
name = "dirs"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
dependencies = [
"dirs-sys",
]
[[package]]
name = "dirs-sys"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
dependencies = [
"libc",
"option-ext",
"redox_users",
"windows-sys",
]
[[package]] [[package]]
name = "embedded-io" name = "embedded-io"
version = "0.4.0" version = "0.4.0"
@@ -278,6 +301,17 @@ dependencies = [
"slab", "slab",
] ]
[[package]]
name = "getrandom"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.4.2" version = "0.4.2"
@@ -425,6 +459,15 @@ version = "0.2.189"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]]
name = "libredox"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "lock_api" name = "lock_api"
version = "0.4.14" version = "0.4.14"
@@ -469,6 +512,12 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "option-ext"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.5" version = "0.12.5"
@@ -567,7 +616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
dependencies = [ dependencies = [
"chacha20", "chacha20",
"getrandom", "getrandom 0.4.2",
"rand_core", "rand_core",
] ]
@@ -586,6 +635,17 @@ dependencies = [
"bitflags 2.13.1", "bitflags 2.13.1",
] ]
[[package]]
name = "redox_users"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
dependencies = [
"getrandom 0.2.17",
"libredox",
"thiserror",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.13.1" version = "1.13.1"
@@ -685,6 +745,15 @@ dependencies = [
"zmij", "zmij",
] ]
[[package]]
name = "serde_spanned"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
dependencies = [
"serde_core",
]
[[package]] [[package]]
name = "signal-hook-registry" name = "signal-hook-registry"
version = "1.4.8" version = "1.4.8"
@@ -802,6 +871,45 @@ dependencies = [
"syn 3.0.3", "syn 3.0.3",
] ]
[[package]]
name = "toml"
version = "1.1.4+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5"
dependencies = [
"indexmap",
"serde_core",
"serde_spanned",
"toml_datetime",
"toml_parser",
"toml_writer",
"winnow",
]
[[package]]
name = "toml_datetime"
version = "1.1.1+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
dependencies = [
"serde_core",
]
[[package]]
name = "toml_parser"
version = "1.1.3+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56"
dependencies = [
"winnow",
]
[[package]]
name = "toml_writer"
version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.24" version = "1.0.24"
@@ -826,7 +934,7 @@ version = "1.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
dependencies = [ dependencies = [
"getrandom", "getrandom 0.4.2",
"js-sys", "js-sys",
"serde_core", "serde_core",
"wasm-bindgen", "wasm-bindgen",
@@ -950,6 +1058,12 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "winnow"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
[[package]] [[package]]
name = "wit-bindgen" name = "wit-bindgen"
version = "0.51.0" version = "0.51.0"

View File

@@ -10,12 +10,14 @@ authors = [ "szymon-jozef" ]
edition = "2024" edition = "2024"
[dependencies] [dependencies]
dirs = "6.0.0"
env_logger = "0.11.11" env_logger = "0.11.11"
log = "0.4.33" log = "0.4.33"
postcard = { version = "1.1.3", features = ["alloc"] } postcard = { version = "1.1.3", features = ["alloc"] }
rand = "0.10.2" rand = "0.10.2"
serde = { version = "1.0.229", features = ["derive"] } serde = { version = "1.0.229", features = ["derive"] }
tokio = { version = "1.53.1", features = ["full"] } tokio = { version = "1.53.1", features = ["full"] }
toml = "1.1.4"
[dependencies.uuid] [dependencies.uuid]
version = "1.24.0" version = "1.24.0"

View File

@@ -1,2 +1,3 @@
pub mod logic; pub mod logic;
pub mod network; pub mod network;
pub mod settings;

View File

@@ -23,15 +23,9 @@ use crate::{
}, },
network_identity::NetworkServerIdentity, network_identity::NetworkServerIdentity,
}, },
settings::{general_settings::SettingsLike, server_settings::ServerSettings},
}; };
// TODO! More settings!
pub struct ServerSettings {
pub addr: SocketAddr,
pub max_connections: usize,
pub allow_spectators: bool,
}
#[derive(PartialEq)] #[derive(PartialEq)]
enum ServerStage { enum ServerStage {
Lobby, Lobby,
@@ -71,11 +65,7 @@ pub struct Server {
impl Server { impl Server {
pub async fn new() -> Server { pub async fn new() -> Server {
// TODO! Should be read from a file // TODO! Should be read from a file
let settings = ServerSettings { let settings = ServerSettings::new();
addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6767),
max_connections: 2,
allow_spectators: false,
};
let (sender, reciever) = let (sender, reciever) =
tokio::sync::mpsc::channel::<(SocketAddr, Message<ClientMessage>)>(1024); // random tokio::sync::mpsc::channel::<(SocketAddr, Message<ClientMessage>)>(1024); // random

View File

@@ -0,0 +1,48 @@
use core::error;
use std::path::PathBuf;
use log::warn;
use serde::{Serialize, de::DeserializeOwned};
// maybe consider some better name for this
pub trait SettingsLike: Serialize + DeserializeOwned + Default {
fn get_config_dir() -> Result<PathBuf, Box<dyn error::Error>> {
Ok(dirs::config_local_dir()
.ok_or("Couldn't get config dir!")?
.join("checkers"))
}
fn get_file_path() -> Result<PathBuf, Box<dyn error::Error>>;
fn save_to_file(&self) -> Result<(), Box<dyn error::Error>> {
let path: PathBuf = Self::get_file_path()?;
if let Some(parent_dir) = path.parent() {
std::fs::create_dir_all(parent_dir)?;
}
let toml = toml::to_string(&self)?;
std::fs::write(path, toml)?;
Ok(())
}
fn read_from_file() -> Result<Self, Box<dyn error::Error>> {
Ok(toml::from_slice(&std::fs::read(Self::get_file_path()?)?)?) // i love rust
}
fn new() -> Self {
match Self::read_from_file() {
Ok(settings) => return settings,
Err(e) => warn!("Could not load settings from file, because: {}", e),
}
let settings = Self::default();
if let Err(e) = settings.save_to_file() {
warn!("Could not save server settings to the file, because: {}", e);
}
settings
}
}

2
src/settings/mod.rs Normal file
View File

@@ -0,0 +1,2 @@
pub mod general_settings;
pub mod server_settings;

View File

@@ -0,0 +1,33 @@
use std::{
net::{IpAddr, Ipv4Addr, SocketAddr},
path::PathBuf,
};
use serde::{Deserialize, Serialize};
use crate::settings::general_settings::SettingsLike;
// TODO! More settings!
#[derive(Serialize, Deserialize)]
pub struct ServerSettings {
pub addr: SocketAddr,
pub max_connections: usize,
pub allow_spectators: bool,
}
impl SettingsLike for ServerSettings {
fn get_file_path() -> Result<PathBuf, Box<dyn std::error::Error>> {
Ok(Self::get_config_dir()?.join("server.toml"))
}
}
impl Default for ServerSettings {
fn default() -> Self {
Self {
addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6767),
max_connections: 2, // Maybe this should be a const somewhere in the server code? It
// makes no sense to have different value than this
allow_spectators: false,
}
}
}