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






                                                                           

                                                        




                                                            
                                                      

                                                        
                         
                                                           
   
 



                                  
                                      








                                                      


                                                         
                               


                                               
   
                          

                                                             

                  


                                                        

                                                

                    


                                                                   
                                            
                 


                                                     
                           
 


                                                     
         


                                                                               
                                                                     

                           
                 
                     
                                        
     
                            

                                           


                                             


                                                                   

                                              




                                                   




                                                                  


                                                                     
                           




                                          






                                                
                                             

                                        
 
                                             
                                                              
         


                                             

                         









                                      


                                                                                          
                                             
 
             




                                    
         





                                                                   
              


                                                                     
        
                 

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