@using LANCommander.SDK.PowerShell @using LANCommander.SDK.Services @using LANCommander.Server.Services.PowerShell @using XtermBlazor @using LogLevel = Microsoft.Extensions.Logging.LogLevel @inject ScriptDebugger ScriptDebugger @inject ScriptClient ScriptClient @inject GameService GameService
@code { [Parameter] public Guid Id { get; set; } [Parameter] public bool Active { get; set; } [Parameter] public EventCallback ActiveChanged { get; set; } private Xterm Terminal; private TaskCompletionSource InputTaskCompletionSource; private TerminalOptions _options = new() { CursorBlink = true, CursorStyle = CursorStyle.Bar, }; private HashSet Addons = new() { "readline", "addon-fit" }; private async Task OnFirstRender() { await Terminal.Addon("addon-fit").InvokeVoidAsync("fit"); } private async Task ReadLine() { return await Terminal.Addon("readline").InvokeAsync("read", "> "); } async Task SetActive(bool active) { Active = active; if (ActiveChanged.HasDelegate) await ActiveChanged.InvokeAsync(Active); } public async Task DebugPackagingScript(Guid gameId) { ScriptDebugger.OnBreak = Break; ScriptDebugger.OnStart = Start; ScriptDebugger.OnEnd = End; ScriptDebugger.OnOutput = Output; ScriptClient.Debug = true; await GameService.PackageAsync(gameId); } public async Task Start(IScriptDebugContext context) { Terminal?.Clear(); await SetActive(true); await InvokeAsync(StateHasChanged); await Terminal.Focus(); await Terminal.Addon("addon-fit").InvokeVoidAsync("fit"); } public async Task End(IScriptDebugContext context) { await SetActive(false); await InvokeAsync(StateHasChanged); } public async Task Break(IScriptDebugContext context) { while (true) { var input = await ReadLine(); if (input.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase)) break; if (input.StartsWith('$')) input = "Write-Host " + input; await context.ExecuteAsync(input); } } public async Task Output(IScriptDebugContext context, LogLevel level, string message) { try { switch (level) { case LogLevel.Error: await Terminal.WriteLine($"\x1b[0;31m{message}"); break; case LogLevel.Warning: await Terminal.WriteLine($"\x1b[0;33m{message}"); break; case LogLevel.Debug: await Terminal.WriteLine($"\x1b[0;37m{message}"); break; case LogLevel.Trace: await Terminal.WriteLine($"\x1b[0;36m{message}"); break; case LogLevel.Information: await Terminal.WriteLine($"\x1b[0;37m{message}"); break; } } catch (Exception ex) { } } }