diff options
author | metamuffin <metamuffin@disroot.org> | 2025-06-20 18:21:11 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-06-20 18:21:11 +0200 |
commit | 071dba66042381950c361cdf8e83b1d07720d1d8 (patch) | |
tree | aa385c6643c7f6e1cda76b5062ace7c432e750d1 /server | |
parent | 090d419f3d66e4a758ec9b8ae9fb37bbf24d7830 (diff) | |
download | hurrycurry-071dba66042381950c361cdf8e83b1d07720d1d8.tar hurrycurry-071dba66042381950c361cdf8e83b1d07720d1d8.tar.bz2 hurrycurry-071dba66042381950c361cdf8e83b1d07720d1d8.tar.zst |
replace xdg crate with directories for wider platform support
Diffstat (limited to 'server')
-rw-r--r-- | server/Cargo.toml | 2 | ||||
-rw-r--r-- | server/src/scoreboard.rs | 26 |
2 files changed, 20 insertions, 8 deletions
diff --git a/server/Cargo.toml b/server/Cargo.toml index f23c2c7c..a90496d0 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -26,7 +26,7 @@ reqwest = { version = "0.12.19", optional = true, default-features = false, feat ] } pollster = "0.4.0" bincode = "2.0.1" -xdg = "3.0.0" +directories = "6.0.0" igd = { version = "0.12.1", optional = true, features = ["aio"] } get_if_addrs = { version = "0.5.3", optional = true } mdns-sd = { version = "0.13.9", optional = true } diff --git a/server/src/scoreboard.rs b/server/src/scoreboard.rs index f2fb86a2..421a110e 100644 --- a/server/src/scoreboard.rs +++ b/server/src/scoreboard.rs @@ -16,11 +16,13 @@ */ use anyhow::Result; +use directories::ProjectDirs; use hurrycurry_protocol::Score; +use log::warn; use serde::{Deserialize, Serialize}; use std::{cmp::Reverse, collections::HashMap}; use tokio::{ - fs::{read_to_string, rename, File}, + fs::{create_dir_all, read_to_string, rename, File}, io::AsyncWriteExt, }; @@ -39,22 +41,32 @@ pub struct ScoreboardEntry { pub score: Score, } +fn project_dirs() -> Option<ProjectDirs> { + ProjectDirs::from("org", "hurrycurry", "hurrycurry") +} + impl ScoreboardStore { pub async fn load() -> Result<Self> { - let path = - xdg::BaseDirectories::with_prefix("hurrycurry").place_data_file("scoreboards.json")?; + let Some(dir) = project_dirs() else { + warn!("scoreboard load skipped; no data dir for this platform"); + return Ok(Self::default()); + }; // TOCTOU because its easier that way + let path = dir.data_dir().join("scoreboards.json"); if !path.exists() { + create_dir_all(dir.data_dir()).await?; ScoreboardStore::default().save().await?; } let s = read_to_string(path).await?; Ok(serde_json::from_str(&s)?) } pub async fn save(&self) -> Result<()> { - let path = - xdg::BaseDirectories::with_prefix("hurrycurry").place_data_file("scoreboards.json")?; - let buffer_path = - xdg::BaseDirectories::with_prefix("hurrycurry").place_data_file("scoreboards.json~")?; + let Some(dir) = project_dirs() else { + warn!("scoreboard save skipped; no data dir for this platform"); + return Ok(()); + }; + let path = dir.data_dir().join("scoreboards.json"); + let buffer_path = dir.data_dir().join("scoreboards.json~"); File::create(&buffer_path) .await? .write_all(serde_json::to_string(self)?.as_bytes()) |