added patching rx/ap, could be buggy

This commit is contained in:
HorizonCode 2023-11-24 07:20:24 +01:00
parent b70af50634
commit 58fa4a6329
5 changed files with 91 additions and 13 deletions

17
app.js
View File

@ -11,8 +11,10 @@ const windowName = require('get-window-by-name');
const terminalUtil = require('./terminalUtil'); const terminalUtil = require('./terminalUtil');
const osUtil = require('./osUtil'); const osUtil = require('./osUtil');
const appInfo = require('./appInfo'); const appInfo = require('./appInfo');
const executeUtil = require("./executeUtil");
const { DownloaderHelper } = require('node-downloader-helper'); const { DownloaderHelper } = require('node-downloader-helper');
let patcherLoc = undefined;
let tempOsuPath; let tempOsuPath;
let osuWindowInfo; let osuWindowInfo;
let isIngame; let isIngame;
@ -36,6 +38,13 @@ const run = () => {
if (!osuLoaded) { if (!osuLoaded) {
osuLoaded = true; osuLoaded = true;
//TODO: do patch //TODO: do patch
setTimeout(() => {
console.log("yes");
if (patcherLoc) {
console.log("running " + patcherLoc + " in dir " + path.dirname(patcherLoc));
executeUtil.runFileDetached(path.dirname(patcherLoc), patcherLoc);
}
}, 5000);
} }
const windowTitle = firstInstance.processTitle; const windowTitle = firstInstance.processTitle;
let rpcOsuVersion = ""; let rpcOsuVersion = "";
@ -215,8 +224,13 @@ const run = () => {
app.on('window-all-closed', () => { app.on('window-all-closed', () => {
app.quit() app.quit()
}) })
ipcMain.handle('launch', async () => { ipcMain.handle('launch', async (e, opts) => {
console.log(opts);
const patch = "patch" in opts && opts.patch;
const osuFolder = await config.get("osuPath"); const osuFolder = await config.get("osuPath");
if (patch) patcherLoc = path.join(osuFolder, "EZPPLauncher", "patcher.exe");
else patcherLoc = undefined;
await osuUtil.updateOsuCfg(path.join(osuFolder, "osu!.cfg")); await osuUtil.updateOsuCfg(path.join(osuFolder, "osu!.cfg"));
const osuConfig = await osuUtil.getLatestConfig(tempOsuPath); const osuConfig = await osuUtil.getLatestConfig(tempOsuPath);
const username = await config.get('username'); const username = await config.get('username');
@ -240,6 +254,7 @@ const run = () => {
if (!mainWindow.isVisible()) mainWindow.show(); if (!mainWindow.isVisible()) mainWindow.show();
setTimeout(async () => { setTimeout(async () => {
isIngame = false; isIngame = false;
osuLoaded = false;
await osuUtil.replaceUI(osuFolder, false); await osuUtil.replaceUI(osuFolder, false);
await doUpdateCheck(mainWindow); await doUpdateCheck(mainWindow);
mainWindow.closable = true; mainWindow.closable = true;

View File

@ -4,11 +4,12 @@ module.exports = {
childProcess.execFile(file, args, { childProcess.execFile(file, args, {
cwd: folder cwd: folder
}, (_err, _stdout, _stderr) => { }, (_err, _stdout, _stderr) => {
if (onExit)
onExit(); onExit();
}); });
}, },
runFileDetached: (folder, file, args) => { runFileDetached: (folder, file, args) => {
const subprocess = childProcess.spawn(file + " " + args, { const subprocess = childProcess.spawn(file + (args ? " " + args : ''), {
cwd: folder, cwd: folder,
detached: true, detached: true,
stdio: 'ignore' stdio: 'ignore'

View File

@ -64,8 +64,8 @@
</div> </div>
<div class="launch-button-section"> <div class="launch-button-section">
<button class="btn btn-lg btn-launch btn-accent" id="launch-btn" disabled>Launch</button> <button class="btn btn-lg btn-launch btn-accent" id="launch-btn" disabled>Launch</button>
<div class="patch-checkbox" style="display: none;"> <div class="patch-checkbox">
<input type="checkbox" id="enablePatching" disabled /> <input type="checkbox" id="enablePatching" checked/>
<label for="enablePatching" style="display: initial;">enable <label for="enablePatching" style="display: initial;">enable
Patching</label> Patching</label>
</div> </div>

View File

@ -11,6 +11,14 @@ const checkUpdateURL = "https://osu.ppy.sh/web/check-updates.php?action=check&st
const customUIDLLPath = "https://ez-pp.farm/assets/ezpp!ui.dll"; const customUIDLLPath = "https://ez-pp.farm/assets/ezpp!ui.dll";
const customUIDLLHash = "https://ez-pp.farm/assets/ezpp!ui.md5"; const customUIDLLHash = "https://ez-pp.farm/assets/ezpp!ui.md5";
const customUIDLLName = "ezpp!ui.dll"; const customUIDLLName = "ezpp!ui.dll";
const patcherHook = "https://ez-pp.farm/assets/patch.hook.dll";
const patcherHookHash = "https://ez-pp.farm/assets/patch.hook.md5";
const patcherHookName = "patch.hook.dll";
const patcherExe = "https://ez-pp.farm/assets/patcher.exe";
const patcherExeHash = "https://ez-pp.farm/assets/patcher.md5"
const patcherExeName = "patcher.exe";
const ignoredOsuEntities = [ const ignoredOsuEntities = [
'osu!auth.dll', 'osu!auth.dll',
] ]
@ -86,6 +94,11 @@ async function getEZPPUIMD5() {
return releaseData.data; return releaseData.data;
} }
async function getMD5Hash(url) {
const releaseData = await axios.get(url, {});
return releaseData.data;
}
async function filesThatNeedUpdate(osuPath, updateFiles) { async function filesThatNeedUpdate(osuPath, updateFiles) {
const filesToDownload = []; const filesToDownload = [];
for (const updatedFile of updateFiles) { for (const updatedFile of updateFiles) {
@ -122,11 +135,56 @@ async function filesThatNeedUpdate(osuPath, updateFiles) {
} }
const ezppUI = path.join(osuPath, "EZPPLauncher", customUIDLLName); const ezppUI = path.join(osuPath, "EZPPLauncher", customUIDLLName);
const hook = path.join(osuPath, "EZPPLauncher", patcherHookName);
const patcher = path.join(osuPath, "EZPPLauncher", patcherExeName);
if (await fu.existsAsync(hook)) {
const latestHookMd5Hash = (await getMD5Hash(patcherHookHash)).toLowerCase().trim();
const binaryHookContents = await fs.promises.readFile(hook);
const existingHookMD5 = crypto.createHash("md5").update(binaryHookContents).digest("hex").toLowerCase().trim();
if (existingHookMD5 != latestHookMd5Hash) {
filesToDownload.push({
folder: "EZPPLauncher",
fileName: patcherHookName,
fileURL: patcherHook
});
console.log("patcher has wrong hashsum (" + existingHookMD5 + " / " + latestHookMd5Hash + ")");
}
} else {
filesToDownload.push({
folder: "EZPPLauncher",
fileName: patcherHookName,
fileURL: patcherHook
});
console.log("patcher does not exist");
}
if (await fu.existsAsync(patcher)) {
const latestPatchMd5Hash = (await getMD5Hash(patcherExeHash)).toLowerCase().trim();
const binaryPatchContents = await fs.promises.readFile(patcher);
const existingPatchMD5 = crypto.createHash("md5").update(binaryPatchContents).digest("hex").toLowerCase().trim();
if (existingPatchMD5 != latestPatchMd5Hash) {
filesToDownload.push({
folder: "EZPPLauncher",
fileName: patcherExeName,
fileURL: patcherExe
});
console.log("patcher has wrong hashsum (" + existingPatchMD5 + " / " + latestPatchMd5Hash + ")")
}
} else {
filesToDownload.push({
folder: "EZPPLauncher",
fileName: patcherExeName,
fileURL: patcherExe
});
console.log("patcher does not exist");
}
if (await fu.existsAsync(ezppUI)) { if (await fu.existsAsync(ezppUI)) {
const latestMd5Hash = await getEZPPUIMD5(); const latestUIMd5Hash = (await getMD5Hash(customUIDLLHash)).toLowerCase().trim();
const binaryUIContents = await fs.promises.readFile(ezppUI); const binaryUIContents = await fs.promises.readFile(ezppUI);
const existingUIMD5 = crypto.createHash("md5").update(binaryUIContents).digest("hex"); const existingUIMD5 = crypto.createHash("md5").update(binaryUIContents).digest("hex").toLowerCase().trim();
if (existingUIMD5 != latestMd5Hash) { if (existingUIMD5 != latestUIMd5Hash) {
filesToDownload.push({ filesToDownload.push({
folder: "EZPPLauncher", folder: "EZPPLauncher",
fileName: "ezpp!ui.dll", fileName: "ezpp!ui.dll",
@ -141,6 +199,8 @@ async function filesThatNeedUpdate(osuPath, updateFiles) {
}) })
} }
console.log(JSON.stringify(filesToDownload, null, 2))
return filesToDownload; return filesToDownload;
} }
@ -149,16 +209,18 @@ async function downloadUpdateFiles(osuPath, filesToUpdate) {
let completedIndex = 0; let completedIndex = 0;
filesToUpdate.forEach(async (fileToUpdate) => { filesToUpdate.forEach(async (fileToUpdate) => {
let tempPath = osuPath;
if ("folder" in fileToUpdate) { if ("folder" in fileToUpdate) {
osuPath = path.join(osuPath, fileToUpdate.folder); tempPath = path.join(tempPath, fileToUpdate.folder);
if (!(await fu.existsAsync(osuPath))) await fs.promises.mkdir(osuPath); if (!(await fu.existsAsync(tempPath))) await fs.promises.mkdir(tempPath);
} }
const filePath = path.join(osuPath, fileToUpdate.fileName); const filePath = path.join(tempPath, fileToUpdate.fileName);
if (await fu.existsAsync(filePath)) if (await fu.existsAsync(filePath))
await fs.promises.rm(filePath); await fs.promises.rm(filePath);
const fileDownload = new DownloaderHelper(fileToUpdate.fileURL, osuPath, { const fileDownload = new DownloaderHelper(fileToUpdate.fileURL, tempPath, {
fileName: fileToUpdate.fileName, fileName: fileToUpdate.fileName,
override: true, override: true,
}); });

View File

@ -48,7 +48,7 @@ window.addEventListener('DOMContentLoaded', () => {
case "up-to-date": case "up-to-date":
$("#launch-btn").attr('disabled', true); $("#launch-btn").attr('disabled', true);
$('#launch-btn').html('Launching...'); $('#launch-btn').html('Launching...');
const result = await ipcRenderer.invoke("launch"); const result = await ipcRenderer.invoke("launch", { patch: true });
if (!result) { if (!result) {
Swal.fire({ Swal.fire({
title: 'Uh oh!', title: 'Uh oh!',