From 071dba66042381950c361cdf8e83b1d07720d1d8 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Fri, 20 Jun 2025 18:21:11 +0200 Subject: replace xdg crate with directories for wider platform support --- server/src/scoreboard.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'server/src') 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::from("org", "hurrycurry", "hurrycurry") +} + impl ScoreboardStore { pub async fn load() -> Result { - 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()) -- cgit v1.2.3-70-g09d2