diff options
Diffstat (limited to 'src/utils.js')
-rw-r--r-- | src/utils.js | 404 |
1 files changed, 0 insertions, 404 deletions
diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index 5ba98e6..0000000 --- a/src/utils.js +++ /dev/null @@ -1,404 +0,0 @@ -const path = require("path"); -const fs = require("fs-extra"); -const { dialog, ipcMain, Notification } = require("electron"); - -const Emitter = require("events"); -const events = new Emitter(); - -const cli = require("./cli"); -const lang = require("./lang"); -const json = require("./modules/json"); -const version = require("./modules/version"); -const settings = require("./modules/settings"); -const requests = require("./modules/requests"); -const findgame = require("./modules/findgame"); - -const unzip = require("unzipper"); -const exec = require("child_process").exec; -const { https } = require("follow-redirects"); - -// Logs into the dev tools of the renderer -function winLog(msg) { - ipcMain.emit("win-log", msg, msg); -} - -// Sends an alert to the renderer -function winAlert(msg) { - ipcMain.emit("win-alert", msg, msg); -} - -// A simple function that checks if the game is running, which we use to -// not update Northstar when it is running. -async function isGameRunning() { - return new Promise(resolve => { - let procs = ["Titanfall2.exe", "Titanfall2-unpacked.exe", "NorthstarLauncher.exe"]; - // While we could use a Node module to do this instead, I - // decided not to do so. As this achieves exactly the same - // thing. And it's not much more clunky. - let cmd = (() => { - switch (process.platform) { - case "linux": return "ps -A"; - case "win32": return "tasklist"; - } - })(); - - exec(cmd, (err, stdout) => { - for (let i = 0; i < procs.length; i++) { - if (stdout.includes(procs[i])) { - resolve(true); - break - } - - if (i == procs.length - 1) {resolve(false)} - } - }); - }); -} - -// checks if any origin processes are running -async function isOriginRunning() { - return new Promise(resolve => { - let procs = ["Origin.exe", "OriginClientService.exe"]; - let cmd = (() => { - switch (process.platform) { - case "linux": return "ps -A"; - case "win32": return "tasklist"; - } - })(); - - exec(cmd, (err, stdout) => { - procs.forEach(proc => { - if (stdout.includes(proc)) { - resolve(true); - return; - } - resolve(false); - }); - }); - }); -} - -// kill origin processes -async function killOrigin() { - return new Promise(resolve => { - let proc = "Origin.exe"; //I'm pretty sure we only have to kill this one - let cmd = (() => { - switch (process.platform) { - case "linux": return "killall " + proc; - case "win32": return "taskkill /IM " + proc + " /F"; - } - })(); - - exec(cmd, (err, stdout) => { - // just try and fail silently if we don't find it w/e - resolve(true); - }); - }); -} - -// Handles auto updating Northstar. -// -// It uses isGameRunning() to ensure it doesn't run while the game is -// running, as that may have all kinds of issues. -function handleNorthstarUpdating() { - if (! settings.nsupdate || ! fs.existsSync("viper.json") || settings.gamepath.length === 0) { - return; - } - - async function _checkForUpdates() { - let localVersion = version.northstar(); - let distantVersion = await requests.getLatestNsVersion(); - if (distantVersion == false) { return; } - console.log(lang("cli.autoupdates.checking")); - - // Checks if NS is outdated - if (localVersion !== distantVersion) { - console.log(lang("cli.autoupdates.available")); - if (await isGameRunning()) { - console.log(lang("cli.autoupdates.gamerunning")); - new Notification({ - title: lang("gui.nsupdate.gaming.title"), - body: lang("gui.nsupdate.gaming.body") - }).show(); - } else { - console.log(lang("cli.autoupdates.updatingns")); - updateNorthstar(); - } - } else { - console.log(lang("cli.autoupdates.noupdate")); - } - - setTimeout( - _checkForUpdates, - 15 * 60 * 1000 - // interval in between each update check - // by default 15 minutes. - ); - } - - _checkForUpdates(); -} - - -// Requests to set the game path -// -// If running with CLI it takes in the --setpath argument otherwise it -// open the systems file browser for the user to select a path. -async function setpath(win, forcedialog) { - function setGamepath(folder) { - settings.gamepath = folder; - settings.zip = path.join(settings.gamepath + "/northstar.zip"); - settings.save(); - win.webContents.send("newpath", settings.gamepath); - ipcMain.emit("newpath", null, settings.gamepath); - - modpath = path.join(settings.gamepath, "R2Northstar/mods"); - } - - if (! win) { // CLI - setGamepath(cli.param("setpath")); - } else { // GUI - if (! forcedialog) { - function setGamepath(folder, forcedialog) { - settings.gamepath = folder; - settings.zip = path.join(settings.gamepath + "/northstar.zip"); - settings.save(); - win.webContents.send("newpath", settings.gamepath); - ipcMain.emit("newpath", null, settings.gamepath); - } - - let gamepath = await findgame(); - if (gamepath) { - setGamepath(gamepath); - return; - } - - winAlert(lang("general.missingpath")); - } - - // Fallback to manual selection - dialog.showOpenDialog({properties: ["openDirectory"]}).then(res => { - if (res.canceled) { - ipcMain.emit("newpath", null, false); - return; - } - if (! fs.existsSync(path.join(res.filePaths[0], "Titanfall2.exe"))) { - ipcMain.emit("wrong-path"); - return; - } - - setGamepath(res.filePaths[0]); - - cli.exit(); - return; - }).catch(err => {console.error(err)}) - } -} - -// Renames excluded files to their original name -function restoreExcludedFiles() { - for (let i = 0; i < settings.excludes.length; i++) { - let exclude = path.join(settings.gamepath + "/" + settings.excludes[i]); - if (fs.existsSync(exclude + ".excluded")) { - fs.renameSync(exclude + ".excluded", exclude); - } - } -} -// At start, restore excluded files who might have been created by an incomplete update process. -restoreExcludedFiles(); - -// Installs/Updates Northstar -// -// If Northstar is already installed it'll be an update, otherwise it'll -// install it. It simply downloads the Northstar archive from GitHub, if -// it's outdated, then extracts it into the game path. -// -// As to handle not overwriting files we rename certain files to -// <file>.excluded, then rename them back after the extraction. The -// unzip module does not support excluding files directly. -async function updateNorthstar() { - if (! gamepathExists()) {return} - - ipcMain.emit("ns-update-event", "cli.update.checking"); - console.log(lang("cli.update.checking")); - var ns_version = version.northstar(); - - const latestAvailableVersion = await requests.getLatestNsVersion(); - console.log(latestAvailableVersion) - if (latestAvailableVersion == false) { - ipcMain.emit("ns-update-event", "cli.update.noInternet"); - return; - } - - // Makes sure it is not already the latest version - if (ns_version === latestAvailableVersion) { - ipcMain.emit("ns-update-event", "cli.update.uptodate.short"); - console.log(lang("cli.update.uptodate"), ns_version); - - winLog(lang("gui.update.uptodate")); - cli.exit(); - return; - } else { - if (ns_version != "unknown") { - console.log(lang("cli.update.current"), ns_version); - }; - console.log(lang("cli.update.downloading") + ":", latestAvailableVersion); - ipcMain.emit("ns-update-event", "cli.update.downloading"); - } - - // Renames excluded files to <file>.excluded - for (let i = 0; i < settings.excludes.length; i++) { - let exclude = path.join(settings.gamepath + "/" + settings.excludes[i]); - if (fs.existsSync(exclude)) { - fs.renameSync(exclude, exclude + ".excluded"); - } - } - - // Start the download of the zip - https.get(requests.getLatestNsVersionLink(), (res) => { - let stream = fs.createWriteStream(settings.zip); - res.pipe(stream); - - let received = 0; - // Progress messages, we should probably switch this to - // percentage instead of how much is downloaded. - res.on("data", (chunk) => { - received += chunk.length; - ipcMain.emit("ns-update-event", lang("gui.update.downloading") + " " + (received / 1024 / 1024).toFixed(1) + "mb"); - }) - - stream.on("finish", () => { - stream.close(); - let extract = fs.createReadStream(settings.zip); - - winLog(lang("gui.update.extracting")); - ipcMain.emit("ns-update-event", "gui.update.extracting"); - console.log(lang("cli.update.downloaddone")); - // Extracts the zip, this is the part where we're actually - // installing Northstar. - extract.pipe(unzip.Extract({path: settings.gamepath})) - - let max = received; - received = 0; - - extract.on("data", (chunk) => { - received += chunk.length; - let percent = Math.floor(received / max * 100); - ipcMain.emit("ns-update-event", lang("gui.update.extracting") + " " + percent + "%"); - }) - - extract.on("end", () => { - extract.close(); - ipcMain.emit("getversion"); - - restoreExcludedFiles(); - - ipcMain.emit("gui-getmods"); - ipcMain.emit("get-version"); - ipcMain.emit("ns-update-event", "cli.update.uptodate.short"); - winLog(lang("gui.update.finished")); - console.log(lang("cli.update.finished")); - cli.exit(); - }) - }) - }) -} - -// Updates Viper itself -// -// This uses electron updater to easily update and publish releases, it -// simply fetches it from GitHub and updates if it's outdated, very -// useful. Not much we have to do on our side. -function updateViper(autoinstall) { - const { autoUpdater } = require("electron-updater"); - - if (! autoUpdater.isUpdaterActive()) { - if (settings.nsupdate) { - handleNorthstarUpdating(); - } - return cli.exit(); - } - - if (autoinstall) { - autoUpdater.on("update-downloaded", (info) => { - autoUpdater.quitAndInstall(); - }); - } - - autoUpdater.on("error", (info) => {cli.exit(1)}); - autoUpdater.on("update-not-available", (info) => { - // only check for NS updates if Viper itself has no updates and - // if NS auto updates is enabled. - if (settings.nsupdate || cli.hasArgs()) { - handleNorthstarUpdating(); - } - cli.exit(); - }); - - autoUpdater.checkForUpdatesAndNotify(); -} - -// Launches the game -// -// Either Northstar or Vanilla. Linux support is not currently a thing, -// however it'll be added at some point. -function launch(game_version) { - if (process.platform == "linux") { - winAlert(lang("cli.launch.linuxerror")); - console.error("error:", lang("cli.launch.linuxerror")); - cli.exit(1); - return; - } - - process.chdir(settings.gamepath); - switch(game_version) { - case "vanilla": - console.log(lang("general.launching"), "Vanilla..."); - exec("Titanfall2.exe", {cwd: settings.gamepath}); - break; - default: - console.log(lang("general.launching"), "Northstar..."); - exec("NorthstarLauncher.exe", {cwd: settings.gamepath}); - break; - } -} - -// Returns true/false depending on if the gamepath currently exists/is -// mounted, used to avoid issues... -function gamepathExists() { - return fs.existsSync(settings.gamepath); -} - -setInterval(() => { - if (gamepathExists()) { - ipcMain.emit("gui-getmods"); - } else { - if (fs.existsSync("viper.json")) { - if (settings.gamepath != "") { - ipcMain.emit("gamepath-lost"); - } - } - } -}, 1500) - -module.exports = { - winLog, - - updateViper, - updateNorthstar, - handleNorthstarUpdating, - - launch, - killOrigin, - isGameRunning, - isOriginRunning, - - setpath, - gamepathExists, - - lang, - setlang: (lang) => { - settings.lang = lang; - settings.save(); - }, -} |