Auto-Update wie beim MSCO Launcher

Beim Start installiert sich ein neuer Launcher sofort selbst (Fortschrittsfenster, Neustart), neue
BSO-Versionen kommen nach dem Anmelden - beides abschaltbar. Einstellungen: Nach Updates suchen /
Installieren und neu starten. Updates wieder nur von der Website; dotnet publish laedt hoch (release.ps1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-28 21:19:48 +01:00
co-authored by Claude Opus 5.5
parent 9cd5f2b153
commit c7a30e7fa3
11 changed files with 284 additions and 225 deletions
+16 -5
View File
@@ -21,7 +21,7 @@ public sealed class MainForm : Form
/// <summary>Befehle, die nur einmal gleichzeitig laufen duerfen (Downloads/Installationen/Start).</summary>
static readonly HashSet<string> Exclusive = new() { "installMod", "launch", "playLobby", "installLauncherUpdate", "uninstall" };
readonly HashSet<string> running = new();
static readonly HashSet<string> QuietCommands = new() { "window", "status", "me", "init", "releases", "friends", "lobby" };
static readonly HashSet<string> QuietCommands = new() { "window", "status", "me", "init", "releases", "friends", "lobby", "checkLauncherUpdate" };
bool updateInstalled;
static readonly JsonSerializerOptions Json = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
@@ -248,6 +248,7 @@ public sealed class MainForm : Form
loggedIn = settings.Token != null,
master = Api.Base,
language = Lang.Current,
autoUpdateLauncher = settings.AutoUpdateLauncher,
dev = Api.Dev || Api.Base != Api.BaseUrl
};
@@ -311,19 +312,28 @@ public sealed class MainForm : Form
case "lobbyStop": return await Site("POST", "/api/lobby/stop");
case "releases":
{
if (!Api.TestWebsite && await GiteaReleases.List() is { Count: > 0 } fromGit) return fromGit;
var r = await Api.Releases();
if (!r.Ok) throw new Exception(r.Error ?? "Neuigkeiten nicht verfuegbar");
return r.Json.GetProperty("releases");
}
case "checkLauncherUpdate":
{
var latest = await Api.Latest("launcher");
return new { current = SelfUpdate.CurrentVersion, latest = latest?.version,
available = latest != null && SelfUpdate.IsNewer(latest.version, SelfUpdate.CurrentVersion) };
}
case "installLauncherUpdate":
{
var latest = await Api.Latest("launcher") ?? throw new Exception("Kein Launcher-Update gefunden");
LauncherLog.Info("Launcher wird aktualisiert auf " + latest.version);
string version = await SelfUpdate.Install(latest, p => Progress("launcher", p, "Launcher-Update wird geladen …"));
updateInstalled = true;
LauncherLog.Info("Launcher aktualisiert auf " + version);
BeginInvoke(Close); // die neue Version startet gerade
return new { version };
LauncherLog.Info("Launcher " + version + " installiert - Neustart");
// Beenden, damit die neue Version starten kann. Haengt das Schliessen (WebView2 o.ae.), nach 5 s hart
// beenden - sonst bleibt die alte Version offen und die neue wartet vergeblich
BeginInvoke(() => Application.Exit());
_ = Task.Delay(5000).ContinueWith(_ => Environment.Exit(0));
return new { version, restarting = true };
}
// --- Einstellungen
@@ -333,6 +343,7 @@ public sealed class MainForm : Form
settings.AutoConnect = BoolArg(args, "autoConnect") ?? settings.AutoConnect;
settings.KeepOpen = BoolArg(args, "keepOpen") ?? settings.KeepOpen;
settings.AutoUpdateMod = BoolArg(args, "autoUpdateMod") ?? settings.AutoUpdateMod;
settings.AutoUpdateLauncher = BoolArg(args, "autoUpdateLauncher") ?? settings.AutoUpdateLauncher;
if (Arg(args, "language") is "de" or "en") { settings.Language = Arg(args, "language"); Lang.Set(settings.Language); }
settings.Save();
return null;