Setup-Assistent und Update-Abfrage bei jedem Start

Die heruntergeladene Datei ist ein Setup: Sprache, Ordner (nur ohne Admin-Rechte beschreibbar),
Verknuepfungen, Fortschritt, Fertig-Seite; Ordner steht in der Registry. Deinstallieren loescht im
gewaehlten Ordner nur die eigenen Dateien. Beim Start fragt der Launcher nach neuen Updates
(Launcher und Mod).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-28 20:01:27 +01:00
co-authored by Claude Opus 5.5
parent 884492f665
commit 5fd162fecb
10 changed files with 461 additions and 109 deletions
+43
View File
@@ -447,6 +447,48 @@ async function renderSettings(root) {
renderLangSwitch(setLang);
}
// ---------------------------------------------------------------- Update-Abfrage
/** Bei jedem Start: gibt es einen neuen Launcher (oder eine neue Mod)? Dann fragen - "Später" fragt beim naechsten Start wieder. */
async function askForUpdates() {
let s;
try { s = await call("status"); } catch { return; }
const mod = s.mod.installed && s.mod.updateAvailable && !s.game.running ? s.mod : null;
if (!s.launcherUpdate && !mod) return;
const item = (name, from, to, changelog) => h("div", { class: "update-item" },
h("div", {}, h("b", {}, name + " " + to), h("span", { class: "muted small" }, " " + t("installiert: {0}", from))),
h("pre", {}, changelog || t("Keine Beschreibung")));
const progress = h("div", { class: "progress hidden" }, h("span", { class: "small muted" }), h("div", { class: "bar" }, h("div")));
const later = h("button", { class: "btn", type: "button" }, t("Später"));
const now = h("button", { class: "btn primary", type: "button" }, t("Jetzt aktualisieren"));
const box = h("div", { class: "modal-back" }, h("div", { class: "modal", role: "dialog" },
h("h2", {}, t("Update verfügbar")),
h("p", { class: "muted" }, t("Beim Start gefunden – jetzt aktualisieren?")),
s.launcherUpdate ? item("Launcher", s.launcherVersion, s.launcherUpdate, s.launcherChangelog) : null,
mod ? item(t("BSO-Mod"), mod.installed, mod.latest, mod.changelog) : null,
progress,
h("div", { class: "row", style: "justify-content:flex-end" }, later, now)));
document.body.append(box);
now.focus();
later.addEventListener("click", () => box.remove());
now.addEventListener("click", async () => {
now.disabled = later.disabled = true;
progressBox = progress;
try {
if (mod) await call("installMod");
if (s.launcherUpdate) { await call("installLauncherUpdate"); toast(t("Launcher startet neu …")); return; } // beendet sich gleich
box.remove();
toast(t("BSO {0} installiert", mod.latest));
if (!$("app").classList.contains("hidden")) showPage(page);
} catch (e) {
toast(e.message, true);
now.disabled = later.disabled = false;
}
});
}
// ---------------------------------------------------------------- Start
(async () => {
@@ -464,6 +506,7 @@ async function renderSettings(root) {
$("meVersion").textContent += " · DEV";
}
$("authServer").textContent = t("Server: {0}", init.master.replace(/^https?:\/\//, ""));
askForUpdates(); // auch vor dem Anmelden
if (!init.loggedIn) { showAuth(); return; }
const me = await call("me");
if (me.loggedIn) showApp(me.username);