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 (
{t("achievement_unlocked")}
-
{achievementInfo.displayName}
+
{achievements[0].displayName}
);