summaryrefslogtreecommitdiff
path: root/src/main/manaplus/manaApp/linux.ts
blob: 6c804d5b2151cad0cf4bb6c2f2a65581c387db28 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { ManaPlusApp } from "./manaApp.interface";
import { app } from "electron";
import * as fs from 'fs-extra';
import { getRequest } from "../../util/webrequest";
import { Status } from "../../status";
import { download, Progress as ProgressType } from "../../util/downloader";
import { promisify } from "util";

export class ManaPlusAppLinux implements ManaPlusApp {
    private path: string;
    startCommand: string;
    versionRegEx: RegExp = /.*ManaPlus ([\d.]+) Linux.*/g;//TODO
    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 = ManaPath + '/Mana.AppImage'
    }
    getGameDir(): string {
        throw new Error("getGameDir() is windows only!");
    }
    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.AppImage');
    }
    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.AppImage.version) === -1,
                newestVersion: versions.AppImage.version
            };
        } catch (e) {
            throw e;
        }
    }
    async update(): Promise<any> {
        fs.existsSync(app.getPath('userData') + "/temp") || fs.mkdirSync(app.getPath('userData') + "/temp");
        // Get Update URL
        Status.setProgress(500);
        Status.setProgress(-1);
        Status.setActivity("Fetching Download URL");
        let downloadURL;
        try {
            let versions = await getRequest("https://tmw2.org/manalauncher/versions.json?" + Date.now());
            downloadURL = versions.AppImage.file;
        } catch (e) {
            console.log(e);
            Status.showError("Download Url fetching error", e.message, `Download Url fetching error: ${e.message}`);
            throw new Error("Download Url fetching error");
        }
        Status.setProgress(-1);

        const updateDestination: string = `${app.getPath('userData')}/temp/update.AppImage`;

        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);
            Status.showError("Download error", e.message, `Download error: ${e.message}`);
            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.AppImage')
            if (fs.existsSync(this.path + '/Mana.AppImage'))
                await fs.move(this.path + '/Mana.AppImage', this.path + '/Mana2.AppImage');
            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. Instaling..`);
        try {
            console.log('Use chmod');
            const chmod = promisify(fs.chmod);
            await chmod(updateDestination, '755');
            
            console.log('Now move the thing!');
            await fs.move(updateDestination, this.path + '/Mana.AppImage');
            //await chmod(this.path + '/Mana.AppImage', '744');
        } catch (err) {
            console.log('Instalation error', err);
            Status.showError("Instalation failed", err ? err.message : 'undefined', `Instalation Failed: ${err ? err.message : 'undefined'}`);
            throw new Error("Instalation error");
        }

        Status.setActivity('Instalation completed');

        //IDEA: Check Integrity of gamefiles

        Status.setActivity('Update successfull');

        return 0;
    }
}