feat: searching new folders

This commit is contained in:
Zamitto 2024-10-03 20:26:45 -03:00
parent 7e2d9316f3
commit 9731035820
5 changed files with 158 additions and 52 deletions

View File

@ -55,7 +55,7 @@ const compareFile = async (game: Game, file: AchievementFile) => {
};
export const checkAchievementFileChange = async (games: Game[]) => {
const achievementFiles = findAllAchievementFiles();
const achievementFiles = await findAllAchievementFiles();
for (const game of games) {
const gameAchievementFiles = achievementFiles.get(game.objectID) || [];

View File

@ -9,54 +9,120 @@ import { Game } from "@main/entity";
const publicDir = path.join("C:", "Users", "Public", "Documents");
const programData = path.join("C:", "ProgramData");
const appData = app.getPath("appData");
const documents = app.getPath("documents");
const crackers = [
Cracker.codex,
Cracker.goldberg,
Cracker.goldberg2,
Cracker.rune,
Cracker.onlineFix,
Cracker.userstats,
Cracker.rld,
Cracker.creamAPI,
Cracker.skidrow,
Cracker.smartSteamEmu,
Cracker.empress,
];
const getPathFromCracker = (cracker: Cracker) => {
let folderPath: string;
let fileLocation: string[];
if (cracker === Cracker.onlineFix) {
folderPath = path.join(publicDir, Cracker.onlineFix);
fileLocation = ["Stats", "Achievements.ini"];
} else if (cracker === Cracker.goldberg) {
folderPath = path.join(appData, "Goldberg SteamEmu Saves");
fileLocation = ["achievements.json"];
} else if (cracker === Cracker.goldberg2) {
folderPath = path.join(appData, "GSE Saves");
fileLocation = ["achievements.json"];
} else if (cracker === Cracker.rld) {
folderPath = path.join(programData, Cracker.rld);
fileLocation = ["achievements.ini"];
} else {
folderPath = path.join(publicDir, "Steam", cracker);
fileLocation = ["achievements.ini"];
const getPathFromCracker = async (cracker: Cracker) => {
if (cracker === Cracker.smartSteamEmu) {
return [
{
folderPath: path.join(appData, "SmartSteamEmu"),
fileLocation: ["User", "Achievements"],
},
];
}
return { folderPath, fileLocation };
if (cracker === Cracker.onlineFix) {
return [
{
folderPath: path.join(publicDir, Cracker.onlineFix),
fileLocation: ["Stats", "Achievements.ini"],
},
];
}
if (cracker === Cracker.goldberg) {
return [
{
folderPath: path.join(appData, "Goldberg SteamEmu Saves"),
fileLocation: ["achievements.json"],
},
{
folderPath: path.join(appData, "GSE Saves"),
fileLocation: ["achievements.json"],
},
];
}
if (cracker === Cracker.rld) {
return [
{
folderPath: path.join(programData, "RLD!"),
fileLocation: ["achievements.ini"],
},
];
}
if (cracker === Cracker.creamAPI) {
return [
{
folderPath: path.join(appData, "CreamAPI"),
fileLocation: ["achievements.ini"],
},
];
}
if (cracker === Cracker.skidrow) {
return [
{
folderPath: path.join(documents, "SKIDROW"),
fileLocation: ["SteamEmu", "UserStats", "achiev.ini"],
},
{
folderPath: path.join(documents, "Player"),
fileLocation: ["SteamEmu", "UserStats", "achiev.ini"],
},
];
}
if (cracker === Cracker.codex) {
return [
{
folderPath: path.join(publicDir, "Steam", "CODEX"),
fileLocation: ["achievements.ini"],
},
{
folderPath: path.join(appData, "Steam", "CODEX"),
fileLocation: ["achievements.ini"],
},
];
}
return [
{
folderPath: path.join(publicDir, "Steam", cracker),
fileLocation: ["achievements.ini"],
},
];
};
export const findAchievementFiles = (game: Game) => {
export const findAchievementFiles = async (game: Game) => {
const achievementFiles: AchievementFile[] = [];
for (const cracker of crackers) {
const { folderPath, fileLocation } = getPathFromCracker(cracker);
for (const { folderPath, fileLocation } of await getPathFromCracker(
cracker
)) {
const filePath = path.join(folderPath, game.objectID, ...fileLocation);
const filePath = path.join(folderPath, game.objectID, ...fileLocation);
if (fs.existsSync(filePath)) {
achievementFiles.push({
type: cracker,
filePath: path.join(folderPath, game.objectID, ...fileLocation),
});
if (fs.existsSync(filePath)) {
achievementFiles.push({
type: cracker,
filePath,
});
}
}
}
@ -83,31 +149,33 @@ export const findAchievementFileInExecutableDirectory = (
};
};
export const findAllAchievementFiles = () => {
export const findAllAchievementFiles = async () => {
const gameAchievementFiles = new Map<string, AchievementFile[]>();
for (const cracker of crackers) {
const { folderPath, fileLocation } = getPathFromCracker(cracker);
for (const { folderPath, fileLocation } of await getPathFromCracker(
cracker
)) {
if (!fs.existsSync(folderPath)) {
continue;
}
if (!fs.existsSync(folderPath)) {
return gameAchievementFiles;
}
const objectIds = fs.readdirSync(folderPath);
const objectIds = fs.readdirSync(folderPath);
for (const objectId of objectIds) {
const filePath = path.join(folderPath, objectId, ...fileLocation);
for (const objectId of objectIds) {
const filePath = path.join(folderPath, objectId, ...fileLocation);
if (!fs.existsSync(filePath)) continue;
if (!fs.existsSync(filePath)) continue;
const achivementFile = {
type: cracker,
filePath,
};
const achivementFile = {
type: cracker,
filePath,
};
gameAchievementFiles.get(objectId)
? gameAchievementFiles.get(objectId)!.push(achivementFile)
: gameAchievementFiles.set(objectId, [achivementFile]);
gameAchievementFiles.get(objectId)
? gameAchievementFiles.get(objectId)!.push(achivementFile)
: gameAchievementFiles.set(objectId, [achivementFile]);
}
}
}

View File

@ -9,11 +9,28 @@ export const parseAchievementFile = async (
): Promise<UnlockedAchievement[]> => {
if (!existsSync(filePath)) return [];
if (type === Cracker.empress) {
return [];
}
if (type === Cracker.skidrow) {
const parsed = await iniParse(filePath);
return processSkidrow(parsed);
}
if (type === Cracker.smartSteamEmu) {
return [];
}
if (type === Cracker.creamAPI) {
return [];
}
if (type === Cracker.onlineFix) {
const parsed = await iniParse(filePath);
return processOnlineFix(parsed);
}
if (type === Cracker.goldberg || type === Cracker.goldberg2) {
if (type === Cracker.goldberg) {
const parsed = await jsonParse(filePath);
return processGoldberg(parsed);
}
@ -88,6 +105,24 @@ const processOnlineFix = (unlockedAchievements: any): UnlockedAchievement[] => {
return parsedUnlockedAchievements;
};
const processSkidrow = (unlockedAchievements: any): UnlockedAchievement[] => {
const parsedUnlockedAchievements: UnlockedAchievement[] = [];
const achievements = unlockedAchievements["Achievements"];
for (const achievement of Object.keys(achievements)) {
const unlockedAchievement = achievements[achievement].split("@");
if (unlockedAchievement[0] === "1") {
parsedUnlockedAchievements.push({
name: achievement,
unlockTime: unlockedAchievement[unlockedAchievement.length - 1],
});
}
}
return parsedUnlockedAchievements;
};
const processGoldberg = (unlockedAchievements: any): UnlockedAchievement[] => {
const newUnlockedAchievements: UnlockedAchievement[] = [];

View File

@ -9,7 +9,7 @@ import type { UnlockedAchievement } from "@types";
import { getGameAchievementData } from "./get-game-achievement-data";
export const updateAllLocalUnlockedAchievements = async () => {
const gameAchievementFilesMap = findAllAchievementFiles();
const gameAchievementFilesMap = await findAllAchievementFiles();
for (const objectId of gameAchievementFilesMap.keys()) {
const gameAchievementFiles = gameAchievementFilesMap.get(objectId)!;
@ -69,7 +69,7 @@ export const updateLocalUnlockedAchivements = async (objectId: string) => {
if (!game) return;
const gameAchievementFiles = findAchievementFiles(game);
const gameAchievementFiles = await findAchievementFiles(game);
console.log("Achievements files for", game.title, gameAchievementFiles);

View File

@ -29,7 +29,10 @@ export enum Cracker {
rune = "RUNE",
onlineFix = "OnlineFix",
goldberg = "Goldberg",
goldberg2 = "Goldberg2",
userstats = "user_stats",
rld = "RLD!",
empress = "EMPRESS",
skidrow = "SKIDROW",
creamAPI = "CreamAPI",
smartSteamEmu = "SmartSteamEmu",
}