aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author0neGal <mail@0negal.com>2023-09-16 18:17:04 +0200
committer0neGal <mail@0negal.com>2023-09-16 18:17:04 +0200
commitf3e5e1596a22c3df38a8c00a5ceadf8a5dd2967a (patch)
treea5ae56bdc7baedc22930697de9cefc171705410d
parent53c19052738a4a9cc43feca31e8231c844b4d2b5 (diff)
downloadViper-f3e5e1596a22c3df38a8c00a5ceadf8a5dd2967a.tar.gz
Viper-f3e5e1596a22c3df38a8c00a5ceadf8a5dd2967a.zip
added buttons for fixing some problems and alike
I will likely add more buttons in the future, but for now this is most of the ones a user could need to repair problems.
-rw-r--r--src/app/css/popups.css26
-rw-r--r--src/app/css/theming.css8
-rw-r--r--src/app/css/toasts.css7
-rw-r--r--src/app/index.html34
-rw-r--r--src/app/js/settings.js1
-rw-r--r--src/app/js/toast.js12
-rw-r--r--src/app/main.js32
-rw-r--r--src/index.js50
-rw-r--r--src/lang/en.json24
-rw-r--r--src/modules/requests.js7
-rw-r--r--src/modules/update.js7
11 files changed, 190 insertions, 18 deletions
diff --git a/src/app/css/popups.css b/src/app/css/popups.css
index 7ece7e3..9d307d1 100644
--- a/src/app/css/popups.css
+++ b/src/app/css/popups.css
@@ -89,7 +89,8 @@
margin: calc(var(--padding) / 2);
}
-.popup .options .option {
+.popup .options .option,
+.popup .options .buttons {
width: 100%;
display: flex;
margin-bottom: var(--padding);
@@ -146,8 +147,13 @@
background-image: url(../icons/check.png);
}
-.option .text {font-weight: 600}
-.option .text .desc {
+.option .text,
+.buttons .text {
+ font-weight: 600;
+}
+
+.option .text .desc,
+.buttons .text .desc {
opacity: 0.8;
font-weight: 500;
font-size: 0.9em;
@@ -155,7 +161,8 @@
margin-top: calc(var(--padding) / 3);
}
-.option .actions input, .option .actions select {
+.option .actions input,
+.option .actions select {
width: 100%;
margin: 0px;
--spacing: calc(var(--padding) / 3);
@@ -166,7 +173,16 @@
margin-right: 15vw;
}
-.option .actions button {
+.buttons .actions {
+ text-align: right;
+}
+
+.buttons .actions button {
+ margin-bottom: calc(var(--padding) / 5);
+}
+
+.option .actions button,
+.buttons .actions button {
background: var(--selbg);
}
diff --git a/src/app/css/theming.css b/src/app/css/theming.css
index d92c42e..d16f455 100644
--- a/src/app/css/theming.css
+++ b/src/app/css/theming.css
@@ -37,10 +37,18 @@ a {
transition: filter 0.2s ease-in !important;
}
+a.disabled {
+ opacity: 0.5;
+ pointer-events: none;
+}
+
a:hover {
filter: brightness(80%) !important;
}
+input:disabled {
+ opacity: 0.5;
+}
::-webkit-scrollbar {
width: 8px !important;
diff --git a/src/app/css/toasts.css b/src/app/css/toasts.css
index 57ba055..65e325f 100644
--- a/src/app/css/toasts.css
+++ b/src/app/css/toasts.css
@@ -18,9 +18,10 @@
cursor: pointer;
overflow: hidden;
max-height: 100vh;
- background: #FFFFFF;
transform: scale(0.95);
+ background: var(--selbg);
transition: 0.2s ease-in-out;
+ backdrop-filter: blur(15px);
padding: calc(var(--padding) / 2);
margin-top: calc(var(--padding) / 2);
border-radius: calc(var(--padding) / 2.5);
@@ -33,6 +34,10 @@
animation-timing-function: ease-in-out;
}
+#toasts .toast .title:only-child {
+ margin-bottom: 0px;
+}
+
#toasts .toast.hidden {
margin-top: 0px;
max-height: 0px;
diff --git a/src/app/index.html b/src/app/index.html
index 4a8dca9..9ca5e07 100644
--- a/src/app/index.html
+++ b/src/app/index.html
@@ -121,7 +121,20 @@
</div>
</div>
<div class="actions">
- <input type="text">
+ <input type="text" class="disable-when-installing">
+ </div>
+ </div>
+ <div class="buttons">
+ <div class="text">
+ %%gui.settings.updatebuttons.title%%
+ <div class="desc">
+ %%gui.settings.updatebuttons.desc%%
+ </div>
+ </div>
+ <div class="actions">
+ <button onclick="delete_request_cache()">%%gui.settings.updatebuttons.buttons.reset_cached_api_requests%%</button>
+ <button onclick="force_update_ns()" class="disable-when-installing">%%gui.settings.updatebuttons.buttons.force_northstar_reinstall%%</button>
+ <button onclick="delete_install_cache()" class="disable-when-installing">%%gui.settings.updatebuttons.buttons.force_delete_install_cache%%</button>
</div>
</div>
<div class="title">
@@ -139,6 +152,21 @@
<button class="switch off"></button>
</div>
</div>
+ <div class="buttons">
+ <div class="text">
+ %%gui.settings.miscbuttons.title%%
+ <div class="desc">
+ %%gui.settings.miscbuttons.desc%%
+ </div>
+ </div>
+ <div class="actions">
+ <button onclick="relaunch()">%%gui.settings.miscbuttons.buttons.restart_viper%%</button>
+ <button onclick="reset_config()">%%gui.settings.miscbuttons.buttons.reset_config%%</button>
+ <button onclick="kill_game()">%%gui.settings.miscbuttons.buttons.force_quit_game%%</button>
+ <button onclick="kill_origin()">%%gui.settings.miscbuttons.buttons.force_quit_origin%%</button>
+ <button onclick="setpath()" class="disable-when-installing">%%gui.settings.miscbuttons.buttons.change_gamepath%%</button>
+ </div>
+ </div>
</div>
</div>
@@ -195,7 +223,7 @@
<img src="icons/viper.png"/>
<div class="inline" style="margin-top: 20px;">
<div id="vpversion"></div> |
- <a id="setpath" href="#" onclick="setpath()">%%gui.setpath%%</a>
+ <a id="setpath" href="#" onclick="setpath()" class="disable-when-installing">%%gui.setpath%%</a>
</div>
</div>
<div id="vpReleaseNotes" class="hidden section"></div>
@@ -228,7 +256,7 @@
<button id="playNsBtn" class="playBtn" onclick="launch()">%%gui.launch%%</button>
<div class="inline">
<div id="nsversion"></div>
- <a id="update" href="#" onclick="updateNorthstar()">(%%gui.update.check%%)</a>
+ <a id="update" href="#" onclick="updateNorthstar()" class="disable-when-installing">(%%gui.update.check%%)</a>
<div id="serverstatus" class="checking"></div>
</div>
</div>
diff --git a/src/app/js/settings.js b/src/app/js/settings.js
index db29300..8aeb2ca 100644
--- a/src/app/js/settings.js
+++ b/src/app/js/settings.js
@@ -1,4 +1,3 @@
-
var Settings = {
toggle: (state) => {
let settings_btn = document.getElementById("settings");
diff --git a/src/app/js/toast.js b/src/app/js/toast.js
index 3bc1745..e0aba6b 100644
--- a/src/app/js/toast.js
+++ b/src/app/js/toast.js
@@ -1,8 +1,8 @@
function Toast(properties) {
let toast = {
- fg: "#000000",
- bg: "#FFFFFF",
timeout: 3000,
+ fg: "#FFFFFF",
+ bg: "var(--selbg)",
callback: () => {},
title: "Untitled Toast",
description: "No description provided for toast",
@@ -45,6 +45,14 @@ function Toast(properties) {
<div class="description">${toast.description}</div>
`
+ if (! toast.title) {
+ el.querySelector(".title").remove();
+ }
+
+ if (! toast.description) {
+ el.querySelector(".description").remove();
+ }
+
toasts.appendChild(el);
setTimeout(() => {
diff --git a/src/app/main.js b/src/app/main.js
index bbf1e57..d94d508 100644
--- a/src/app/main.js
+++ b/src/app/main.js
@@ -122,6 +122,17 @@ if (! navigator.onLine) {
function exit() {ipcRenderer.send("exit")}
function updateNorthstar() {ipcRenderer.send("update-northstar")}
+function force_update_ns() {
+ ipcRenderer.send("update-northstar", true);
+}
+
+function reset_config() {
+ ipcRenderer.send("reset-config");
+}
+
+function relaunch() {
+ ipcRenderer.send("relaunch");
+}
// Reports to the main process about game path status.
// @param {boolean} value is game path loaded
@@ -151,11 +162,18 @@ function setButtons(state) {
let disablearray = (array) => {
for (let i = 0; i < array.length; i++) {
- array[i].disabled = !state;
+ array[i].disabled = ! state;
+
+ if (state) {
+ array[i].classList.remove("disabled")
+ } else {
+ array[i].classList.add("disabled")
+ }
}
}
disablearray(document.querySelectorAll("#modsdiv .el button"));
+ disablearray(document.querySelectorAll(".disable-when-installing"));
disablearray(document.querySelectorAll(".playBtnContainer .playBtn"));
disablearray(document.querySelectorAll("#nsMods .buttons.modbtns button"));
disablearray(document.querySelectorAll("#browser #browserEntries .text button"));
@@ -333,6 +351,18 @@ function kill_game() {
ipcRenderer.send("kill-game");
}
+function kill_origin() {
+ ipcRenderer.send("kill-origin");
+}
+
+function delete_request_cache() {
+ ipcRenderer.send("delete-request-cache");
+}
+
+function delete_install_cache() {
+ ipcRenderer.send("delete-install-cache");
+}
+
// Updates the installed mods
ipcRenderer.on("mods", (event, mods_obj) => {
modsobj = mods_obj;
diff --git a/src/index.js b/src/index.js
index a097525..220d490 100644
--- a/src/index.js
+++ b/src/index.js
@@ -81,11 +81,55 @@ function start() {
});
ipcMain.on("minimize", () => {win.minimize()});
- ipcMain.on("relaunch", () => {app.relaunch(); app.exit()});
+ ipcMain.on("relaunch", () => {
+ app.relaunch({
+ args: process.argv.slice(1)
+ });
+
+ app.exit(0);
+ });
+
ipcMain.on("kill-game", () => {
kill.game();
});
+ ipcMain.on("kill-origin", () => {
+ kill.origin();
+ });
+
+ ipcMain.on("delete-request-cache", () => {
+ requests.delete_cache();
+ });
+
+ 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("reset-config", async () => {
+ let confirmation = await win_show.confirm(
+ lang("gui.settings.miscbuttons.reset_config_alert")
+ )
+
+ if (confirmation) {
+ fs.rmSync("viper.json");
+
+ app.relaunch({
+ args: process.argv.slice(1)
+ });
+
+ app.exit(0);
+ }
+ });
+
// passthrough to renderer from main
ipcMain.on("win-log", (event, ...args) => {send("log", ...args)});
ipcMain.on("win-alert", (event, msg, id) => {
@@ -207,12 +251,12 @@ ipcMain.on("setlang", (event, lang) => {
settings.save();
});
-ipcMain.on("update-northstar", async () => {
+ipcMain.on("update-northstar", async (e, force_install) => {
if (await is_running.game()) {
return win_show.alert(lang("general.auto_updates.game_running"));
}
- update.northstar();
+ update.northstar(force_install);
})
ipcMain.on("setpath-cli", () => {gamepath.set()});
diff --git a/src/lang/en.json b/src/lang/en.json
index 56d7cd8..5cb443e 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -172,6 +172,30 @@
"originkill": {
"title": "Automatically quit Origin and or EA Desktop",
"desc": "When Viper exits, automatically quit Origin and or EA Desktop as well."
+ },
+
+ "updatebuttons": {
+ "title": "Repair actions",
+ "desc": "If you're having problems with updates, some of these buttons may help in fixing them.",
+ "buttons": {
+ "reset_cached_api_requests": "Reset cached API requests",
+ "force_northstar_reinstall": "Force re-install of Northstar",
+ "force_delete_install_cache": "Force delete cached install files"
+ }
+ },
+
+ "miscbuttons": {
+ "title": "Misc repair actions",
+ "desc": "If you're having problems then some of these buttons may help fixing it",
+ "buttons": {
+ "reset_config": "Reset config file",
+ "restart_viper": "Restart Viper",
+ "change_gamepath": "Change gamepath",
+ "force_quit_game": "Force quit Titanfall and Northstar",
+ "force_quit_origin": "Force quit Origin and or EA Desktop"
+ },
+
+ "reset_config_alert": "Please confirm that you want to reset the config file, after confirming Viper will delete the config file, and then restart."
}
},
diff --git a/src/modules/requests.js b/src/modules/requests.js
index 94639fa..a67bc26 100644
--- a/src/modules/requests.js
+++ b/src/modules/requests.js
@@ -27,6 +27,12 @@ function _getRequestsCache() {
}
}
+function delete_cache() {
+ if (fs.existsSync(cachePath)) {
+ return fs.rmSync(cachePath);
+ }
+}
+
// Returns latest Northstar version available from GitHub releases. If
// there's no cache result for this request, or if cache exists but is
// old, refreshes cache with new data.
@@ -182,6 +188,7 @@ async function getVpReleaseNotes() {
}
module.exports = {
+ delete_cache,
getLatestNsVersion,
getLatestNsVersionLink,
getNsReleaseNotes,
diff --git a/src/modules/update.js b/src/modules/update.js
index 087cbd9..c2d10d3 100644
--- a/src/modules/update.js
+++ b/src/modules/update.js
@@ -150,7 +150,10 @@ update.viper = (autoinstall) => {
// 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.
-update.northstar = async () => {
+//
+// `force_install` makes this function not care about whether or not
+// we're already up-to-date, forcing the install
+update.northstar = async (force_install) => {
if (await is_running.game()) {
console.error(lang("general.auto_updates.game_running"));
return false;
@@ -170,7 +173,7 @@ update.northstar = async () => {
}
// Makes sure it is not already the latest version
- if (! await northstar_update_available()) {
+ if (! force_install && ! await northstar_update_available()) {
ipcMain.emit("ns-update-event", "cli.update.uptodate_short");
console.ok(lang("cli.update.uptodate").replace("%s", ns_version));