From 6fc66c710329915d6226cdd24c8d921b755f6d03 Mon Sep 17 00:00:00 2001 From: GedasFX Date: Sat, 24 Aug 2024 14:58:54 +0300 Subject: [PATCH] Fix --resync issue --- main.py | 5 --- package.json | 2 +- py_modules/logger_utils.py | 8 ++-- py_modules/rclone_sync_manager.py | 31 ++++++---------- src/helpers/apiClient.ts | 6 +-- src/helpers/backend.ts | 4 -- src/index.tsx | 9 ++--- src/pages/RenderDCSMenu.tsx | 20 +--------- src/pages/RenderSyncErrorLogPage.tsx | 55 ---------------------------- src/pages/RenderSyncLogPage.tsx | 51 +++++++++++++++++++++++++- 10 files changed, 72 insertions(+), 119 deletions(-) delete mode 100644 src/pages/RenderSyncErrorLogPage.tsx diff --git a/main.py b/main.py index 07bb0fd..b14219d 100644 --- a/main.py +++ b/main.py @@ -65,11 +65,6 @@ async def delete_lock_files(self): "Executing: RcloneSyncManager.delete_lock_files()") return await self.manager_sync.delete_lock_files() - async def needs_resync(self): - decky_plugin.logger.debug( - "Executing: RcloneSyncManager.needs_resync()") - return await self.manager_sync.needs_resync() - # Processes async def signal(self, pid: int, s: str): diff --git a/package.json b/package.json index e021f1f..ed9fcdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "decky-cloud-save", - "version": "1.4.0", + "version": "1.4.1-pre1", "description": "Manage cloud saves for games that do not support it in [current year].", "scripts": { "build": "shx rm -rf dist && rollup -c", diff --git a/py_modules/logger_utils.py b/py_modules/logger_utils.py index 5551ac3..96bfd2c 100644 --- a/py_modules/logger_utils.py +++ b/py_modules/logger_utils.py @@ -34,11 +34,11 @@ def get_last_sync_log() -> str: log: str = "" with open(decky_plugin.DECKY_PLUGIN_LOG) as f: for line in reversed(list(f)): - if(record==False): - if "Sync finished" in line: + if(record == False): + if "=== FINISHING SYNC ===" in line: record = True else: - if "Running command: /home/deck/homebrew/plugins/decky-cloud-save/bin/rcloneLauncher" in line.strip(): + if "=== STARTING SYNC ===" in line: break else: log = line + '\n' + log @@ -53,7 +53,7 @@ def get_plugin_log() -> str: """ log: str = "" with open(decky_plugin.DECKY_PLUGIN_LOG) as f: - for line in reversed(list(open(decky_plugin.DECKY_PLUGIN_LOG))): + for line in reversed(list(f)): log = line + '\n' + log if "Logger initialized at level" in line.strip(): break diff --git a/py_modules/rclone_sync_manager.py b/py_modules/rclone_sync_manager.py index 868bb81..4d890ff 100644 --- a/py_modules/rclone_sync_manager.py +++ b/py_modules/rclone_sync_manager.py @@ -5,6 +5,7 @@ import plugin_config import os import os.path +from glob import glob class RcloneSyncManager: @@ -14,11 +15,9 @@ async def delete_lock_files(self): """ Deletes rclone lock files """ - args = [decky_plugin.HOME + "/.cache/rclone/bisync/*.lck"] - cmd = ["rm", *args] - decky_plugin.logger.info( - "Running command: %s", subprocess.list2cmdline(cmd)) - await create_subprocess_exec(*cmd) + decky_plugin.logger.info("Deleting lock files.") + for hgx in glob(decky_plugin.HOME + "/.cache/rclone/bisync/*.lck"): + os.remove(hgx) async def sync_now(self, winner: str, resync: bool): """ @@ -54,9 +53,11 @@ async def sync_now(self, winner: str, resync: bool): decky_plugin.DECKY_PLUGIN_LOG, "--log-format", "none", "-v"]) cmd = [plugin_config.rclone_bin, *args] + + decky_plugin.logger.info("=== STARTING SYNC ===") + decky_plugin.logger.info( "Running command: %s", subprocess.list2cmdline(cmd)) - self.current_sync = await create_subprocess_exec(*cmd) async def probe(self): @@ -68,18 +69,8 @@ async def probe(self): """ if not self.current_sync: return 0 + + if self.current_sync.returncode is not None: + decky_plugin.logger.info("=== FINISHING SYNC ===") - return self.current_sync.returncode - - async def needs_resync(self): - """ - Checks if resync if needed. - - Returns: - bool: is needed - """ - dirPath = decky_plugin.HOME + "/.cache/rclone/bisync" - if not os.path.isdir(dirPath): - return True - else: - return len([name for name in os.listdir(dirPath)]) == 0 + return self.current_sync.returncode \ No newline at end of file diff --git a/src/helpers/apiClient.ts b/src/helpers/apiClient.ts index 74259eb..16ae095 100644 --- a/src/helpers/apiClient.ts +++ b/src/helpers/apiClient.ts @@ -169,18 +169,16 @@ export class ApiClient { let body; let time = 2000; - let action = () => { }; + let action = () => { Navigation.Navigate("/dcs-sync-logs"); }; const syncLogs = await Backend.getLastSyncLog(); Storage.setSessionStorageItem("syncLogs", syncLogs); if (pass) { body = Translator.translate("sync.completed", { "time": timeDiff }); - action = () => { Navigation.Navigate("/dcs-sync-logs"); }; } else { body = Translator.translate("sync.failed"); - time = 5000; - action = () => { Navigation.Navigate("/dcs-error-sync-logs"); }; + time = 15000; } if (showToast || (!pass)) { diff --git a/src/helpers/backend.ts b/src/helpers/backend.ts index d458b21..2f4a37c 100644 --- a/src/helpers/backend.ts +++ b/src/helpers/backend.ts @@ -96,8 +96,4 @@ export class Backend { public static async log(lvl: string, ...args: any): Promise { return Backend.backend_call<{ level: string, msg: string }, void>("log", { level: lvl, msg: `[UI]: ${JSON.stringify(args)}` }); } - - public static async needsResync(): Promise { - return Backend.backend_call<{}, boolean>("needs_resync", {}); - } } \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index 950fce2..663200e 100755 --- a/src/index.tsx +++ b/src/index.tsx @@ -10,7 +10,6 @@ import { Backend } from "./helpers/backend"; import { FaSave } from "react-icons/fa"; import ConfigurePathsPage from "./pages/ConfigurePathsPage"; import ConfigureBackendPage from "./pages/ConfigureBackendPage"; -import RenderSyncErrorLogPage from "./pages/RenderSyncErrorLogPage"; import RenderSyncLogPage from "./pages/RenderSyncLogPage"; import RenderPluginLogPage from "./pages/RenderPluginLogPage"; @@ -26,7 +25,6 @@ export default definePlugin((serverApi: ServerAPI) => { serverApi.routerHook.addRoute("/dcs-configure-paths", () => , { exact: true }); serverApi.routerHook.addRoute("/dcs-configure-backend", () => , { exact: true }); - serverApi.routerHook.addRoute("/dcs-error-sync-logs", () => , { exact: true }); serverApi.routerHook.addRoute("/dcs-sync-logs", () => , { exact: true }); serverApi.routerHook.addRoute("/dcs-plugin-logs", () => , { exact: true }); @@ -39,7 +37,7 @@ export default definePlugin((serverApi: ServerAPI) => { ApplicationState.setAppState("playing", String(e.bRunning)); if (shouldSync(gameInfo)) { - syncGame(e.bRunning); + syncGame(e); } } else { Logger.info("No futher actions"); @@ -55,17 +53,16 @@ export default definePlugin((serverApi: ServerAPI) => { Storage.clearAllSessionStorage(); serverApi.routerHook.removeRoute("/dcs-configure-paths"); serverApi.routerHook.removeRoute("/dcs-configure-backend"); - serverApi.routerHook.removeRoute("/dcs-error-sync-logs"); serverApi.routerHook.removeRoute("/dcs-sync-logs"); serverApi.routerHook.removeRoute("/dcs-plugin-logs"); }, }; }); -function syncGame(started: boolean) { +function syncGame(e: LifetimeNotification) { const currentState = ApplicationState.getAppState().currentState; let toast = currentState.toast_auto_sync === "true"; - if (started) { + if (e.bRunning) { // Only sync at start when bisync is enabled. No need to when its not. if (currentState.bisync_enabled === "true") { if (toast) { diff --git a/src/pages/RenderDCSMenu.tsx b/src/pages/RenderDCSMenu.tsx index 9e87757..cd989c5 100644 --- a/src/pages/RenderDCSMenu.tsx +++ b/src/pages/RenderDCSMenu.tsx @@ -20,17 +20,6 @@ export const Content: VFC<{}> = () => { ApiClient.getCloudBackend().then((e) => setHasProvider(!!e)); }, []); - const [needsResync, setNeedsSync] = useState(false); - setInterval(async () => { - if ( - ApplicationState.getAppState().currentState.playing === "false" && - ApplicationState.getAppState().currentState.bisync_enabled === "true" && - ApplicationState.getAppState().currentState.syncing === "false" - ) { - setNeedsSync(await Backend.needsResync()); - } - }, 1000); - return ( <> @@ -40,16 +29,11 @@ export const Content: VFC<{}> = () => { layout="below" disabled={appState.syncing === "true" || !hasProvider} onClick={() => { - if (needsResync) { - ApiClient.resyncNow("path1"); - } else { - ApiClient.syncNow(true); - } + ApiClient.syncNow(true); }} > }> - {needsResync && Translator.translate("resync.now")} - {!needsResync && Translator.translate("sync.now")} + {Translator.translate("sync.now")} {hasProvider === false && {Translator.translate("provider.not.configured")}.} diff --git a/src/pages/RenderSyncErrorLogPage.tsx b/src/pages/RenderSyncErrorLogPage.tsx deleted file mode 100644 index 38a453c..0000000 --- a/src/pages/RenderSyncErrorLogPage.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Navigation } from "decky-frontend-lib"; -import Container from "../components/Container"; -import { Translator } from "../helpers/translator"; -import { ApiClient } from "../helpers/apiClient"; -import { Storage } from "../helpers/storage"; -import { Toast } from "../helpers/toast"; - - -export default function RenderSyncErrorLogPage() { - Navigation.CloseSideMenus(); - const resyncNeeded = !(Storage.getSessionStorageItem("rcloneLogs")?.indexOf("Must run --resync") == -1); - const deleteLockNeeded = !(Storage.getSessionStorageItem("rcloneLogs")?.indexOf("rclone deletefile") == -1); - - return ( - -
-
{Storage.getSessionStorageItem("syncLogs")?.replace(/\n{2,}/g, '\n')}
-
-
- - - -
-
- ); -} diff --git a/src/pages/RenderSyncLogPage.tsx b/src/pages/RenderSyncLogPage.tsx index 2e23d15..9bf82f6 100644 --- a/src/pages/RenderSyncLogPage.tsx +++ b/src/pages/RenderSyncLogPage.tsx @@ -2,16 +2,63 @@ import { Navigation } from "decky-frontend-lib"; import Container from "../components/Container"; import { Translator } from "../helpers/translator"; import { Storage } from "../helpers/storage"; - +import { useMemo, useState } from "react"; +import { Toast } from "../helpers/toast"; +import { ApiClient } from "../helpers/apiClient"; export default function RenderSyncLogPage() { Navigation.CloseSideMenus(); + const [logs, _] = useState(() => Storage.getSessionStorageItem("syncLogs")?.replace(/\n{2,}/g, "\n") ?? ""); + return (
-
{Storage.getSessionStorageItem("syncLogs")?.replace(/\n{2,}/g, '\n')}
+
{logs}
+
); } + +function SyncLogErrorButtons({ logs }: { logs: string }) { + const deleteLockNeeded = useMemo(() => logs.indexOf("rclone deletefile") > 0, [logs]); + const resyncNeeded = useMemo(() => logs.indexOf("Must run --resync") > 0, [logs]); + + return ( +
+ + +
+ ); +}