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();using var deadline=new CancellationTokenSource(TimeSpan.FromSeconds(30)); async Task Run(string name,Func> 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(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); }