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<string> {
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;
}
}
}