aboutsummaryrefslogtreecommitdiff
path: root/src/modules/gamepath.js
diff options
context:
space:
mode:
author0neGal <mail@0negal.com>2023-09-16 03:09:15 +0200
committer0neGal <mail@0negal.com>2023-09-16 03:09:15 +0200
commit1c405a64400b16414559dc48250b946722f0108a (patch)
tree6a2f26c0ce1ab9d9935382ecb4d649068fb1d0e5 /src/modules/gamepath.js
parentb125018808b43fac9f5c81d7e7b07ec92eef30fc (diff)
downloadViper-1c405a64400b16414559dc48250b946722f0108a.tar.gz
Viper-1c405a64400b16414559dc48250b946722f0108a.zip
handle gamepaths with missing read/write perms
We now show an alert if the gamepath is detected to be missing read/write perms, both when selecting the gamepath initially, when it gets auto detected, but also after it's selected, passively.
Diffstat (limited to 'src/modules/gamepath.js')
-rw-r--r--src/modules/gamepath.js64
1 files changed, 54 insertions, 10 deletions
diff --git a/src/modules/gamepath.js b/src/modules/gamepath.js
index 6555cbd..0a9dcc6 100644
--- a/src/modules/gamepath.js
+++ b/src/modules/gamepath.js
@@ -15,15 +15,39 @@ let gamepath = {};
// returns true/false depending on if the gamepath currently exists/is
// mounted, used to avoid issues...
-gamepath.exists = () => {
- return fs.existsSync(settings.gamepath);
+gamepath.exists = (folder) => {
+ return fs.existsSync(folder || settings.gamepath);
}
+// returns false if the user doesn't have read/write permissions to the
+// selected gamepath, if no gamepath is set, then this will always
+// return `false`, handle that correctly!
+gamepath.has_perms = (folder) => {
+ if (! gamepath.exists(folder)) {
+ return false;
+ }
+
+ try {
+ fs.accessSync(
+ folder || settings.gamepath,
+ fs.constants.R_OK | fs.constants.W_OK
+ )
+
+ return true;
+ } catch (err) {
+ return false;
+ }
+}
+
+gamepath.setting = false;
+
// 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.
gamepath.set = async (win, force_dialog) => {
+ gamepath.setting = true;
+
// actually sets and saves the gamepath in the settings
function set_gamepath(folder) {
// set settings
@@ -50,12 +74,20 @@ gamepath.set = async (win, force_dialog) => {
settings.save();
win.webContents.send("newpath", settings.gamepath);
ipcMain.emit("newpath", null, settings.gamepath);
+
+ gamepath.setting = false;
}
- let gamepath = await findgame();
- if (gamepath) {
- set_gamepath(gamepath);
- return;
+ let found_gamepath = await findgame();
+
+ if (found_gamepath) {
+ if (! gamepath.has_perms(found_gamepath)) {
+ ipcMain.emit("found-missing-perms", null, found_gamepath);
+ return;
+ }
+
+ set_gamepath(found_gamepath);
+ return gamepath.setting = false;
}
await win_show.alert(lang("general.missing_path"));
@@ -65,19 +97,27 @@ gamepath.set = async (win, force_dialog) => {
dialog.showOpenDialog({properties: ["openDirectory"]}).then(res => {
if (res.canceled) {
ipcMain.emit("newpath", null, false);
- return;
+ return gamepath.setting = false;
}
if (! fs.existsSync(path.join(res.filePaths[0], "Titanfall2.exe"))) {
ipcMain.emit("wrong-path");
- return;
+ return gamepath.setting = false;
+ }
+
+ if (! gamepath.has_perms(res.filePaths[0])) {
+ ipcMain.emit("missing-perms", null, res.filePaths[0]);
+ return gamepath.setting = false;
}
set_gamepath(res.filePaths[0]);
cli.exit();
- return;
- }).catch(err => {console.error(err)})
+ return gamepath.setting = false;
+ }).catch(err => {
+ console.error(err);
+ gamepath.setting = false;
+ })
}
}
@@ -86,6 +126,10 @@ gamepath.set = async (win, force_dialog) => {
// want to assume the gamepath is available forever and ever.
setInterval(() => {
if (gamepath.exists()) {
+ if (! gamepath.has_perms()) {
+ return ipcMain.emit("gamepath-lost-perms", null, settings.gamepath);
+ }
+
ipcMain.emit("gui-getmods");
} else {
if (fs.existsSync("viper.json")) {