aboutsummaryrefslogtreecommitdiff
path: root/src/utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.js')
-rw-r--r--src/utils.js258
1 files changed, 178 insertions, 80 deletions
diff --git a/src/utils.js b/src/utils.js
index eb9f195..e8d14cc 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -29,6 +29,7 @@ var settings = {
autolang: true,
forcedlang: "en",
autoupdate: true,
+ originkill: false,
nsargs: "-multiple",
zip: "/northstar.zip",
@@ -42,12 +43,12 @@ var settings = {
// Logs into the dev tools of the renderer
function winLog(msg) {
- ipcMain.emit("winLog", msg, msg);
+ ipcMain.emit("win-log", msg, msg);
}
// Sends an alert to the renderer
function winAlert(msg) {
- ipcMain.emit("winAlert", msg, msg);
+ ipcMain.emit("win-alert", msg, msg);
}
// Creates the settings file with the base settings if it doesn't exist.
@@ -101,6 +102,47 @@ async function isGameRunning() {
});
}
+// 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
@@ -121,7 +163,7 @@ function handleNorthstarUpdating() {
if (await isGameRunning()) {
console.log(lang("cli.autoupdates.gamerunning"));
new Notification({
- title: lang("gui.nsupdate.gaming.title"),
+ title: lang("gui.nsupdate.gaming.title"),
body: lang("gui.nsupdate.gaming.body")
}).show();
} else {
@@ -129,11 +171,11 @@ function handleNorthstarUpdating() {
update();
}
} else {
- console.log(lang("cli.autoupdates.noupdate"))
+ console.log(lang("cli.autoupdates.noupdate"));
}
setTimeout(
- _checkForUpdates,
+ _checkForUpdates,
15 * 60 * 1000
// interval in between each update check
// by default 15 minutes.
@@ -187,11 +229,11 @@ async function setpath(win, forcedialog) {
return;
}
if (! fs.existsSync(path.join(res.filePaths[0], "Titanfall2.exe"))) {
- ipcMain.emit("wrongpath");
+ ipcMain.emit("wrong-path");
return;
}
- setGamepath(res.filePaths[0])
+ setGamepath(res.filePaths[0]);
cli.exit();
return;
@@ -220,17 +262,57 @@ function saveSettings(obj = {}) {
// Returns the current Northstar version
// If not installed it'll return "unknown"
function getNSVersion() {
- var versionFilePath = path.join(settings.gamepath, "ns_version.txt");
+ // if NorthstarLauncher.exe doesn't exist, always return "unknown"
+ if (! fs.existsSync(path.join(settings.gamepath, "NorthstarLauncher.exe"))) {
+ return "unknown";
+ }
- if (fs.existsSync(versionFilePath)) {
- return fs.readFileSync(versionFilePath, "utf8");
- } else {
- if (gamepathExists()) {
- fs.writeFileSync(versionFilePath, "unknown");
+ // mods to check version of
+ var versionFiles = [
+ "Northstar.Client",
+ "Northstar.Custom",
+ "Northstar.CustomServers"
+ ]
+
+ var versions = [];
+
+
+ let add = (version) => {
+ versions.push(version)
+ }
+
+ // checks version of mods
+ for (let i = 0; i < versionFiles.length; i++) {
+ var versionFile = path.join(settings.gamepath, "R2Northstar/mods/", versionFiles[i],"/mod.json");
+ if (fs.existsSync(versionFile)) {
+ if (! fs.statSync(versionFile).isFile()) {
+ add("unknown");
+ }
+
+ try {
+ add("v" + JSON.parse(fs.readFileSync(versionFile, "utf8")).Version);
+ }catch(err) {
+ add("unknown");
+ }
+ } else {
+ add("unknown");
}
+ }
- return "unknown";
+ if (versions.includes("unknown")) {return "unknown"}
+
+ // verifies all mods have the same version number
+ let mismatch = false;
+ let baseVersion = versions[0];
+ for (let i = 0; i < versions.length; i++) {
+ if (versions[i] != baseVersion) {
+ mismatch = true;
+ break
+ }
}
+
+ if (mismatch) {return "unknown"}
+ return baseVersion;
}
@@ -254,7 +336,7 @@ 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)
+ fs.renameSync(exclude + ".excluded", exclude);
}
}
}
@@ -278,6 +360,7 @@ async function update() {
var version = getNSVersion();
const latestAvailableVersion = await requests.getLatestNsVersion();
+ console.log(latestAvailableVersion)
// Makes sure it is not already the latest version
if (version === latestAvailableVersion) {
@@ -290,7 +373,7 @@ async function update() {
} else {
if (version != "unknown") {
console.log(lang("cli.update.current"), version);
- };
+ };
console.log(lang("cli.update.downloading") + ":", latestAvailableVersion);
ipcMain.emit("ns-update-event", "cli.update.downloading");
}
@@ -299,7 +382,7 @@ async function update() {
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")
+ fs.renameSync(exclude, exclude + ".excluded");
}
}
@@ -318,19 +401,32 @@ async function update() {
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.
- fs.createReadStream(settings.zip).pipe(unzip.Extract({path: settings.gamepath}))
- .on("finish", () => {
- fs.writeFileSync(path.join(settings.gamepath, "ns_version.txt"), latestAvailableVersion);
+ 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("guigetmods");
+ 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"));
@@ -380,19 +476,21 @@ function updatevp(autoinstall) {
// however it'll be added at some point.
function launch(version) {
if (process.platform == "linux") {
- console.error("error:", lang("cli.launch.linuxerror"))
+ winAlert(lang("cli.launch.linuxerror"));
+ console.error("error:", lang("cli.launch.linuxerror"));
cli.exit(1);
+ return;
}
process.chdir(settings.gamepath);
switch(version) {
case "vanilla":
- console.log(lang("general.launching"), "Vanilla...")
- run(path.join(settings.gamepath + "/Titanfall2.exe"))
+ console.log(lang("general.launching"), "Vanilla...");
+ run(path.join(settings.gamepath + "/Titanfall2.exe"));
break;
default:
- console.log(lang("general.launching"), "Northstar...")
- run(path.join(settings.gamepath + "/NorthstarLauncher.exe"))
+ console.log(lang("general.launching"), "Northstar...");
+ run(path.join(settings.gamepath + "/NorthstarLauncher.exe"));
break;
}
}
@@ -418,8 +516,8 @@ const mods = {
let modpath = path.join(settings.gamepath, "R2Northstar/mods");
if (getNSVersion() == "unknown") {
- winLog(lang("general.notinstalled"))
- console.log("error: " + lang("general.notinstalled"))
+ winLog(lang("general.notinstalled"));
+ console.log("error: " + lang("general.notinstalled"));
cli.exit(1);
return false;
}
@@ -428,7 +526,7 @@ const mods = {
let disabled = [];
if (! fs.existsSync(modpath)) {
- fs.mkdirSync(path.join(modpath), {recursive: true})
+ fs.mkdirSync(path.join(modpath), {recursive: true});
return {
enabled: [],
disabled: [],
@@ -436,7 +534,7 @@ const mods = {
};
}
- files = fs.readdirSync(modpath)
+ files = fs.readdirSync(modpath);
files.forEach((file) => {
if (fs.statSync(path.join(modpath, file)).isDirectory()) {
let modjson = path.join(modpath, file, "mod.json");
@@ -487,8 +585,8 @@ const mods = {
let modpath = path.join(settings.gamepath, "R2Northstar/mods");
if (getNSVersion() == "unknown") {
- winLog(lang("general.notinstalled"))
- console.log("error: " + lang("general.notinstalled"))
+ winLog(lang("general.notinstalled"));
+ console.log("error: " + lang("general.notinstalled"));
cli.exit(1);
return false;
}
@@ -513,11 +611,11 @@ const mods = {
let file = path.join(modpath, "..", "enabledmods.json");
if (! fs.existsSync(modpath)) {
- fs.mkdirSync(path.join(modpath), {recursive: true})
+ fs.mkdirSync(path.join(modpath), {recursive: true});
}
if (! fs.existsSync(file)) {
- fs.writeFileSync(file, "{}")
+ fs.writeFileSync(file, "{}");
}
return {
@@ -528,7 +626,7 @@ const mods = {
names[list[i].Name] = true
}
- fs.writeFileSync(file, JSON.stringify(names))
+ fs.writeFileSync(file, JSON.stringify(names));
},
disable: (mod) => {
let data = JSON.parse(repair(fs.readFileSync(file, "utf8")));
@@ -574,15 +672,15 @@ const mods = {
let modname = mod.replace(/^.*(\\|\/|\:)/, "");
if (getNSVersion() == "unknown") {
- winLog(lang("general.notinstalled"))
- console.log("error: " + lang("general.notinstalled"))
+ winLog(lang("general.notinstalled"));
+ console.log("error: " + lang("general.notinstalled"));
cli.exit(1);
return false;
}
let notamod = () => {
- winLog(lang("gui.mods.notamod"))
- console.log("error: " + lang("cli.mods.notamod"))
+ winLog(lang("gui.mods.notamod"));
+ console.log("error: " + lang("cli.mods.notamod"));
cli.exit(1);
return false;
}
@@ -591,30 +689,30 @@ const mods = {
console.log(lang("cli.mods.installed"));
cli.exit();
- winLog(lang("gui.mods.installedmod"))
+ winLog(lang("gui.mods.installedmod"));
if (modname == "mods") {
- let manifest = path.join(app.getPath("userData"), "Archives/manifest.json")
+ let manifest = path.join(app.getPath("userData"), "Archives/manifest.json");
if (fs.existsSync(manifest)) {
modname = require(manifest).name;
}
}
- ipcMain.emit("installedmod", "", {
+ ipcMain.emit("installed-mod", "", {
name: modname,
malformed: malformed,
});
- ipcMain.emit("guigetmods");
+ ipcMain.emit("gui-getmods");
return true;
}
if (! fs.existsSync(mod)) {return notamod()}
if (fs.statSync(mod).isDirectory()) {
- winLog(lang("gui.mods.installing"))
+ winLog(lang("gui.mods.installing"));
files = fs.readdirSync(mod);
- if (fs.existsSync(path.join(mod, "mod.json")) &&
+ if (fs.existsSync(path.join(mod, "mod.json")) &&
fs.statSync(path.join(mod, "mod.json")).isFile()) {
if (fs.existsSync(path.join(modpath, modname))) {
@@ -622,8 +720,8 @@ const mods = {
}
let copydest = path.join(modpath, modname);
if (typeof destname == "string") {copydest = path.join(modpath, destname)}
- copy(mod, copydest)
- copy(manifestfile, path.join(copydest, "manifest.json"))
+ copy(mod, copydest);
+ copy(manifestfile, path.join(copydest, "manifest.json"));
return installed();
} else {
@@ -634,7 +732,7 @@ const mods = {
if (fs.existsSync(path.join(mod, files[i], "mod.json")) &&
fs.statSync(path.join(mod, files[i], "mod.json")).isFile()) {
- mods.install(path.join(mod, files[i]))
+ mods.install(path.join(mod, files[i]));
if (mods.install(path.join(mod, files[i]))) {return true};
}
}
@@ -645,7 +743,7 @@ const mods = {
return notamod();
} else {
- winLog(lang("gui.mods.extracting"))
+ winLog(lang("gui.mods.extracting"));
let cache = path.join(app.getPath("userData"), "Archives");
if (fs.existsSync(cache)) {
fs.rmSync(cache, {recursive: true});
@@ -677,7 +775,7 @@ const mods = {
}
if (files.length == 0) {
- ipcMain.emit("failedmod");
+ ipcMain.emit("failed-mod");
return notamod();
}
}
@@ -708,26 +806,18 @@ const mods = {
if (fs.existsSync(tmp)) {
if (! fs.statSync(tmp).isDirectory()) {
- fs.rmSync(tmp)
+ fs.rmSync(tmp);
}
} else {
- fs.mkdirSync(tmp)
+ fs.mkdirSync(tmp);
if (fs.existsSync(modlocation)) {
- fs.rmSync(modlocation)
+ fs.rmSync(modlocation);
}
}
let stream = fs.createWriteStream(modlocation);
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();
mods.install(modlocation);
@@ -743,8 +833,8 @@ const mods = {
let modpath = path.join(settings.gamepath, "R2Northstar/mods");
if (getNSVersion() == "unknown") {
- winLog(lang("general.notinstalled"))
- console.log("error: " + lang("general.notinstalled"))
+ winLog(lang("general.notinstalled"));
+ console.log("error: " + lang("general.notinstalled"));
cli.exit(1);
return false;
}
@@ -752,19 +842,19 @@ const mods = {
if (mod == "allmods") {
let modlist = mods.list().all;
for (let i = 0; i < modlist.length; i++) {
- mods.remove(modlist[i].Name)
+ mods.remove(modlist[i].Name);
}
return
}
let disabled = path.join(modpath, "disabled");
if (! fs.existsSync(disabled)) {
- fs.mkdirSync(disabled)
+ fs.mkdirSync(disabled);
}
let modName = mods.get(mod).FolderName;
if (! modName) {
- console.log("error: " + lang("cli.mods.cantfind"))
+ console.log("error: " + lang("cli.mods.cantfind"));
cli.exit(1);
return;
}
@@ -784,8 +874,8 @@ const mods = {
fs.rmSync(modPath, {recursive: true});
console.log(lang("cli.mods.removed"));
cli.exit();
- ipcMain.emit("guigetmods");
- ipcMain.emit("removedmod", "", {
+ ipcMain.emit("gui-getmods");
+ ipcMain.emit("removed-mod", "", {
name: mod.replace(/^.*(\\|\/|\:)/, ""),
manifestname: manifestname
});
@@ -802,8 +892,8 @@ const mods = {
// function. However we currently have no need for that.
toggle: (mod, fork) => {
if (getNSVersion() == "unknown") {
- winLog(lang("general.notinstalled"))
- console.log("error: " + lang("general.notinstalled"))
+ winLog(lang("general.notinstalled"));
+ console.log("error: " + lang("general.notinstalled"));
cli.exit(1);
return false;
}
@@ -811,7 +901,7 @@ const mods = {
if (mod == "allmods") {
let modlist = mods.list().all;
for (let i = 0; i < modlist.length; i++) {
- mods.toggle(modlist[i].Name, true)
+ mods.toggle(modlist[i].Name, true);
}
console.log(lang("cli.mods.toggledall"));
@@ -824,17 +914,17 @@ const mods = {
console.log(lang("cli.mods.toggled"));
cli.exit();
}
- ipcMain.emit("guigetmods");
+ ipcMain.emit("gui-getmods");
}
};
setInterval(() => {
if (gamepathExists()) {
- ipcMain.emit("guigetmods");
+ ipcMain.emit("gui-getmods");
} else {
if (fs.existsSync("viper.json")) {
if (settings.gamepath != "") {
- ipcMain.emit("gamepathlost");
+ ipcMain.emit("gamepath-lost");
}
}
}
@@ -842,19 +932,27 @@ setInterval(() => {
module.exports = {
mods,
- lang,
winLog,
- launch,
+
update,
- setpath,
updatevp,
- settings,
- saveSettings,
getNSVersion,
getTF2Version,
+ handleNorthstarUpdating,
+
+ launch,
+ killOrigin,
isGameRunning,
+ isOriginRunning,
+
+
+ settings,
+ saveSettings,
+
+ setpath,
gamepathExists,
- handleNorthstarUpdating,
+
+ lang,
setlang: (lang) => {
settings.lang = lang;
saveSettings();