import { ManaPlusApp } from "./manaApp.interface"; import { app } from "electron"; import * as fs from "fs-extra"; import { getRequest } from "../../util/webrequest"; import { Status } from "../../status"; import { download, Progress as ProgressType } from "../../util/downloader"; import { promisify } from "util"; export class ManaPlusAppLinux implements ManaPlusApp { private path: string; startCommand: string; versionRegEx: RegExp = /.*ManaPlus ([\d.]+) Linux.*/g; //TODO 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 = ManaPath + "/Mana.AppImage"; } getGameDir(): string { throw new Error("getGameDir() is windows only!"); } 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.AppImage"); } 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.AppImage.version) === -1, newestVersion: versions.AppImage.version, }; } catch (e) { throw e; } } async update(): Promise { fs.existsSync(app.getPath("userData") + "/temp") || fs.mkdirSync(app.getPath("userData") + "/temp"); // Get Update URL Status.setProgress(500); Status.setProgress(-1); Status.setActivity("Fetching Download URL"); let downloadURL; try { let versions = await getRequest( "https://tmw2.org/manalauncher/versions.json?" + Date.now() ); downloadURL = versions.AppImage.file; } catch (e) { console.log(e); Status.showError( "Download Url fetching error", e.message, `Download Url fetching error: ${e.message}` ); throw new Error("Download Url fetching error"); } Status.setProgress(-1); const updateDestination: string = `${app.getPath( "userData" )}/temp/update.AppImage`; 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); Status.showError( "Download error", e.message, `Download error: ${e.message}` ); 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.AppImage"); if (fs.existsSync(this.path + "/Mana.AppImage")) await fs.move( this.path + "/Mana.AppImage", this.path + "/Mana2.AppImage" ); 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. Instaling..`); try { console.log("Use chmod"); const chmod = promisify(fs.chmod); await chmod(updateDestination, "755"); console.log("Now move the thing!"); await fs.move(updateDestination, this.path + "/Mana.AppImage"); //await chmod(this.path + '/Mana.AppImage', '744'); } catch (err) { console.log("Instalation error", err); Status.showError( "Instalation failed", err ? err.message : "undefined", `Instalation Failed: ${err ? err.message : "undefined"}` ); throw new Error("Instalation error"); } Status.setActivity("Instalation completed"); //IDEA: Check Integrity of gamefiles Status.setActivity("Update successfull"); return 0; } }