summaryrefslogblamecommitdiff
path: root/src/main/manaplus/manaApp/windows.ts
blob: 293fc72b0ebe4d569613bed51d62d1b2e8db5141 (plain) (tree)
1
2
3
4
5
6
7
8

                                                  
                               

                                                                         
                                       
                                                   
 


                                                        
                                      
                                                         




                                                                                                      
                                                          
   
 
                              
                                            

                                       












                                                                                                                





                                                                       
                                                                                                      


                                                







                                                                                                 
                           

                                                                                    
         
                                                                              
                                                          

                                                                     



                           
                                        
     
                            

                                           




























                                                                                                              

 













                                                                                                                                                           

             











                                                                                                 

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

	}
}