summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-06-20 18:21:11 +0200
committermetamuffin <metamuffin@disroot.org>2025-06-20 18:21:11 +0200
commit071dba66042381950c361cdf8e83b1d07720d1d8 (patch)
treeaa385c6643c7f6e1cda76b5062ace7c432e750d1 /server
parent090d419f3d66e4a758ec9b8ae9fb37bbf24d7830 (diff)
downloadhurrycurry-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.toml2
-rw-r--r--server/src/scoreboard.rs26
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())