diff options
Diffstat (limited to 'app.js')
-rw-r--r-- | app.js | 326 |
1 files changed, 326 insertions, 0 deletions
@@ -0,0 +1,326 @@ +console.log(" _ __ _ _ _ \n| |/ /__ _ _ __| |_(_) | __\n| ' // _` | '__| __| | |/ /\n| . \\ (_| | | | |_| | < \n|_|\\_\\__,_|_| \\__|_|_|\\_\\\n "); +switch (require('./package.json').channel) { + case "stable": + console.log(" Kartik " + require('./package.json').version + " (Official Release) [stable]\n"); + break; + case "eap": + console.log(" Kartik " + require('./package.json').version + " (Early Access Release) [eap]\n"); + break; + case "nightly": + console.log(" Kartik " + require('./package.json').version + " (Rawhide Release) [nightly]\n"); + break; + case "beta": + console.log(" Kartik " + require('./package.json').version + " (Branched Release) [beta]\n"); + break; + case "git": + console.log(" Kartik " + require('./package.json').version + " (Trunk Build) [git]\n"); + break; +} + +if (process.argv[2] === "m") { + console.log(" * *******************************************"); + console.log(" * * DATA MITIGATION MODE *"); + console.log(" * * *"); + console.log(" * * Unless you ABSOLUTELY need this, please *"); + console.log(" * * consider starting Kartik normally. *"); + console.log(" * *******************************************"); + if (!require('fs').existsSync(__dirname + "/data")) { + require('fs').mkdirSync(__dirname + "/data"); + } + global.homedir = __dirname + "/data"; +} else { + global.homedir = require('os').userInfo().homedir; +}; + +global.start = new Date(); +global.KartikRoot = __dirname; +global.shouldExitIfClosed = false; +const { app, BrowserWindow } = require('electron'); + +(async () => { + console.log(" * Gathering language"); + slpm = require('os-locale'); + slpw = await slpm(); + slpo = slpw.substr(0, 2); + slng = require('./lang/languages.json'); + if (Object.keys(slng).includes(slpo)) { + dlp = slpo; + } else { + dlp = "en"; + } + + process.on('uncaughtException', (error) => { + console.log(" * Starting recovery procedure: E_ERROR"); + id = new Date().toISOString(); + + require('fs').writeFileSync(homedir + "/.kartik/crashes/" + id + ".txt", "Kartik Bootstraper Crash\n\n" + error.stack); + if (require('os').platform() === "win32") { + require('child_process').exec("runtime\\kartik-crash.bat " + id); + } else if (require('os').platform() === "darwin") { + require('child_process').exec("./runtime/kartik-crash-mac.sh " + id); + } else { + require('child_process').exec("./runtime/kartik-crash.sh " + id); + } + process.exit(2); + }) + + process.on('unhandledRejection', (reason) => { + console.log(" * Starting recovery procedure: E_PROMISE"); + id = new Date().toISOString(); + + require('fs').writeFileSync(homedir + "/.kartik/crashes/" + id + ".txt", "Kartik Bootstraper Crash (in promise)\n\n" + reason); + if (require('os').platform() === "win32") { + require('child_process').exec("runtime\\kartik-crash.bat"); + } else if (require('os').platform() === "darwin") { + require('child_process').exec("./runtime/kartik-crash-mac.sh"); + } else { + require('child_process').exec("./runtime/kartik-crash.sh"); + } + process.exit(2); + }) + + /* --------------------- */ + + console.log(" * Creating configuration"); + + const fs = require('fs'); + + if (!fs.existsSync(homedir + "/.kartik")) { + fs.mkdirSync(homedir + "/.kartik"); + } + if (!fs.existsSync(homedir + "/.kartik/config")) { + fs.mkdirSync(homedir + "/.kartik/config"); + } + if (!fs.existsSync(homedir + "/.kartik/crashes")) { + fs.mkdirSync(homedir + "/.kartik/crashes"); + } + if (!fs.existsSync(homedir + "/.kartik/logs")) { + fs.mkdirSync(homedir + "/.kartik/logs"); + } + if (!fs.existsSync(homedir + "/.kartik/dumps")) { + fs.mkdirSync(homedir + "/.kartik/dumps"); + } + if (!fs.existsSync(homedir + "/.kartik/mods")) { + fs.mkdirSync(homedir + "/.kartik/mods"); + } + if (!fs.existsSync(homedir + "/.kartik/storage")) { + fs.mkdirSync(homedir + "/.kartik/storage"); + } + fs.writeFileSync(homedir + "/.kartik/config/scale.txt", "1.2"); + if (!fs.existsSync(homedir + "/.kartik/config/lang.txt")) { + fs.writeFileSync(homedir + "/.kartik/config/lang.txt", dlp); + } + if (!fs.existsSync(homedir + "/.kartik/config/music.txt")) { + fs.writeFileSync(homedir + "/.kartik/config/music.txt", "1"); + } + if (!fs.existsSync(homedir + "/.kartik/config/online.txt")) { + fs.writeFileSync(homedir + "/.kartik/config/online.txt", "1"); + } + if (!fs.existsSync(homedir + "/.kartik/config/voice.txt")) { + fs.writeFileSync(homedir + "/.kartik/config/voice.txt", "0"); + } + + /* --------------------- */ + + console.log(" * Checking channel"); + require('@electron/remote/main').initialize(); + + function createWindow () { + if (require('./package.json').channel === "stable") { + logo = "logo/logo.png"; + channel = " "; + global.dimg = "official"; + global.dimga = "stable"; + global.dchan = "Kartik Stable"; + } else if (require('./package.json').channel === "beta") { + logo = "logo/logo-beta.png"; + channel = " Beta "; + global.dimg = "beta"; + global.dimga = "beta"; + global.dchan = "Kartik Beta"; + } else if (require('./package.json').channel === "nightly") { + logo = "logo/logo-nightly.png"; + channel = " Nightly "; + global.dimg = "nightly"; + global.dimga = "nightly"; + global.dchan = "Kartik Nightly"; + } else if (require('./package.json').channel === "eap") { + logo = "logo/logo-eap.png"; + channel = " EAP "; + global.dimg = "eap"; + global.dimga = "eap"; + global.dchan = "Kartik EAP"; + } else if (require('./package.json').channel === "git") { + logo = "logo/logo-git.png"; + channel = " Trunk "; + global.dimg = "git"; + global.dimga = "git"; + global.dchan = "Kartik Trunk"; + try { + pk = require('./package.json'); + pk.version = require('fs').readFileSync("./.git/refs/heads/trunk").toString().substr(0, 7); + fs.writeFileSync("./package.json", JSON.stringify(pk, 2)) + } catch (e) {} + } + + console.log(" * Checking configuration"); + + scale = fs.readFileSync(homedir + "/.kartik/config/scale.txt").toString().trim() - 1 + 1 + lp = fs.readFileSync(homedir + "/.kartik/config/lang.txt").toString().trim() + + if (fs.readFileSync(homedir + "/.kartik/config/online.txt").toString().trim() === "0") { + fs.writeFileSync(homedir + "/.kartik/config/online.txt", "1"); + } + + if (scale !== 1 + && scale !== 0.9 + && scale !== 1.1 + && scale !== 1.2 + && scale !== 1.3 + && scale !== 1.4 + && scale !== 1.5 + && scale !== 1.6 + && scale !== 1.7 + && scale !== 1.8 + && scale !== 1.9 + && scale !== 2 + ) { + fs.writeFileSync(homedir + "/.kartik/config/scale.txt", "1.2"); + scale = 1; + } + + time = new Date() - start; + console.log(" * Started successfully in " + Math.round(time/1000) + " seconds"); + console.log(" * Why are you EVEN reading this?"); + load.close(); + console.log(" * Starting recovery procedure: E_PROMISE"); + global.win = new BrowserWindow({ + width: Math.round(720 * scale), + height: Math.round(540 * scale), + minWidth: Math.round(720 * scale), + minHeight: Math.round(540 * scale), + resizeable: true, + resizable: true, + maximizable: true, + show: false, + enableLargerThanScreen: true, + icon: logo, + backgroundColor: "#000000", + title: "Kartik", + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + enableRemoteModule: true, + webviewTag: true, + disableBlinkFeatures: "MediaSessionService", + } + }) + + global.shouldExitIfClosed = true; + win.hide(); + + console.log(" * Starting IPC engine"); + win.pwidth = Math.round(720 * scale); + win.pheight = Math.round(540 * scale); + win.log = console.log; + + win.debug = process.argv[2] === "d"; + win.channel = channel; + win.update = dimga; + win.gamepads = []; + win.controllerAttached = false; + win.webview = null; + win.dstate = "Kartik"; + win.ddetails = "Kartik"; + win.mods = mods; + + win.homedir = homedir; + + win.scale = scale; + win.lp = lp; + win.music = fs.readFileSync(homedir + "/.kartik/config/music.txt").toString().trim() === "1"; + win.voice = fs.readFileSync(homedir + "/.kartik/config/voice.txt").toString().trim() === "2"; + + // TODO: Enable online mode when stable + if (dimga === "stable") { + win.online = false; + } else { + win.online = fs.readFileSync(homedir + "/.kartik/config/online.txt").toString().trim() === "1"; + } + + win.resources = resources; + global.currentSongValue = null; + + console.log(" * Starting language preloader"); + require('./lang/preload.js'); + console.log(" * Starting Discord RPC"); + require('./discord/client.js'); + + console.log(" * Loading view"); + win.loadFile('./index.html') + win.setMenu(null); + + if (win.debug) { + console.log(" * *******************************************"); + console.log(" * * KARTIK DEBUG MODE *"); + console.log(" * *******************************************"); + win.openDevTools(); + } + + win.webContents.on('dom-ready', () => { + musicIpc = require('electron').ipcMain; + musicIpc.on('newmusic', (event, value) => { + win.webContents.send('setmusic', value); + }) + musicIpc.on('prefademusic', (event, value) => { + win.webContents.send('fademusic', value); + }) + musicIpc.on('preunfademusic', (event, value) => { + win.webContents.send('unfademusic', value); + }) + }) + } + + console.log(" * Preparing application paths"); + app.setAppLogsPath(homedir + "/.kartik/logs"); + app.setPath("crashDumps", homedir + "/.kartik/dumps"); + app.setPath('userData', homedir + "/.kartik/storage"); + app.whenReady().then(() => { + console.log(" * Starting splash screen"); + global.load = new BrowserWindow({ + width: 640, + height: 400, + resizeable: false, + resizable: false, + maximizable: false, + frame: false, + show: true, + enableLargerThanScreen: true, + icon: "logo/logo.png", + backgroundColor: "#4b4e50", + title: "Kartik", + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + enableRemoteModule: true, + webviewTag: true, + disableBlinkFeatures: "MediaSessionService", + } + }) + load.loadFile("./views/load.html"); + setTimeout(() => { + console.log(" * Generating resources pack"); + require('./modding/resources'); + console.log(" * Starting Kartik Modding Platform"); + require('./modding/parser'); + createWindow(); + }, 5000) + }) + + app.on('window-all-closed', () => { + if (shouldExitIfClosed) { + console.log(" * Bye!"); + app.quit() + } + }) +})(); |