From a5303c1a0b1a927e8db11ffeffd5ea3f3f5cedf8 Mon Sep 17 00:00:00 2001 From: ryantaylor <2320507+ryantaylor@users.noreply.github.com> Date: Sat, 17 Feb 2024 18:15:11 -0500 Subject: [PATCH] Handle sync toggle checkbox. --- src-tauri/src/plugins/cohdb/sync/mod.rs | 51 ++++++++++++++++--------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/src-tauri/src/plugins/cohdb/sync/mod.rs b/src-tauri/src/plugins/cohdb/sync/mod.rs index 1e13463..62c9576 100644 --- a/src-tauri/src/plugins/cohdb/sync/mod.rs +++ b/src-tauri/src/plugins/cohdb/sync/mod.rs @@ -7,25 +7,28 @@ use tauri::{ plugin::{Builder, TauriPlugin}, AppHandle, EventHandler, Manager, Runtime, }; -use tauri_plugin_store::StoreBuilder; +use tauri_plugin_store::{Store, StoreBuilder}; use vault::{GameType, Replay}; use super::auth; #[derive(Debug)] -pub struct State { +pub struct State { playback_watcher: Mutex>, + store: Store, } pub fn init() -> TauriPlugin { Builder::new("cohdbsync") .invoke_handler(tauri::generate_handler![]) .setup(|app| { - let path = PathBuf::from(load_playback_path(app.clone())); + let store = load_store(app.clone()); + let path = PathBuf::from(load_playback_path(&store)); let watcher = init_watcher(path, app.clone()); app.manage(State { playback_watcher: Mutex::new(watcher), + store, }); listen_for_changes(app.clone()); @@ -42,7 +45,7 @@ pub fn listen_for_changes(handle: AppHandle) -> EventHandler { info!("playback directory changed to {dir}"); - *handle_.state::().playback_watcher.lock().unwrap() = + *handle_.state::>().playback_watcher.lock().unwrap() = init_watcher(PathBuf::from(dir), handle_.clone()); }) } @@ -74,10 +77,17 @@ fn watch(path: PathBuf, handle: AppHandle) -> notify::Result(event: Event, handle: AppHandle) { let Some(user) = auth::connected_user(handle.clone()).await else { - error!("cohdb user not connected, skipping sync"); + info!("cohdb user not connected, skipping sync"); return; }; + if let Some(enabled) = handle.state::>().store.get("autoSyncReplays") { + if !serde_json::from_value::(enabled.clone()).unwrap() { + info!("auto-sync disabled, skipping sync"); + return; + } + } + let path = event.paths[0].clone(); let bytes = match std::fs::read(path.clone()) { Ok(buf) => buf, @@ -126,21 +136,26 @@ fn includes_user(replay: &Replay, user: &User) -> bool { .any(|player| player.profile_id().is_some() && player.profile_id() == user.profile_id) } -fn load_playback_path(handle: AppHandle) -> String { - let mut store = StoreBuilder::new(handle, "config.dat".parse().unwrap()).build(); - match store.load() { - Ok(()) => { - if let Some(path) = store.get("playbackPath") { - serde_json::from_value(path.clone()).unwrap() - } else { - default_playback_path() - } - } - Err(err) => { - warn!("error loading store: {err}"); - default_playback_path() +fn load_store(handle: AppHandle) -> Store { + let mut store = StoreBuilder::new(handle, PathBuf::from("config.dat")).build(); + + if let Err(err) = store.load() { + warn!("error loading store from disk: {err}"); + info!("saving store file to disk"); + if let Err(err) = store.save() { + warn!("error saving store file to disk: {err}"); } } + + store +} + +fn load_playback_path(store: &Store) -> String { + if let Some(path) = store.get("playbackPath") { + serde_json::from_value(path.clone()).unwrap() + } else { + default_playback_path() + } } fn init_watcher(path: PathBuf, handle: AppHandle) -> Option {