diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.ts | 6 | ||||
-rw-r--r-- | src/main/manaplus/manaApp/windows.ts | 79 | ||||
-rw-r--r-- | src/main/manaplus/manaplus.ts | 57 | ||||
-rw-r--r-- | src/main/status.ts | 2 |
4 files changed, 115 insertions, 29 deletions
diff --git a/src/main.ts b/src/main.ts index b9662dc..cf5ff4b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,9 +27,6 @@ const createWindow = () => { // and load the index.html of the app. mainWindow.loadURL(`file://${__dirname}/../assets/index.html`); - // Open the DevTools. - mainWindow.webContents.openDevTools(); - // Emitted when the window is closed. mainWindow.on('closed', () => { // Dereference the window object, usually you would store windows @@ -94,9 +91,10 @@ import { ManaPlus } from './main/manaplus/manaplus'; ManaPlus.init(); ipcMain.on('play', async (event:any, arg:any) => { + if(Status.getStatus().playing)return; console.log("play", arg); Status.setPlaying(true); - await ManaPlus.start(arg.server,arg.port,arg.engine,arg.username,arg.password); + await ManaPlus.start(arg.address,arg.port,arg.engine,arg.username,arg.password); //Status.showError("Failed To Launch Mana Plus","Not implemented yet!","Launch Manaplus faild: Not Implemented"); return false; }); diff --git a/src/main/manaplus/manaApp/windows.ts b/src/main/manaplus/manaApp/windows.ts index 0728e32..a5f5b02 100644 --- a/src/main/manaplus/manaApp/windows.ts +++ b/src/main/manaplus/manaApp/windows.ts @@ -1,9 +1,10 @@ import { ManaPlusApp } from './manaApp.interface'; import { app } from 'electron'; -//import * as path from 'path'; -import * as fs from 'fs'; +import * as fs from 'fs-extra'; import { Status } from '../../status'; import {download, Progress as ProgressType} from '../../util/downloader'; +import * as extract from 'extract-zip'; + export class ManaPlusAppWindows implements ManaPlusApp { private path:string; @@ -15,41 +16,99 @@ export class ManaPlusAppWindows implements ManaPlusApp { this.path = ManaPath; } run(parameters: string[]): void { + Status.setActivity(`Starting ManaPlus`); + const gameExe = this.path+"\\Mana\\manaplus.exe"; + console.log(gameExe, parameters); + const child = require('child_process').execFile(gameExe, parameters, function(err:Error, data:any) { + console.log(err); + console.log(data.toString()); + }); + child.on('close', ()=>{ + Status.setPlaying(false); + Status.removeActivity(); + }); + child.on('error', ()=>{ + Status.setPlaying(false); + //// TODO: Handle Error + }); } getGameDir(): string { - return this.path; + return this.path+"\\Mana\\"; } getVersion(): Promise<string> { - throw new Error("Not Installed."); + throw new Error("Not Implemented yet"); } 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"); //// TODO: Fetch update url Status.setProgress(-1); const downloadURL = 'https://[URL]/Mana.zip'; + + const updateDestination:string = `${app.getPath('userData')}\\temp\\update.zip`; try { - await download(downloadURL, `${app.getPath('userData')}\\temp\\update.zip`, (state:ProgressType) => { + await download(downloadURL, updateDestination, (state:ProgressType) => { Status.setProgress(Math.floor(state.percent*100)); Status.setActivity(`Downloading ManaPlus... ${state.speed}`); console.log(state); }); } catch (e){ console.log(e); - Status.showError("ManaPlus download failed", e.message, `DL Failed: ${e.message}`); - throw new Error("Download Error"); + } - Status.setProgress(100); - Status.setActivity(`ManaPlus download completed`); - Status.showError("Unziping isn't implemented yet", "WIP", "not further implemented") + Status.setProgress(500); + // 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; } updateAvailible(): Promise<{ isNewVersion: boolean; newestVersion: string; }> { diff --git a/src/main/manaplus/manaplus.ts b/src/main/manaplus/manaplus.ts index dfa86a7..22e4ffd 100644 --- a/src/main/manaplus/manaplus.ts +++ b/src/main/manaplus/manaplus.ts @@ -1,6 +1,10 @@ import { ManaPlusApp } from './ManaApp/manaApp.interface'; import { ManaPlusAppWindows } from './ManaApp/windows'; import * as os from 'os'; +import * as path from 'path'; +import * as fs from 'fs-extra'; +import { app } from 'electron'; +import { Status } from '../status'; let ManaPlusInstance:ManaPlusApp; @@ -23,9 +27,15 @@ export namespace ManaPlus{ return await ManaPlusInstance.update(); } - export async function start(server: any,engine: any,port: any,username: any,password: any){ - - const params = makeParams(server,engine,port,username,password); + export async function start(server: any,port: any,engine: any,username: any,password: any){ + let params:string[]; + try { + params = await makeParams(server,port,engine,username,password); + } catch (e){ + console.log(e); + Status.showError("Launch Preperation Failed", e.message, "Launch preparation failed") + return; + } let willUpdate:boolean=false; // check if it is installed willUpdate = !ManaPlusInstance.isInstalled(); @@ -47,15 +57,34 @@ function wasInitilized(){ return typeof(ManaPlusInstance) !== "undefined" && typeof(ManaPlusInstance) !== "undefined"; } -function makeParams(server: any,engine: any,port: any,username: any,password: any):string[]{ - // TODO check if everything is there - var parameters = [ - "-s"+server, - "-y"+engine, - "-p"+port, - "-U"+username, - "-P"+password, - ]; - // TODO make this function real - return []; +async function makeParams(server: any,port: any,engine: any,username?: any,password?: any):Promise<string[]>{ + let parameters:string[] = []; + if(server && engine && port){ + parameters.push(...[ + "-s", server, + "-y", engine, + "-p", port + ]); + if(username && password){ + parameters.push(...[ + "-U", username, + "-P", password + ]); + } + } + // Setup Paths and stuff + const configDir = path.normalize(app.getPath('userData')+"/mana_config"); + const localDataDir = path.normalize(app.getPath('userData')+"/mana_local_data"); + const screenshotsDir = path.normalize(app.getPath('userData')+`/screenshots/${server}`); + await fs.ensureDir(configDir); + await fs.ensureDir(localDataDir); + await fs.ensureDir(screenshotsDir); + parameters.push(...[ + "-C", configDir, + "-L", localDataDir, + "--screenshot-dir", screenshotsDir + ]); + console.log(parameters); + + return parameters; } diff --git a/src/main/status.ts b/src/main/status.ts index 537e31b..18fccd1 100644 --- a/src/main/status.ts +++ b/src/main/status.ts @@ -29,7 +29,7 @@ export namespace Status { status.ActivityIsError=false; updateStatus(); } - export function removeActivity(value: string){ + export function removeActivity(){ status.activity=null; status.ActivityIsError=false; updateStatus(); |