diff options
author | LawnCable <lawncable.tmw2@simonlaux.de> | 2018-05-22 01:32:10 -0400 |
---|---|---|
committer | LawnCable <lawncable.tmw2@simonlaux.de> | 2018-05-22 01:32:10 -0400 |
commit | 4fdd86da90dd811378b153de31da542f9fabb355 (patch) | |
tree | 59f78e5cdf361b9f513c6f3dd5f23639841b5d7e /src | |
parent | d6ff248cee446218392567296cfcd2fb8723b066 (diff) | |
download | electron-4fdd86da90dd811378b153de31da542f9fabb355.tar.gz electron-4fdd86da90dd811378b153de31da542f9fabb355.tar.bz2 electron-4fdd86da90dd811378b153de31da542f9fabb355.tar.xz electron-4fdd86da90dd811378b153de31da542f9fabb355.zip |
started update logic for windows - only downloads the zip for now
Diffstat (limited to 'src')
-rw-r--r-- | src/main.ts | 22 | ||||
-rw-r--r-- | src/main/manaplus/manaApp/manaApp.interface.ts | 8 | ||||
-rw-r--r-- | src/main/manaplus/manaApp/windows.ts | 58 | ||||
-rw-r--r-- | src/main/manaplus/manaplus.ts | 61 | ||||
-rw-r--r-- | src/main/manaplus/update/updater.interface.ts | 6 | ||||
-rw-r--r-- | src/main/status.ts | 19 | ||||
-rw-r--r-- | src/main/util/downloader.ts | 28 | ||||
-rw-r--r-- | src/renderer/index.ts | 13 | ||||
-rw-r--r-- | src/renderer/serverView.ts | 3 |
9 files changed, 198 insertions, 20 deletions
diff --git a/src/main.ts b/src/main.ts index 40e999f..b9662dc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -74,15 +74,12 @@ ipcMain.on('debug', (event:any, arg:any)=> { mainWindow.webContents.closeDevTools(); else mainWindow.webContents.openDevTools(); + + Status.setActivity("Debug menue Toggled") }); import {Status} from './main/status'; -ipcMain.on('play', (event:any, arg:any)=> { - console.log("play", arg); - Status.setPlaying(true); - Status.setProgress(500); - setTimeout(()=>{Status.setPlaying(false);Status.removeProgress();}, 10000); -}); + //import {quit as drpcQuit} from './main/richpresence'; @@ -90,3 +87,16 @@ ipcMain.on('play', (event:any, arg:any)=> { app.on('quit', () => { //drpcQuit(); }); + + +import { ManaPlus } from './main/manaplus/manaplus'; + +ManaPlus.init(); + +ipcMain.on('play', async (event:any, arg:any) => { + console.log("play", arg); + Status.setPlaying(true); + await ManaPlus.start(arg.server,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/manaApp.interface.ts b/src/main/manaplus/manaApp/manaApp.interface.ts index 81368e6..f70b26a 100644 --- a/src/main/manaplus/manaApp/manaApp.interface.ts +++ b/src/main/manaplus/manaApp/manaApp.interface.ts @@ -1,6 +1,8 @@ -export default interface ManaPlusApplication { - constructor():void, +export interface ManaPlusApp { run(parameters:string[]):void, getGameDir():string, - getVersion():Promise<string> + getVersion():Promise<string>, + isInstalled():boolean, + updateAvailible():Promise<{isNewVersion:boolean, newestVersion:string}>, + update():Promise<any> } diff --git a/src/main/manaplus/manaApp/windows.ts b/src/main/manaplus/manaApp/windows.ts new file mode 100644 index 0000000..0728e32 --- /dev/null +++ b/src/main/manaplus/manaApp/windows.ts @@ -0,0 +1,58 @@ +import { ManaPlusApp } from './manaApp.interface'; +import { app } from 'electron'; +//import * as path from 'path'; +import * as fs from 'fs'; +import { Status } from '../../status'; +import {download, Progress as ProgressType} from '../../util/downloader'; + +export class ManaPlusAppWindows implements ManaPlusApp { + private path:string; + + 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; + } + run(parameters: string[]): void { + + } + getGameDir(): string { + return this.path; + } + getVersion(): Promise<string> { + throw new Error("Not Installed."); + } + isInstalled(): boolean { + return fs.existsSync(this.path+"\\Mana\\manaplus.exe"); + } + + async update() { + // Get Update URL + Status.setProgress(500); + Status.setActivity("Fetching Download URL"); + //// TODO: Fetch update url + Status.setProgress(-1); + const downloadURL = 'https://[URL]/Mana.zip'; + try { + await download(downloadURL, `${app.getPath('userData')}\\temp\\update.zip`, (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") + + + return 0; + } + updateAvailible(): Promise<{ isNewVersion: boolean; newestVersion: string; }> { + throw new Error("Method not implemented."); + } +} diff --git a/src/main/manaplus/manaplus.ts b/src/main/manaplus/manaplus.ts new file mode 100644 index 0000000..dfa86a7 --- /dev/null +++ b/src/main/manaplus/manaplus.ts @@ -0,0 +1,61 @@ +import { ManaPlusApp } from './ManaApp/manaApp.interface'; +import { ManaPlusAppWindows } from './ManaApp/windows'; +import * as os from 'os'; + +let ManaPlusInstance:ManaPlusApp; + +export namespace ManaPlus{ + + export const ERRORS = { + NOT_INITILIZED_YET_ERROR:new Error("The ManaPlus updater wasn't initilized") + } + + export function init(){ + if(os.platform() == "win32"){ + ManaPlusInstance = new ManaPlusAppWindows(); + console.log("GameDir:"+ManaPlusInstance.getGameDir()); + } + } + + export async function update(){ + if(!wasInitilized())throw ERRORS.NOT_INITILIZED_YET_ERROR; + + 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); + let willUpdate:boolean=false; + // check if it is installed + willUpdate = !ManaPlusInstance.isInstalled(); + //Check if update is availible and ask if the user wants to update + //TODO + + // Install/Update the gameclient if needed + if(willUpdate){ + await update(); + } + + //IDEA have client data updated here to, if needed + ManaPlusInstance.run(params); + + } +} + +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 []; +} diff --git a/src/main/manaplus/update/updater.interface.ts b/src/main/manaplus/update/updater.interface.ts deleted file mode 100644 index 1524649..0000000 --- a/src/main/manaplus/update/updater.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default interface ManaUpdater { - constructor():void, - updateAvailible():Promise<{isNewVersion:boolean, newestVersion:string}>, - update():Promise<any>, - reinstall():Promise<any> -} diff --git a/src/main/status.ts b/src/main/status.ts index ffd6551..537e31b 100644 --- a/src/main/status.ts +++ b/src/main/status.ts @@ -1,8 +1,10 @@ import { mainWindow } from '../main'; +import { dialog } from 'electron'; type STATUS = { progress:number, activity:string, + ActivityIsError:boolean, playing:boolean, } @@ -10,6 +12,7 @@ const status:STATUS = { progress:null, activity:null, playing:false, //Is manaplus starting or started + ActivityIsError:false, } export namespace Status { @@ -23,10 +26,22 @@ export namespace Status { } export function setActivity(value: string){ status.activity=value; + status.ActivityIsError=false; updateStatus(); } - export function setPlaying(value: boolean){ - status.playing=value; + export function removeActivity(value: string){ + status.activity=null; + status.ActivityIsError=false; + updateStatus(); + } + export function showError(title:string, message:string, activityMsg:string=message){ + status.activity = activityMsg; + status.ActivityIsError = true; + updateStatus(); + setTimeout(()=>{dialog.showErrorBox(title, message);},300); + } + export function setPlaying(playing: boolean){ + status.playing=playing; updateStatus(); } export function getStatus():STATUS{ diff --git a/src/main/util/downloader.ts b/src/main/util/downloader.ts new file mode 100644 index 0000000..075097d --- /dev/null +++ b/src/main/util/downloader.ts @@ -0,0 +1,28 @@ +var fs = require('fs'); +var request = require('request'); +var progress = require('request-progress'); + +export type Progress = { + percent:number, + speed:number, + size:{ + total:number, + transfered:number + }, + time:{ + elapsed:number, + remaining:number + } +}; + +export function download(url:string,targetLocation:string,onprogress: (state:Progress)=>void):Promise<any>{ + return new Promise((resolve:any,reject:any)=>{ + progress(request(url), { + throttle: 500 + }) + .on('progress', onprogress) + .on('error', reject) + .on('end', resolve) + .pipe(fs.createWriteStream(targetLocation)); + }); +} diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 944ee90..f83bd3f 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -18,7 +18,7 @@ document.ondragover = document.ondrop = (event) => { }; -const debugBtn = document.getElementById('debug'); +const debugBtn = document.getElementById('debug'); //debugBtn.hidden = true; @@ -26,3 +26,14 @@ debugBtn.addEventListener('click', () => { debugBtn.blur(); ipcRenderer.send('debug'); }); + +const activityLabel = document.getElementById('activity'); +const progressBar = document.getElementById('progress') as HTMLProgressElement; +ipcRenderer.on('status-update', (event:any, status:any) => { + activityLabel.innerText = status.activity; + if(status.ActivityIsError) + activityLabel.classList.add("error"); + else + activityLabel.classList.remove("error"); + progressBar.value = status.progress; +}) diff --git a/src/renderer/serverView.ts b/src/renderer/serverView.ts index 48ce923..3229187 100644 --- a/src/renderer/serverView.ts +++ b/src/renderer/serverView.ts @@ -104,8 +104,7 @@ function setBackground(){ } ipcRenderer.on('status-update', (event:any, status:any) => { - const message = `Asynchronous message reply: ${status}` - console.log(message, status); + // Everything that isnt server view related is in index.ts playBtn.disabled = status.playing; }) |