aboutsummaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/gamepath.js61
-rw-r--r--src/modules/ipc.js32
-rw-r--r--src/modules/is_running.js5
-rw-r--r--src/modules/kill.js15
-rw-r--r--src/modules/launch.js6
-rw-r--r--src/modules/mods.js86
-rw-r--r--src/modules/packages.js12
-rw-r--r--src/modules/releases.js12
-rw-r--r--src/modules/requests.js19
-rw-r--r--src/modules/settings.js28
-rw-r--r--src/modules/update.js76
-rw-r--r--src/modules/version.js17
-rw-r--r--src/modules/window.js15
13 files changed, 346 insertions, 38 deletions
diff --git a/src/modules/gamepath.js b/src/modules/gamepath.js
index 8d28c29..9d12854 100644
--- a/src/modules/gamepath.js
+++ b/src/modules/gamepath.js
@@ -1,18 +1,77 @@
const path = require("path");
const fs = require("fs-extra");
+const win = require("../win");
const { dialog, ipcMain } = require("electron");
const cli = require("../cli");
const lang = require("../lang");
+const version = require("./version");
const win_show = require("./window");
const settings = require("./settings");
const findgame = require("./findgame");
-
let gamepath = {};
+ipcMain.on("setpath-cli", () => {gamepath.set()});
+ipcMain.on("setpath", (event, value, force_dialog) => {
+ if (! value) {
+ if (! win().isVisible()) {
+ gamepath.set(win(), force_dialog);
+ } else {
+ gamepath.set(win(), force_dialog || true);
+ }
+ } else if (! win().isVisible()) {
+ win().show();
+ }
+})
+
+
+// allows renderer to set a new renderer
+ipcMain.on("newpath", (event, newpath) => {
+ if (newpath === false && ! win().isVisible()) {
+ win().send("no-path-selected");
+ } else {
+ version.send_info();
+
+ if (! win().isVisible()) {
+ win().show();
+ }
+ }
+})
+
+ipcMain.on("wrong-path", () => {
+ win().send("wrong-path");
+})
+
+ipcMain.on("found-missing-perms", async (e, selected_gamepath) => {
+ await win_show.alert(lang("gui.gamepath.found_missing_perms") + selected_gamepath);
+ ipcMain.emit("setpath", null, false, true);
+})
+
+ipcMain.on("missing-perms", async (e, selected_gamepath) => {
+ await win_show.alert(lang("gui.gamepath.missing_perms") + selected_gamepath);
+ ipcMain.emit("setpath");
+})
+
+ipcMain.on("gamepath-lost-perms", async (e, selected_gamepath) => {
+ if (! gamepath.setting) {
+ gamepath.setting = true;
+ await win_show.alert(lang("gui.gamepath.lost_perms") + selected_gamepath);
+ ipcMain.emit("setpath");
+ }
+})
+
+// ensures gamepath still exists and is valid on startup
+let gamepathlost = false;
+ipcMain.on("gamepath-lost", (event, ...args) => {
+ if (! gamepathlost) {
+ gamepathlost = true;
+ win().send("gamepath-lost");
+ }
+})
+
// returns true/false depending on if the gamepath currently exists/is
// mounted, used to avoid issues...
gamepath.exists = (folder) => {
diff --git a/src/modules/ipc.js b/src/modules/ipc.js
new file mode 100644
index 0000000..55737b7
--- /dev/null
+++ b/src/modules/ipc.js
@@ -0,0 +1,32 @@
+const win = require("../win");
+const { app, ipcMain } = require("electron");
+
+const kill = require("./kill");
+const settings = require("./settings");
+const is_running = require("./is_running");
+
+ipcMain.on("exit", () => {
+ if (settings().originkill) {
+ is_running.origin().then((running) => {
+ if (running) {
+ kill.origin().then(process.exit(0));
+ } else {
+ process.exit(0) ;
+ }
+ })
+ } else {
+ process.exit(0);
+ }
+})
+
+ipcMain.on("minimize", () => {
+ win().minimize();
+})
+
+ipcMain.on("relaunch", () => {
+ app.relaunch({
+ args: process.argv.slice(1)
+ })
+
+ app.exit(0);
+})
diff --git a/src/modules/is_running.js b/src/modules/is_running.js
index 1cfdc1d..b9fbde1 100644
--- a/src/modules/is_running.js
+++ b/src/modules/is_running.js
@@ -1,7 +1,12 @@
+const win = require("../win");
const exec = require("child_process").exec;
let is_running = {};
+setInterval(async () => {
+ win().send("is-running", await is_running.game());
+}, 1000)
+
// a simple function that checks whether any of a given set of process
// names are running, you can either input a string or an Array of
// strings
diff --git a/src/modules/kill.js b/src/modules/kill.js
index 3c93f7b..43eda23 100644
--- a/src/modules/kill.js
+++ b/src/modules/kill.js
@@ -1,4 +1,13 @@
const exec = require("child_process").exec;
+const ipcMain = require("electron").ipcMain;
+
+ipcMain.on("kill-game", () => {
+ kill.game();
+})
+
+ipcMain.on("kill-origin", () => {
+ kill.origin();
+})
// a simple function to kill processes with a certain name
async function kill(process_name) {
@@ -9,13 +18,13 @@ async function kill(process_name) {
case "linux": return "killall -9 " + 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);
- });
- });
+ })
+ })
}
kill.process = kill;
diff --git a/src/modules/launch.js b/src/modules/launch.js
index bb094e9..e9ad1a3 100644
--- a/src/modules/launch.js
+++ b/src/modules/launch.js
@@ -1,4 +1,5 @@
const exec = require("child_process").exec;
+const ipcMain = require("electron").ipcMain;
const cli = require("../cli");
const lang = require("../lang");
@@ -8,6 +9,11 @@ const settings = require("./settings");
console = require("./console");
+ipcMain.on("launch-ns", launch);
+ipcMain.on("launch-vanilla", () => {
+ launch("vanilla");
+})
+
// launches the game
//
// either Northstar or Vanilla. Linux support is not currently a thing,
diff --git a/src/modules/mods.js b/src/modules/mods.js
index 122ff7f..2e9288b 100644
--- a/src/modules/mods.js
+++ b/src/modules/mods.js
@@ -2,8 +2,8 @@ const path = require("path");
const fs = require("fs-extra");
const unzip = require("unzipper");
const copy = require("recursive-copy");
-const { app, ipcMain } = require("electron");
const { https } = require("follow-redirects");
+const { app, ipcMain, dialog } = require("electron");
const json = require("./json");
const win = require("./window");
@@ -14,12 +14,72 @@ console = require("./console");
const cli = require("../cli");
const lang = require("../lang");
+const main_win = require("../win");
var mods = {
installing: [],
dupe_msg_sent: false,
}
+ipcMain.on("remove-mod", (event, mod) => {
+ mods.remove(mod);
+})
+
+ipcMain.on("toggle-mod", (event, mod) => {
+ mods.toggle(mod);
+})
+
+// lets renderer install mods from a path
+ipcMain.on("install-from-path", (event, path) => {
+ mods.install(path);
+})
+
+ipcMain.on("no-internet", () => {
+ main_win().send("no-internet");
+})
+
+ipcMain.on("install-mod", () => {
+ if (cli.hasArgs()) {
+ mods.install(cli.param("installmod"));
+ } else {
+ dialog.showOpenDialog({properties: ["openFile"]}).then(res => {
+ if (res.filePaths.length != 0) {
+ mods.install(res.filePaths[0]);
+ } else {
+ main_win().send("set-buttons", true);
+ }
+ }).catch(err => {error(err)});
+ }
+})
+
+// sends installed mods info to renderer
+ipcMain.on("gui-getmods", (event, ...args) => {
+ main_win().send("mods", mods.list());
+})
+
+ipcMain.on("getmods", () => {
+ let mods = mods.list();
+
+ if (mods.all.length > 0) {
+ log(`${lang("general.mods.installed")} ${mods.all.length}`);
+ log(`${lang("general.mods.enabled")} ${mods.enabled.length}`);
+ for (let i = 0; i < mods.enabled.length; i++) {
+ log(` ${mods.enabled[i].name} ${mods.enabled[i].version}`);
+ }
+
+ if (mods.disabled.length > 0) {
+ log(`${lang("general.mods.disabled")} ${mods.disabled.length}`);
+ for (let i = 0; i < mods.disabled.length; i++) {
+ log(` ${mods.disabled[i].name} ${mods.disabled[i].version}`);
+ }
+ }
+ cli.exit(0);
+ } else {
+ log("No mods installed");
+ cli.exit(0);
+ }
+})
+
function update_path() {
mods.path = path.join(settings().gamepath, "R2Northstar/mods");
}; update_path();
@@ -341,12 +401,12 @@ mods.install = (mod, opts) => {
}
}
- ipcMain.emit("installed-mod", "", {
+ main_win().send("installed-mod", {
name: modname,
malformed: opts.malformed,
- });
+ })
- ipcMain.emit("gui-getmods");
+ main_win().send("mods", mods.list());
return true;
}
@@ -360,7 +420,7 @@ mods.install = (mod, opts) => {
if (! json(path.join(mod, "mod.json"))) {
- ipcMain.emit("failed-mod");
+ main_win().send("failed-mod");
return notamod();
}
@@ -375,13 +435,13 @@ mods.install = (mod, opts) => {
copy(mod, copydest, (err) => {
if (err) {
- ipcMain.emit("failed-mod");
+ main_win().send("failed-mod");
return;
}
copy(opts.manifest_file, path.join(copydest, "manifest.json"), (err) => {
if (err) {
- ipcMain.emit("failed-mod");
+ main_win().send("failed-mod");
return;
}
@@ -411,7 +471,7 @@ mods.install = (mod, opts) => {
while (mods.installing.includes(mod_name)) {
if (! mods.dupe_msg_sent) {
mods.dupe_msg_sent = true;
- ipcMain.emit("duped-mod", "", mod_name);
+ main_win().send("duped-mod", mod_name);
}
use_mod_name = true;
@@ -490,7 +550,7 @@ mods.install = (mod, opts) => {
}
if (files.length == 0) {
- ipcMain.emit("failed-mod");
+ main_win().send("failed-mod");
return notamod();
}
}
@@ -612,14 +672,14 @@ mods.remove = (mod) => {
console.ok(lang("cli.mods.removed"));
cli.exit();
- ipcMain.emit("gui-getmods"); // send updated list to renderer
+ main_win().send("mods", mods.list()); // send updated list to renderer
// tell the renderer that the mod has been removed, along with
// relevant info for it to properly update everything graphically
- ipcMain.emit("removed-mod", "", {
+ main_win().send("removed-mod", {
name: mod.replace(/^.*(\\|\/|\:)/, ""),
manifest_name: manifest_name
- });
+ })
}
// toggles mods
@@ -660,7 +720,7 @@ mods.toggle = (mod, fork) => {
}
// send updated modlist to renderer
- ipcMain.emit("gui-getmods");
+ main_win().send("mods", mods.list());
}
module.exports = mods;
diff --git a/src/modules/packages.js b/src/modules/packages.js
index 392c550..88e389a 100644
--- a/src/modules/packages.js
+++ b/src/modules/packages.js
@@ -5,6 +5,7 @@ const { app, ipcMain } = require("electron");
const https = require("follow-redirects").https;
const lang = require("../lang");
+const main_win = require("../win");
const json = require("./json");
const win = require("./window");
@@ -14,6 +15,11 @@ console = require("./console");
var packages = {};
+// lets renderer install packages
+ipcMain.on("install-from-url", (event, url, author, package_name, version) => {
+ packages.install(url, author, package_name, version);
+})
+
function update_path() {
packages.path = path.join(settings().gamepath, "R2Northstar/packages");
@@ -238,7 +244,7 @@ packages.install = async (url, author, package_name, version) => {
}
break;
default:
- ipcMain.emit("failed-mod", name);
+ main_win().send("failed-mod", name);
// other unhandled error
console.error(
@@ -303,7 +309,7 @@ packages.install = async (url, author, package_name, version) => {
let moved = packages.move(package_path);
if (! moved) {
- ipcMain.emit("failed-mod", name);
+ main_win().send("failed-mod", name);
console.error("Moving package failed:", name);
cleanup();
@@ -311,7 +317,7 @@ packages.install = async (url, author, package_name, version) => {
return false;
}
- ipcMain.emit("installed-mod", "", {
+ main_win().send("installed-mod", {
name: name,
fancy_name: package_name
})
diff --git a/src/modules/releases.js b/src/modules/releases.js
index c071970..b041d38 100644
--- a/src/modules/releases.js
+++ b/src/modules/releases.js
@@ -1,3 +1,6 @@
+const win = require("../win");
+const ipcMain = require("electron").ipcMain;
+
const requests = require("./requests");
let releases = {
@@ -5,6 +8,15 @@ let releases = {
latest: {}
}
+// returns release notes to renderer
+ipcMain.on("get-ns-notes", async () => {
+ win().send("ns-notes", await releases.notes.northstar());
+})
+
+ipcMain.on("get-vp-notes", async () => {
+ win().send("vp-notes", await releases.notes.viper());
+})
+
// gets and returns the release notes of a GitHub repo
async function github_releases(repo) {
let request = false;
diff --git a/src/modules/requests.js b/src/modules/requests.js
index d4ee678..60e0760 100644
--- a/src/modules/requests.js
+++ b/src/modules/requests.js
@@ -1,6 +1,6 @@
const fs = require("fs");
const path = require("path");
-const app = require("electron").app;
+const { app, ipcMain } = require("electron");
const https = require("follow-redirects").https;
const json = require("./json");
@@ -9,6 +9,23 @@ const version = require("./version");
var cache_dir = app.getPath("userData");
var cache_file = path.join(cache_dir, "cached-requests.json");
+// lets renderer delete request cache
+ipcMain.on("delete-request-cache", () => {
+ requests.cache.delete.all();
+})
+
+// lets renderer use `requests.get()`
+ipcMain.handle("request", async (e, ...args) => {
+ let res = false;
+
+ try {
+ res = await requests.get(...args);
+ }catch(err) {}
+
+ return res;
+})
+
+
// updates `cache_dir` and `cache_file`
function set_paths() {
cache_dir = app.getPath("userData");
diff --git a/src/modules/settings.js b/src/modules/settings.js
index db6c68c..ae02c79 100644
--- a/src/modules/settings.js
+++ b/src/modules/settings.js
@@ -4,11 +4,37 @@ const { app, ipcMain } = require("electron");
const json = require("./json");
const lang = require("../lang");
+const win = require("./window");
console = require("./console");
var invalid_settings = false;
+ipcMain.on("save-settings", (event, obj) => {
+ save(obj, false);
+})
+
+ipcMain.on("reset-config", async () => {
+ let confirmation = await win.confirm(
+ lang("gui.settings.miscbuttons.reset_config_alert")
+ )
+
+ if (confirmation) {
+ fs.rmSync("viper.json");
+
+ app.relaunch({
+ args: process.argv.slice(1)
+ })
+
+ app.exit(0);
+ }
+})
+
+ipcMain.on("setlang", (event, lang) => {
+ set("lang", lang);
+ save();
+})
+
// base settings
var settings = {
gamepath: "",
@@ -81,7 +107,7 @@ let save = (obj = {}, notify_renderer = true) => {
settings = settings_content;
if (notify_renderer) {
- ipcMain.emit("saved-settings", settings_content);
+ send("changed-settings", obj);
}
}
diff --git a/src/modules/update.js b/src/modules/update.js
index 6b31da7..1165622 100644
--- a/src/modules/update.js
+++ b/src/modules/update.js
@@ -1,9 +1,11 @@
const path = require("path");
const fs = require("fs-extra");
-const { ipcMain, Notification } = require("electron");
+const { autoUpdater } = require("electron-updater");
+const { app, ipcMain, Notification } = require("electron");
const cli = require("../cli");
const lang = require("../lang");
+const main_win = require("../win");
const win = require("./window");
const version = require("./version");
@@ -15,10 +17,60 @@ const is_running = require("./is_running");
console = require("./console");
const unzip = require("unzipper");
-const { https } = require("follow-redirects");
+const https = require("follow-redirects").https;
let update = {};
+ipcMain.on("delete-install-cache", () => {
+ let delete_dirs = [
+ path.join(app.getPath("cache"), "vipertmp"),
+ path.join(settings().gamepath, "northstar.zip")
+ ]
+
+ for (let i = 0; i < delete_dirs.length; i++) {
+ if (fs.existsSync(delete_dirs[i])) {
+ fs.rmSync(delete_dirs[i], {recursive: true});
+ }
+ }
+})
+
+ipcMain.on("update-northstar", async (e, force_install) => {
+ if (await is_running.game()) {
+ return win.alert(lang("general.auto_updates.game_running"));
+ }
+
+ update.northstar(force_install);
+})
+
+// inform renderer that an update has been downloaded
+autoUpdater.on("update-downloaded", () => {
+ main_win().send("update-available");
+})
+
+// updates and restarts Viper, if user says yes to do so.
+// otherwise it'll do it on the next start up.
+ipcMain.on("update-now", () => {
+ autoUpdater.quitAndInstall();
+})
+
+let update_active;
+
+// renderer requested a check for whether we can auto updates
+ipcMain.on("can-autoupdate", () => {
+ // is this the first time we're checking?
+ if (typeof update_active == "undefined") {
+ // save auto updater status
+ update_active = autoUpdater.isUpdaterActive();
+ }
+
+ // if `update_active` is falsy or `--no-vp-updates` is set,
+ // inform the renderer that auto updates aren't possible
+ if (! update_active || cli.hasParam("no-vp-updates")) {
+ main_win().send("cant-autoupdate");
+ }
+})
+
+
// renames excluded files to their original name
function restore_excluded_files() {
if (! gamepath.exists()) {return}
@@ -219,7 +271,7 @@ update.northstar = async (force_install) => {
return;
}
- ipcMain.emit("ns-update-event", "cli.update.checking");
+ main_win().send("ns-update-event", "cli.update.checking");
console.info(lang("cli.update.checking"));
let ns_version = version.northstar();
@@ -227,13 +279,13 @@ update.northstar = async (force_install) => {
if (latest && latest.version == false) {
update.northstar.updating = false;
- ipcMain.emit("ns-update-event", "cli.update.noInternet");
+ main_win().send("ns-update-event", "cli.update.noInternet");
return;
}
// Makes sure it is not already the latest version
if (! force_install && ! await northstar_update_available()) {
- ipcMain.emit("ns-update-event", "cli.update.uptodate_short");
+ main_win().send("ns-update-event", "cli.update.uptodate_short");
console.ok(lang("cli.update.uptodate").replace("%s", ns_version));
win.log(lang("gui.update.uptodate"));
@@ -254,7 +306,7 @@ update.northstar = async (force_install) => {
https.get(latest.download_link, (res) => {
// cancel out if zip can't be retrieved and or found
if (res.statusCode !== 200) {
- ipcMain.emit("ns-update-event", "cli.update.uptodate_short");
+ main_win().send("ns-update-event", "cli.update.uptodate_short");
console.ok(lang("cli.update.uptodate"), ns_version);
update.northstar.updating = false;
return false;
@@ -279,11 +331,11 @@ update.northstar = async (force_install) => {
}
console.info(lang("cli.update.downloading") + ":", latest.version);
- ipcMain.emit("ns-update-event", {
+ main_win().send("ns-update-event", {
progress: 0,
btn_text: "1/2",
key: "cli.update.downloading",
- });
+ })
let tmp = path.dirname(settings().zip);
@@ -317,7 +369,7 @@ update.northstar = async (force_install) => {
percentage_str = " - " + current_percentage + "%";
}
- ipcMain.emit("ns-update-event", {
+ main_win().send("ns-update-event", {
key: key,
progress: current_percentage,
btn_text: "1/2" + percentage_str
@@ -331,7 +383,7 @@ update.northstar = async (force_install) => {
let extract = fs.createReadStream(settings().zip);
win.log(lang("gui.update.extracting"));
- ipcMain.emit("ns-update-event", {
+ main_win().send("ns-update-event", {
progress: 0,
btn_text: "2/2 - 0%",
key: lang("gui.update.extracting")
@@ -352,7 +404,7 @@ update.northstar = async (force_install) => {
let percent = Math.floor(extracted / size * 100);
let extracted_mb = (extracted / 1024 / 1024).toFixed(1);
- ipcMain.emit("ns-update-event", {
+ main_win().send("ns-update-event", {
progress: percent,
btn_text: "2/2 - " + percent + "%",
key: lang("gui.update.extracting") +
@@ -368,7 +420,7 @@ update.northstar = async (force_install) => {
ipcMain.emit("gui-getmods");
ipcMain.emit("get-version");
- ipcMain.emit("ns-update-event", "cli.update.uptodate_short");
+ main_win().send("ns-update-event", "cli.update.uptodate_short");
win.log(lang("gui.update.finished"));
console.ok(lang("cli.update.finished"));
diff --git a/src/modules/version.js b/src/modules/version.js
index da0a730..e337fc4 100644
--- a/src/modules/version.js
+++ b/src/modules/version.js
@@ -1,11 +1,28 @@
const path = require("path");
const fs = require("fs-extra");
+const ipcMain = require("electron").ipcMain;
+
+const win = require("../win");
const json = require("./json");
const settings = require("./settings");
let version = {};
+// sends the version info back to the renderer
+ipcMain.on("get-version", () => {
+ version.send_info();
+})
+
+// retrieves various local version numbers and sends them to the renderer
+version.send_info = () => {
+ win().send("version", {
+ ns: version.northstar(),
+ tf2: version.titanfall(),
+ vp: "v" + version.viper()
+ })
+}
+
// returns the current Northstar version
// if not installed it'll return "unknown"
version.northstar = () => {
diff --git a/src/modules/window.js b/src/modules/window.js
index 6cc573c..ebb0165 100644
--- a/src/modules/window.js
+++ b/src/modules/window.js
@@ -1,10 +1,11 @@
+const main_win = require("../win");
const ipcMain = require("electron").ipcMain;
let win = {};
// logs into the dev tools of the renderer
-win.log = (msg) => {
- ipcMain.emit("win-log", msg, msg);
+win.log = (...args) => {
+ main_win().send("log", ...args);
}
// this increments for every alert that's created, the ID is used to
@@ -20,7 +21,10 @@ win.alert = (msg) => {
resolve();
})
- ipcMain.emit("win-alert", msg, msg, alert_id);
+ main_win().send("alert", {
+ id: alert_id,
+ message: msg
+ })
})
}
@@ -37,7 +41,10 @@ win.confirm = (msg) => {
resolve(confirmed);
})
- ipcMain.emit("win-confirm", msg, msg, confirm_id);
+ main_win().send("confirm", {
+ message: msg,
+ id: confirm_id
+ })
})
}