summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/scoreboard.rs26
1 files changed, 19 insertions, 7 deletions
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())