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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox;

public partial class App
{
        // Read-only application preflight: never sends flight inputs or invokes target selection.
    private static async Task RunNavigationCheckAsync(string[] args,string reportPath)
    {
        if(File.Exists(reportPath))throw new IOException("Use a new navigation check report path.");
        var destination=GetArgument(args,"--check-destination");
        AppShellPage.Current!.Navigate(typeof(NavigationPage));
        await Task.Delay(150);
        object Snapshot()=>new
        {
            destination=ViewModel.NavigationDestination,
            routeMatches=ViewModel.NavigationRouteMatches,
            pluginReady=ViewModel.PluginNavigationReady,
            driverBound=Runtime.FlightDriver is not null,
            commandEnabled=ViewModel.StartNavigationCommand.CanExecute(null),
            buttonEnabled=Descendants(AppShellPage.Current!.CurrentPage).OfType<Button>().FirstOrDefault(b=>b.Content as string=="开始自动导航")?.IsEnabled,
            status=ViewModel.NavigationStatus,
            startHint=ViewModel.NavigationStartHint,
            statusSeverity=ViewModel.NavigationStatusSeverity.ToString(),
            nativeStatus=ViewModel.NavigationNativeStatus,
            routeSummary=ViewModel.NavigationRouteSummary,
            ship=ViewModel.NavigationShip,
            navigationActive=ViewModel.NavigationActive,
            runActive=ViewModel.RunActive,
            sessionBusy=ViewModel.SessionBusy,
            error=ViewModel.ErrorMessage,
            legs=ViewModel.NavigationLegs.Select(r=>r.Record).ToArray()
        };
        var initial=Snapshot();
        if(destination is not null)ViewModel.NavigationDestination=destination;
        if(args.Contains("--check-invalid-reserve"))ViewModel.NavigationFuelReserve=double.NaN;
        string? preflightFailure=null;
        var rejectedStart=args.Contains("--check-rejected-start");
        if(rejectedStart)
        {
            ViewModel.NavigationDestination="";
            if(ViewModel.NavigationDestination.Length!=0)throw new InvalidOperationException("Rejected-start fixture did not clear the destination.");
            await ViewModel.StartNavigationCommand.ExecuteAsync(null);
            preflightFailure=ViewModel.NavigationStatus;
        }
        else
        {
            try{await ViewModel.ValidateNavigationStartAsync();}
            catch(Exception error){preflightFailure=error.Message;}
            await ViewModel.CheckNavigationCommand.ExecuteAsync(null);
        }
        await Task.Delay(150);
        await File.WriteAllTextAsync(reportPath,JsonSerializer.Serialize(new
        {
            at=DateTimeOffset.UtcNow,initial,afterCheck=Snapshot(),preflightPassed=preflightFailure is null,preflightFailure,rejectedStartCommandExercised=rejectedStart,
            player=new {Runtime.Player.InGame,Runtime.Player.InDanger,Runtime.Player.Docked,Runtime.Player.SystemName,Runtime.Player.Navigation.CurrentSystemAddress,Runtime.Player.MaxJumpRange,gameRouteCount=Runtime.Player.Navigation.Route.Count},
            activity=Runtime.Activity,
            flightCommandsInvoked=false,targetSelectionInvoked=false,screenUse=false,journalWrites=0,navRouteWrites=0
        },new JsonSerializerOptions{WriteIndented=true}));
        MainWindow.Close();
    }
}