XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text.Json;
using System.Text.Json.Serialization;

namespace XFEEDToolBox.Core.Models;

public sealed record ToolboxSettings
{
    public string JournalDirectory { get; init; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Saved Games", "Frontier Developments", "Elite Dangerous");
    public string EddnEndpoint { get; init; } = "tcp://eddn.edcd.io:9500";
    public bool ConnectEddnOnStart { get; init; } = true;
    public double MarketCacheRadiusLy {get;init;}=500;
    public string MarketCacheCenterName {get;init;}="";
    public Coordinates? MarketCacheCenterPosition {get;init;}
    public XFEEDToolBox.Core.Session.HotkeySettings Hotkeys { get; init; } = new();
    public int HotkeyDefaultsVersion { get; init; } = 1;
    public bool ShieldZeroRestartEnabled {get;init;}
    public string PluginGameExecutable { get; init; } = "";
    public string TranslationGameExecutable { get; init; } = "";
    public string TranslationSourceDirectory { get; init; } = "";
    public string ProfileDisplayName { get; init; } = "";
    public string ProfileAvatarPath { get; init; } = "";
    public string NavigationDestination { get; init; } = "";
    public double NavigationFuelReserve { get; init; } = .5;
    public XFEEDToolBox.Core.Navigation.GameRoutePlotOptions NavigationRouteOptions {get;init;}=new();
    public PlannerRequest Planner { get; init; } = new();
    public static JsonSerializerOptions JsonOptions { get; } = new(JsonSerializerDefaults.Web)
    {
        WriteIndented = true,
        Converters = { new JsonStringEnumConverter() }
    };

    public static ToolboxSettings Load(string path)
    {
        if (!File.Exists(path)) return new();
        var text=File.ReadAllText(path);
        var settings=JsonSerializer.Deserialize<ToolboxSettings>(text, JsonOptions) ?? new();
        using var doc=JsonDocument.Parse(text);
        if(!doc.RootElement.TryGetProperty("marketCacheRadiusLy",out _))
        {
            // The former 150 ly value was the shipped default. Preserve an
            // explicitly customised older planner radius when introducing the
            // shared cache/planning scope, but migrate the old default to 500.
            var oldRadius=settings.Planner.SearchRadiusLy;
            var radius=oldRadius==150?500:oldRadius;
            if(!double.IsFinite(radius)||radius<=0)radius=500;
            settings=settings with{MarketCacheRadiusLy=radius,Planner=settings.Planner with{SearchRadiusLy=radius}};
        }
        if(!doc.RootElement.TryGetProperty("hotkeyDefaultsVersion",out _)&&!settings.Hotkeys.Enabled&&settings.Hotkeys.Relog.Length==0&&settings.Hotkeys.Restart.Length==0)
            settings=settings with{Hotkeys=new()};
        return settings;
    }

    public void Save(string path)
    {
        if(!double.IsFinite(MarketCacheRadiusLy)||MarketCacheRadiusLy<=0)throw new ArgumentException("行情范围半径必须为有效的正数。");
        if(MarketCacheCenterPosition is{IsValid:false})throw new ArgumentException("行情中心星系坐标无效。");
        Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path))!);
        var temp = path + ".tmp";
        File.WriteAllText(temp, JsonSerializer.Serialize(this, JsonOptions));
        File.Move(temp, path, true);
    }
}