From beaa919c80256a479da879dae5c48fb2138a6309 Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:01:58 -0300 Subject: [PATCH 1/3] feat: refactoring notification window --- src/main/services/achievements/merge-achievements.ts | 6 ------ src/main/services/window-manager.ts | 6 ++++-- src/renderer/index.html | 2 +- src/renderer/src/app.css.ts | 1 - src/renderer/src/main.tsx | 4 ++-- src/renderer/src/pages/achievement/achievement.tsx | 6 ++++-- yarn.lock | 7 ++++++- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index 31ffc767..a5f3d369 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -85,12 +85,6 @@ export const mergeAchievements = async ( shop, achievementsInfo ); - - WindowManager.notificationWindow?.setBounds({ y: 50 }); - - setTimeout(() => { - WindowManager.notificationWindow?.setBounds({ y: -9999 }); - }, 4000); } const mergedLocalAchievements = unlockedAchievements.concat(newAchievements); diff --git a/src/main/services/window-manager.ts b/src/main/services/window-manager.ts index 70ad783d..e28e8b3a 100644 --- a/src/main/services/window-manager.ts +++ b/src/main/services/window-manager.ts @@ -104,19 +104,21 @@ export class WindowManager { maximizable: false, autoHideMenuBar: true, minimizable: false, - focusable: true, + focusable: false, skipTaskbar: true, frame: false, width: 240, height: 60, x: 25, - y: -9999, + y: 25, webPreferences: { preload: path.join(__dirname, "../preload/index.mjs"), sandbox: false, }, }); + this.notificationWindow.setIgnoreMouseEvents(true); + this.notificationWindow.webContents.openDevTools(); this.notificationWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true, }); diff --git a/src/renderer/index.html b/src/renderer/index.html index e2eea62c..b53595ff 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -9,7 +9,7 @@ content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: local: *; media-src 'self' local: data: *;" /> - +
diff --git a/src/renderer/src/app.css.ts b/src/renderer/src/app.css.ts index 4e0cf7a0..40e15835 100644 --- a/src/renderer/src/app.css.ts +++ b/src/renderer/src/app.css.ts @@ -35,7 +35,6 @@ globalStyle("body", { userSelect: "none", fontFamily: "Noto Sans, sans-serif", fontSize: vars.size.body, - background: vars.color.background, color: vars.color.body, margin: "0", }); diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx index 3478273b..bcb8fe80 100644 --- a/src/renderer/src/main.tsx +++ b/src/renderer/src/main.tsx @@ -28,7 +28,7 @@ import { import { store } from "./store"; import resources from "@locales"; -import { Achievemnt } from "./pages/achievement/achievement"; +import { Achievement } from "./pages/achievement/achievement"; import "./workers"; import { RepacksContextProvider } from "./context"; @@ -70,7 +70,7 @@ ReactDOM.createRoot(document.getElementById("root")!).render( - + diff --git a/src/renderer/src/pages/achievement/achievement.tsx b/src/renderer/src/pages/achievement/achievement.tsx index 7bc625d3..fbdcaa89 100644 --- a/src/renderer/src/pages/achievement/achievement.tsx +++ b/src/renderer/src/pages/achievement/achievement.tsx @@ -1,8 +1,9 @@ import { useEffect, useMemo, useState } from "react"; import achievementSound from "@renderer/assets/audio/achievement.wav"; import { useTranslation } from "react-i18next"; +import { vars } from "@renderer/theme.css"; -export function Achievemnt() { +export function Achievement() { const { t } = useTranslation("achievement"); const [achievementInfo, setAchievementInfo] = useState<{ @@ -39,7 +40,7 @@ export function Achievemnt() { }; }, [audio]); - if (!achievementInfo) return

Nada

; + if (!achievementInfo) return null; return (
Date: Wed, 2 Oct 2024 21:55:42 -0300 Subject: [PATCH 2/3] feat: add GSE Saves --- .../check-unlocked-achievements.ts | 2 +- .../find-steam-game-achivement-files.ts | 33 +++++++++---------- .../achievements/merge-achievements.ts | 9 +++-- src/shared/constants.ts | 1 + 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/services/achievements/check-unlocked-achievements.ts b/src/main/services/achievements/check-unlocked-achievements.ts index 1fa2c3f5..608ff5bd 100644 --- a/src/main/services/achievements/check-unlocked-achievements.ts +++ b/src/main/services/achievements/check-unlocked-achievements.ts @@ -6,7 +6,7 @@ export const checkUnlockedAchievements = ( unlockedAchievements: any ): UnlockedAchievement[] => { if (type === Cracker.onlineFix) return onlineFixMerge(unlockedAchievements); - if (type === Cracker.goldberg) + if (type === Cracker.goldberg || type === Cracker.goldberg2) return goldbergUnlockedAchievements(unlockedAchievements); if (type == Cracker.generic) return genericMerge(unlockedAchievements); return defaultMerge(unlockedAchievements); diff --git a/src/main/services/achievements/find-steam-game-achivement-files.ts b/src/main/services/achievements/find-steam-game-achivement-files.ts index 1f4a0a86..980f0ae8 100644 --- a/src/main/services/achievements/find-steam-game-achivement-files.ts +++ b/src/main/services/achievements/find-steam-game-achivement-files.ts @@ -9,6 +9,15 @@ import { Game } from "@main/entity"; const publicDir = path.join("C:", "Users", "Public", "Documents"); const appData = app.getPath("appData"); +const crackers = [ + Cracker.codex, + Cracker.goldberg, + Cracker.goldberg2, + Cracker.rune, + Cracker.onlineFix, + Cracker.generic, +]; + const addGame = ( achievementFiles: Map, achievementPath: string, @@ -39,14 +48,6 @@ const getObjectIdsInFolder = (path: string) => { }; export const findSteamGameAchievementFiles = (game: Game) => { - const crackers = [ - Cracker.codex, - Cracker.goldberg, - Cracker.rune, - Cracker.onlineFix, - Cracker.generic, - ]; - const achievementFiles: AchievementFile[] = []; for (const cracker of crackers) { let achievementPath: string; @@ -58,9 +59,9 @@ export const findSteamGameAchievementFiles = (game: Game) => { } else if (cracker === Cracker.goldberg) { achievementPath = path.join(appData, "Goldberg SteamEmu Saves"); fileLocation = ["achievements.json"]; - } else if (cracker === Cracker.generic) { - achievementPath = path.join(publicDir, Cracker.generic); - fileLocation = ["user_stats.ini"]; + } else if (cracker === Cracker.goldberg2) { + achievementPath = path.join(appData, "GSE Saves"); + fileLocation = ["achievements.json"]; } else { achievementPath = path.join(publicDir, "Steam", cracker); fileLocation = ["achievements.ini"]; @@ -102,13 +103,6 @@ export const findAchievementFileInExecutableDirectory = ( export const findAllSteamGameAchievementFiles = () => { const gameAchievementFiles = new Map(); - const crackers = [ - Cracker.codex, - Cracker.goldberg, - Cracker.rune, - Cracker.onlineFix, - ]; - for (const cracker of crackers) { let achievementPath: string; let fileLocation: string[]; @@ -116,6 +110,9 @@ export const findAllSteamGameAchievementFiles = () => { if (cracker === Cracker.onlineFix) { achievementPath = path.join(publicDir, Cracker.onlineFix); fileLocation = ["Stats", "Achievements.ini"]; + } else if (cracker === Cracker.goldberg2) { + achievementPath = path.join(appData, "GSE Saves"); + fileLocation = ["achievements.json"]; } else if (cracker === Cracker.goldberg) { achievementPath = path.join(appData, "Goldberg SteamEmu Saves"); fileLocation = ["achievements.json"]; diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index a5f3d369..0005598a 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -52,7 +52,9 @@ export const mergeAchievements = async ( const newAchievements = achievements .filter((achievement) => { return !unlockedAchievements.some((localAchievement) => { - return localAchievement.name === achievement.name.toUpperCase(); + return ( + localAchievement.name.toUpperCase() === achievement.name.toUpperCase() + ); }); }) .map((achievement) => { @@ -67,7 +69,10 @@ export const mergeAchievements = async ( .map((achievement) => { return JSON.parse(localGameAchievement?.achievements || "[]").find( (steamAchievement) => { - return achievement.name === steamAchievement.name; + return ( + achievement.name.toUpperCase() === + steamAchievement.name.toUpperCase() + ); } ); }) diff --git a/src/shared/constants.ts b/src/shared/constants.ts index 79f0e6bd..a92ea029 100644 --- a/src/shared/constants.ts +++ b/src/shared/constants.ts @@ -29,5 +29,6 @@ export enum Cracker { rune = "RUNE", onlineFix = "OnlineFix", goldberg = "Goldberg", + goldberg2 = "Goldberg2", generic = "Generic", } From f0e0abae8c1705f24d3853665d4f2992b30be677 Mon Sep 17 00:00:00 2001 From: Zamitto <167933696+zamitto@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:58:10 -0300 Subject: [PATCH 3/3] feat: showing achievements queue --- .../achievements/merge-achievements.ts | 3 ++ .../src/pages/achievement/achievement.tsx | 46 +++++++++++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts index 0005598a..dd4bd465 100644 --- a/src/main/services/achievements/merge-achievements.ts +++ b/src/main/services/achievements/merge-achievements.ts @@ -66,6 +66,9 @@ export const mergeAchievements = async ( if (newAchievements.length && publishNotification) { const achievementsInfo = newAchievements + .sort((a, b) => { + return a.unlockTime - b.unlockTime; + }) .map((achievement) => { return JSON.parse(localGameAchievement?.achievements || "[]").find( (steamAchievement) => { diff --git a/src/renderer/src/pages/achievement/achievement.tsx b/src/renderer/src/pages/achievement/achievement.tsx index fbdcaa89..27559e38 100644 --- a/src/renderer/src/pages/achievement/achievement.tsx +++ b/src/renderer/src/pages/achievement/achievement.tsx @@ -1,15 +1,18 @@ -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import achievementSound from "@renderer/assets/audio/achievement.wav"; import { useTranslation } from "react-i18next"; import { vars } from "@renderer/theme.css"; +interface AchievementInfo { + displayName: string; + iconUrl: string; +} + export function Achievement() { const { t } = useTranslation("achievement"); - const [achievementInfo, setAchievementInfo] = useState<{ - displayName: string; - icon: string; - } | null>(null); + const [achievements, setAchievements] = useState([]); + const achievementAnimation = useRef(-1); const audio = useMemo(() => { const audio = new Audio(achievementSound); @@ -24,11 +27,7 @@ export function Achievement() { if (!achievements) return; if (achievements.length) { - const achievement = achievements[0]; - setAchievementInfo({ - displayName: achievement.displayName, - icon: achievement.iconUrl, - }); + setAchievements((ach) => ach.concat(achievements)); } audio.play(); @@ -40,7 +39,26 @@ export function Achievement() { }; }, [audio]); - if (!achievementInfo) return null; + const hasAchievementsPending = achievements.length > 0; + + useEffect(() => { + if (hasAchievementsPending) { + let zero = performance.now(); + achievementAnimation.current = requestAnimationFrame( + function animateLock(time) { + if (time - zero > 3000) { + zero = performance.now(); + setAchievements((ach) => ach.slice(1)); + } + achievementAnimation.current = requestAnimationFrame(animateLock); + } + ); + } else { + cancelAnimationFrame(achievementAnimation.current); + } + }, [hasAchievementsPending]); + + if (!hasAchievementsPending) return null; return (
{achievementInfo.displayName}

{t("achievement_unlocked")}

-

{achievementInfo.displayName}

+

{achievements[0].displayName}

);