import { ManaPlusApp } from "./manaApp.interface"; import { app } from "electron"; import * as fs from "fs-extra"; import { Status } from "../../status"; import { download, Progress as ProgressType } from "../../util/downloader"; import * as extract from "extract-zip"; import { getRequest } from "../../util/webrequest"; export class ManaPlusAppWindows implements ManaPlusApp { private path: string; public readonly startCommand: string; versionRegEx: RegExp = /.*ManaPlus ([\d.]+) Windows.*/g; constructor() { const ManaPath = app.getPath("userData") + "\\manaplus"; fs.existsSync(ManaPath) || fs.mkdirSync(ManaPath); fs.existsSync(app.getPath("userData") + "\\temp") || fs.mkdirSync(app.getPath("userData") + "\\temp"); this.path = ManaPath; this.startCommand = this.path + "\\Mana\\manaplus.exe"; } getGameDir(): string { return this.path + "\\Mana\\"; } getVersion(): Promise { return new Promise((res, rej) => { let output: string; const child = require("child_process").execFile( this.startCommand, ["-v"], function (err: Error, data: any) { output = data.toString(); } ); child.on("close", () => { output = output.replace(this.versionRegEx, "$1"); res(output); }); child.on("error", () => { rej(new Error("Version check failed")); }); }); } isInstalled(): boolean { return fs.existsSync(this.path + "\\Mana\\manaplus.exe"); } async update() { fs.existsSync(app.getPath("userData") + "\\temp") || fs.mkdirSync(app.getPath("userData") + "\\temp"); // Get Update URL Status.setProgress(500); Status.setActivity("Fetching Download URL"); let downloadURL; try { let versions = await getRequest( "https://tmw2.org/manalauncher/versions.json?" + Date.now() ); downloadURL = versions.windows64.file; } catch (e) { console.log(e); throw new Error("Download Url fetching error"); } Status.setProgress(-1); const updateDestination: string = `${app.getPath( "userData" )}\\temp\\update.zip`; try { await download(downloadURL, updateDestination, (state: ProgressType) => { Status.setProgress(Math.floor(state.percent * 100)); const speed = Math.floor(Math.floor(state.speed) / 1024); Status.setActivity(`Downloading ManaPlus... ${speed} KiB/s`); console.log(state); }); } catch (e) { console.log(e); throw new Error("Download error"); } Status.setProgress(500); //IDEA: Check Integrity of the download // Backup old files Status.setActivity(`Backup Old version`); try { await fs.remove(this.path + "\\Mana2"); if (fs.existsSync(this.path + "\\Mana")) await fs.move(this.path + "\\Mana", this.path + "\\Mana2"); console.log("Backup old version done."); } catch (err) { Status.showError( "Backup old version Failed", err.message, `Backup old version Failed: ${err.message}` ); throw new Error("Backup error"); } Status.setProgress(500); Status.setActivity(`ManaPlus download completed. Unziping..`); const extraction = new Promise((resolve, reject) => { extract(updateDestination, { dir: this.path }, function (err) { if (err) { console.log(err); Status.showError( "ManaPlus unziping failed", err.message, `Unzip Failed: ${err.message}` ); reject(new Error("Extraction Error")); } resolve(); }); }); await extraction; Status.setActivity("Unziping completed"); //IDEA: Check Integrity of gamefiles // DELETE Old File and remove update file Status.setActivity("Cleaning up (Deleting update files)"); try { await fs.remove(this.path + "\\Mana2"); await fs.remove(updateDestination); console.log("Cleanup done"); } catch (err) { console.error(err); Status.showError( "Clean up Failed", "Please remove '" + updateDestination + "' and '" + "this.path" + "\\Mana2" + "' manualy", `Unzip Failed: ${err.message}` ); } Status.setProgress(-1); //Status.showError("Unziping isn't implemented yet", "WIP", "not further implemented") Status.setActivity("Update successfull"); return 0; } async updateAvailable(): Promise<{ isNewVersion: boolean; newestVersion: string; }> { try { let versions = await getRequest( "https://tmw2.org/manalauncher/versions.json?" + Date.now() ); let currect_version = (await this.isInstalled) ? await this.getVersion() : "-"; return { isNewVersion: currect_version.indexOf(versions.windows64.version) === -1, newestVersion: versions.windows64.version, }; } catch (e) { throw e; } } }