Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: handle unzip errors #249

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
2 changes: 1 addition & 1 deletion src/app/js/toasts.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ toasts.dismiss = (id) => {
}

ipcRenderer.on("toast", (_, properties) => {
Toast(properties);
toasts.show(properties);
})

module.exports = toasts;
32 changes: 30 additions & 2 deletions src/app/js/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,16 @@ ipcRenderer.on("ns-update-event", (event, options) => {
.innerText = `(${lang(key)})`;
}

let delay, now;

switch(key) {
case "cli.update.uptodate_short":
case "cli.update.no_internet":
// initial value
let delay = 0;
delay = 0;

// get current time
let now = new Date().getTime();
now = new Date().getTime();

// check if `update.ns.last_checked` was less than 500ms
// since now, this variable is set when `update.ns()` is
Expand All @@ -73,6 +75,32 @@ ipcRenderer.on("ns-update-event", (event, options) => {
}, delay)

break;
case "cli.update.failed":
// initial value
delay = 0;

// get current time
now = new Date().getTime();

// check if `update.ns.last_checked` was less than 500ms
// since now, this variable is set when `update.ns()` is
// called
if (now - update.ns.last_checked < 500) {
// if less than 500ms has passed, set `delay` to the
// amount of milliseconds missing until we've hit that
// 500ms threshold
delay = 500 - (now - update.ns.last_checked);
}

// Request version number
// this will also handle the play button label for us
ipcRenderer.send("get-version");

setTimeout(() => {
update_btn();
set_buttons(true);
update.ns.progress(false);
}, delay)
default:
update_btn();

Expand Down
3 changes: 2 additions & 1 deletion src/lang/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
"current": "Jetzige Version:",
"download_done": "Herunterladen abgeschlossen! Extrahiere...",
"downloading": "Wird heruntergeladen...",
"finished": "Installation/Aktualisierung abeschlossen!",
"failed": "Installation/Aktualisierung fehlgeschlagen!",
"finished": "Installation/Aktualisierung abgeschlossen!",
"no_internet": "Keine Internetverbindung",
"uptodate": "Installation ist bereits auf dem neusten Stand (%s), aktualisieren wird übersprungen.",
"uptodate_short": "Auf dem neusten stand"
Expand Down
1 change: 1 addition & 0 deletions src/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"checking": "Checking for updates...",
"download_done": "Download done! Extracting...",
"finished": "Installation/Update finished!",
"failed": "Installation/Update failed!",
"uptodate": "Latest version (%s) is already installed, skipping update.",
"uptodate_short": "Up-to-date",
"no_internet": "No Internet connection"
Expand Down
1 change: 1 addition & 0 deletions src/lang/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"current": "Version actuelle :",
"download_done": "Téléchargement terminé ! Extraction des fichiers...",
"downloading": "Téléchargement en cours...",
"failed": "Échec de la mise à jour !",
"finished": "Mise à jour terminée !",
"no_internet": "Pas de connexion Internet",
"uptodate": "La dernière version (%s) est déjà installée.",
Expand Down
1 change: 1 addition & 0 deletions src/lang/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"current": "当前版本:",
"download_done": "下载完毕!解压中...",
"downloading": "下载中...",
"failed": "安装/更新 失败!",
"finished": "安装/更新 完成!",
"no_internet": "无互联网连接",
"uptodate": "最新版本 (%s) 已安装, 跳过更新.",
Expand Down
16 changes: 12 additions & 4 deletions src/modules/gamepath.js
Jan200101 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,20 @@ ipcMain.on("wrong-path", () => {
})

ipcMain.on("found-missing-perms", async (e, selected_gamepath) => {
gamepath.setting = true;
await win().alert(lang("gui.gamepath.found_missing_perms") + selected_gamepath);
ipcMain.emit("setpath", null, false, true);
})

ipcMain.on("missing-perms", async (e, selected_gamepath) => {
gamepath.setting = true;
await win().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;
if (! gamepath.setting && gamepath.lost_perms != selected_gamepath) {
gamepath.lost_perms = selected_gamepath;
await win().alert(lang("gui.gamepath.lost_perms") + selected_gamepath);
ipcMain.emit("setpath");
}
Expand All @@ -80,17 +82,21 @@ gamepath.exists = (folder) => {
// 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) => {
gamepath.has_perms = (folder = settings().gamepath) => {
if (! gamepath.exists(folder)) {
return false;
}

try {
fs.accessSync(
folder || settings().gamepath,
folder,
fs.constants.R_OK | fs.constants.W_OK
)

let test_file_path = path.join(folder, ".viper_test");
fs.writeFileSync(test_file_path, "");
fs.unlinkSync(test_file_path);

return true;
} catch (err) {
return false;
Expand Down Expand Up @@ -163,6 +169,8 @@ gamepath.set = async (win, force_dialog) => {
return gamepath.setting = false;
}

delete gamepath.lost_perms;

if (! fs.existsSync(path.join(res.filePaths[0], "Titanfall2.exe"))) {
ipcMain.emit("wrong-path");
return gamepath.setting = false;
Expand Down
25 changes: 24 additions & 1 deletion src/modules/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -401,9 +401,32 @@ update.northstar = async (force_install) => {

console.ok(lang("cli.update.download_done"));

let destination = unzip.Extract({path: settings().gamepath});

// If we receive multiple errors of the same type we ignore them
let received_errors = [];
destination.on("error", (err) => {
if (received_errors.indexOf(err.code) >= 0)
return;

received_errors.push(err.code);
extract.close();
update.northstar.updating = false;

let description = lang("gui.toast.desc.unknown_error") + " (" + err.code + ")";

win().toast({
scheme: "error",
title: lang("gui.toast.title.failed"),
description: description
})

win().send("ns-update-event", "cli.update.failed");
})

// extracts the zip, this is the part where we're actually
// installing Northstar.
extract.pipe(unzip.Extract({path: settings().gamepath}))
extract.pipe(destination)

let extracted = 0;
let size = received;
Expand Down