using System.Diagnostics;
using System.Text.Json;
using XFEEDToolBox.Core.Data;
using XFEEDToolBox.Core.Models;
using XFEEDToolBox.Core.Native;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Plugins;
if(args.Length!=2)throw new ArgumentException("Usage: CurrentSystemProbe processId report");
var pid=int.Parse(args[0]);var report=Path.GetFullPath(args[1]);Directory.CreateDirectory(Path.GetDirectoryName(report)!);
var rows=new List<object>();using var deadline=new CancellationTokenSource(TimeSpan.FromSeconds(30));
async Task Run(string name,Func<Task<object?>> action)
{
try{rows.Add(new{name,ok=true,value=await action()});}catch(Exception error){rows.Add(new{name,ok=false,error=error.ToString()});}
await File.WriteAllTextAsync(report,JsonSerializer.Serialize(new{pid,gameCommandsInvoked=false,rows},new JsonSerializerOptions{WriteIndented=true}));
Console.WriteLine(name);
}
var pipe=new NavigationPipeClient(pid);
await Run("describe",async()=>await pipe.CallAsync(new{op="describe"},deadline.Token));
await Run("read",async()=>await pipe.CallAsync(new{op="read"},deadline.Token));
await Run("local.read",async()=>await pipe.CallAsync(new{op="local.read"},deadline.Token));
var settings=ToolboxSettings.Load(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"XFEstudio","XFEEDToolBox","settings.json"));
await using var journal=new JournalMonitor(settings.JournalDirectory);await journal.StartAsync(deadline.Token);
await Run("journal",()=>Task.FromResult<object?>(new{journal.State.InGame,journal.State.SystemName,journal.State.CurrentShipId,journal.State.Navigation.CurrentSystemAddress}));
var flightDriver=new NativeFlightControlDriver(pid,NativeSystemLocationReader.GameSha256,()=>journal.State);
await Run("driver-preflight",async()=>await flightDriver.PreflightAsync(deadline.Token));
using var source=new NativeCurrentSystemSource(pid,NativeSystemLocationReader.GameSha256,()=>journal.State);
for(var i=0;i<3;i++)
{
await Run("locations "+i,async()=>{var snapshot=await source.ReadLocationsAsync(deadline.Token);return new{snapshot.SystemAddress,snapshot.SystemName,count=snapshot.Locations.Count,types=snapshot.Locations.GroupBy(x=>x.Category).Select(g=>new{category=g.Key.ToString(),count=g.Count()})};});
await Task.Delay(250,deadline.Token);
}
using System.Diagnostics;
using System.Text.Json;
using XFEEDToolBox.Core.Data;
using XFEEDToolBox.Core.Models;
using XFEEDToolBox.Core.Native;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Plugins;
if(args.Length!=2)throw new ArgumentException("Usage: CurrentSystemProbe processId report");
var pid=int.Parse(args[0]);var report=Path.GetFullPath(args[1]);Directory.CreateDirectory(Path.GetDirectoryName(report)!);
var rows=new List<object>();using var deadline=new CancellationTokenSource(TimeSpan.FromSeconds(30));
async Task Run(string name,Func<Task<object?>> action)
{
try{rows.Add(new{name,ok=true,value=await action()});}catch(Exception error){rows.Add(new{name,ok=false,error=error.ToString()});}
await File.WriteAllTextAsync(report,JsonSerializer.Serialize(new{pid,gameCommandsInvoked=false,rows},new JsonSerializerOptions{WriteIndented=true}));
Console.WriteLine(name);
}
var pipe=new NavigationPipeClient(pid);
await Run("describe",async()=>await pipe.CallAsync(new{op="describe"},deadline.Token));
await Run("read",async()=>await pipe.CallAsync(new{op="read"},deadline.Token));
await Run("local.read",async()=>await pipe.CallAsync(new{op="local.read"},deadline.Token));
var settings=ToolboxSettings.Load(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"XFEstudio","XFEEDToolBox","settings.json"));
await using var journal=new JournalMonitor(settings.JournalDirectory);await journal.StartAsync(deadline.Token);
await Run("journal",()=>Task.FromResult<object?>(new{journal.State.InGame,journal.State.SystemName,journal.State.CurrentShipId,journal.State.Navigation.CurrentSystemAddress}));
var flightDriver=new NativeFlightControlDriver(pid,NativeSystemLocationReader.GameSha256,()=>journal.State);
await Run("driver-preflight",async()=>await flightDriver.PreflightAsync(deadline.Token));
using var source=new NativeCurrentSystemSource(pid,NativeSystemLocationReader.GameSha256,()=>journal.State);
for(var i=0;i<3;i++)
{
await Run("locations "+i,async()=>{var snapshot=await source.ReadLocationsAsync(deadline.Token);return new{snapshot.SystemAddress,snapshot.SystemName,count=snapshot.Locations.Count,types=snapshot.Locations.GroupBy(x=>x.Category).Select(g=>new{category=g.Key.ToString(),count=g.Count()})};});
await Task.Delay(250,deadline.Token);
}