using System.Security.Cryptography; using System.Text; using System.Text.Json; namespace BSO.Launcher; /// /// Einstellungen und Anmeldung in %LocalAppData%\BSO Launcher\settings.json. Der Token ist mit DPAPI verschluesselt /// (nur dieser Windows-Benutzer auf diesem PC kann ihn lesen). /// public sealed class Settings { public static string Folder => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "BSO Launcher"); /// Mit -dev eigene Datei: die Anmeldung gilt nur fuer die Website, bei der sie gemacht wurde. static string FilePath => Path.Combine(Folder, Api.Dev ? "settings.dev.json" : "settings.json"); static readonly JsonSerializerOptions Options = new() { WriteIndented = true }; public string? Username { get; set; } public string? ProtectedToken { get; set; } /// Spielordner von Hand gewaehlt (sonst automatisch aus den Steam-Bibliotheken). public string? GameFolder { get; set; } public string Server { get; set; } = "127.0.0.1:7777"; public bool AutoConnect { get; set; } = true; public bool KeepOpen { get; set; } public bool AutoUpdateMod { get; set; } = true; /// Beim Start eine neue Launcher-Version gleich installieren und neu starten (wie beim MSCO Launcher). public bool AutoUpdateLauncher { get; set; } = true; /// "de" oder "en" - null = nach der Windows-Sprache (Lang.Default). public string? Language { get; set; } [System.Text.Json.Serialization.JsonIgnore] public string? Token { get { if (string.IsNullOrEmpty(ProtectedToken)) return null; try { return Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(ProtectedToken), null, DataProtectionScope.CurrentUser)); } catch { return null; } } set => ProtectedToken = value == null ? null : Convert.ToBase64String(ProtectedData.Protect(Encoding.UTF8.GetBytes(value), null, DataProtectionScope.CurrentUser)); } public static Settings Load() { try { if (File.Exists(FilePath)) return JsonSerializer.Deserialize(File.ReadAllText(FilePath)) ?? new Settings(); } catch (Exception e) { LauncherLog.Error("settings.json nicht lesbar: " + e.Message); } return new Settings(); } public void Save() { Directory.CreateDirectory(Folder); string tmp = FilePath + ".tmp"; File.WriteAllText(tmp, JsonSerializer.Serialize(this, Options)); File.Move(tmp, FilePath, true); } }