feat: persist playtime that failed to sync on leveldb

This commit is contained in:
Zamitto
2025-05-22 13:11:32 -03:00
parent f9d5cfce73
commit 772aea69a9
4 changed files with 59 additions and 22 deletions

View File

@@ -4,7 +4,8 @@ import { SystemPath } from "./services/system-path";
export const defaultDownloadsPath = SystemPath.getPath("downloads");
export const isStaging = import.meta.env.MAIN_VITE_API_URL.includes("staging");
export const isStaging =
true || import.meta.env.MAIN_VITE_API_URL.includes("staging");
export const windowsStartMenuPath = path.join(
SystemPath.getPath("appData"),
@@ -26,11 +27,10 @@ export const commonRedistPath = path.join(
"CommonRedist"
);
export const logsPath = path.join(SystemPath.getPath("userData"), "logs");
export const seedsPath = app.isPackaged
? path.join(process.resourcesPath, "seeds")
: path.join(__dirname, "..", "..", "seeds");
export const logsPath = path.join(
SystemPath.getPath("userData"),
`logs${isStaging ? "-staging" : ""}`
);
export const achievementSoundPath = app.isPackaged
? path.join(process.resourcesPath, "achievement.wav")

View File

@@ -4,7 +4,7 @@ import i18n from "i18next";
import path from "node:path";
import url from "node:url";
import { electronApp, optimizer } from "@electron-toolkit/utils";
import { logger, WindowManager } from "@main/services";
import { logger, clearGamesPlaytime, WindowManager } from "@main/services";
import resources from "@locales";
import { PythonRPC } from "./services/python-rpc";
import { db, levelKeys } from "./level";

View File

@@ -225,7 +225,18 @@ function onOpenGame(game: Game) {
});
if (game.remoteId) {
updateGamePlaytime(game, 0, new Date()).catch(() => {});
updateGamePlaytime(
game,
game.unsyncedDeltaPlayTimeInMilliseconds ?? 0,
new Date()
)
.then(() => {
gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
...game,
unsyncedDeltaPlayTimeInMilliseconds: 0,
});
})
.catch(() => {});
if (game.automaticCloudSync) {
CloudSync.uploadSaveGame(
@@ -260,22 +271,34 @@ function onTickGame(game: Game) {
});
if (currentTick % TICKS_TO_UPDATE_API === 0) {
const deltaToSync =
now -
gamePlaytime.lastSyncTick +
(game.unsyncedDeltaPlayTimeInMilliseconds ?? 0);
const gamePromise = game.remoteId
? updateGamePlaytime(
game,
now - gamePlaytime.lastSyncTick,
game.lastTimePlayed!
)
? updateGamePlaytime(game, deltaToSync, game.lastTimePlayed!)
: createGame(game);
gamePromise
.then(() => {
gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
...game,
unsyncedDeltaPlayTimeInMilliseconds: 0,
});
})
.catch(() => {
gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
...game,
unsyncedDeltaPlayTimeInMilliseconds: deltaToSync,
});
})
.finally(() => {
gamesPlaytime.set(levelKeys.game(game.shop, game.objectId), {
...gamePlaytime,
lastSyncTick: now,
});
})
.catch(() => {});
});
}
}
@@ -286,12 +309,6 @@ const onCloseGame = (game: Game) => {
gamesPlaytime.delete(levelKeys.game(game.shop, game.objectId));
if (game.remoteId) {
updateGamePlaytime(
game,
performance.now() - gamePlaytime.lastSyncTick,
game.lastTimePlayed!
).catch(() => {});
if (game.automaticCloudSync) {
CloudSync.uploadSaveGame(
game.objectId,
@@ -300,7 +317,26 @@ const onCloseGame = (game: Game) => {
CloudSync.getBackupLabel(true)
);
}
const deltaToSync =
performance.now() -
gamePlaytime.lastSyncTick +
(game.unsyncedDeltaPlayTimeInMilliseconds ?? 0);
return updateGamePlaytime(game, deltaToSync, game.lastTimePlayed!)
.then(() => {
return gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
...game,
unsyncedDeltaPlayTimeInMilliseconds: 0,
});
})
.catch(() => {
return gamesSublevel.put(levelKeys.game(game.shop, game.objectId), {
...game,
unsyncedDeltaPlayTimeInMilliseconds: deltaToSync,
});
});
} else {
createGame(game).catch(() => {});
return createGame(game).catch(() => {});
}
};

View File

@@ -34,6 +34,7 @@ export interface Game {
title: string;
iconUrl: string | null;
playTimeInMilliseconds: number;
unsyncedDeltaPlayTimeInMilliseconds?: number;
lastTimePlayed: Date | null;
objectId: string;
shop: GameShop;