Files
BSO-Launcher/Services/Settings.cs
T
MrMahoandClaude Opus 5.5 07da29ab94 Sprache Deutsch/Englisch
Umschalter in den Einstellungen und auf der Anmeldeseite; Meldungen des Launchers (Lang.cs)
und der Website (Accept-Language) in der gewaehlten Sprache.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 19:44:07 +01:00

60 lines
2.4 KiB
C#

using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
namespace BSO.Launcher;
/// <summary>
/// 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).
/// </summary>
public sealed class Settings
{
public static string Folder => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "BSO Launcher");
/// <summary>Mit -dev eigene Datei: die Anmeldung gilt nur fuer die Website, bei der sie gemacht wurde.</summary>
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; }
/// <summary>Spielordner von Hand gewaehlt (sonst automatisch aus den Steam-Bibliotheken).</summary>
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;
/// <summary>"de" oder "en" - null = nach der Windows-Sprache (Lang.Default).</summary>
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<Settings>(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);
}
}