LANCommander/LANCommander.Launcher/UI/Components/PowerShellConsole.razor

95 lines
2.6 KiB
Text
Raw Permalink Normal View History

2024-08-14 13:24:50 -05:00
@using XtermBlazor
@using LogLevel = Microsoft.Extensions.Logging.LogLevel
2024-08-14 13:24:50 -05:00
@inject SDK.Client Client
<div class="terminal @(Visible ? "" : "hidden")">
<Xterm @ref="Terminal" Options="_options" OnFirstRender="@OnFirstRender" Addons="@Addons" />
</div>
2024-08-14 13:24:50 -05:00
@code {
private bool Visible { get; set; } = false;
2024-08-14 13:24:50 -05:00
private Xterm Terminal;
private TaskCompletionSource<string> InputTaskCompletionSource;
private TerminalOptions _options = new TerminalOptions
{
CursorBlink = true,
CursorStyle = CursorStyle.Bar,
};
2024-08-14 13:24:50 -05:00
private HashSet<string> Addons = new HashSet<string>()
{
"readline",
"addon-fit"
2024-08-14 13:24:50 -05:00
};
protected override async Task OnInitializedAsync()
{
Client.Scripts.OnDebugStart = async (ps) =>
{
Terminal?.Clear();
Visible = true;
await InvokeAsync(StateHasChanged);
await Terminal.Addon("addon-fit").InvokeVoidAsync("fit");
};
Client.Scripts.OnOutput = async (level, message) =>
2024-08-14 13:24:50 -05:00
{
switch (level)
2024-08-14 13:24:50 -05:00
{
case LogLevel.Error:
await Terminal.WriteLine($"\x1b[0;31m{message}");
break;
2024-08-14 13:24:50 -05:00
case LogLevel.Warning:
await Terminal.WriteLine($"\x1b[0;33m{message}");
break;
2024-08-14 13:24:50 -05:00
case LogLevel.Debug:
await Terminal.WriteLine($"\x1b[0;37m{message}");
break;
2024-08-14 13:24:50 -05:00
case LogLevel.Trace:
await Terminal.WriteLine($"\x1b[0;36m{message}");
break;
2024-08-14 13:24:50 -05:00
case LogLevel.Information:
await Terminal.WriteLine($"\x1b[0;37m{message}");
break;
}
};
2024-08-14 13:24:50 -05:00
Client.Scripts.OnDebugBreak = async (ps) =>
2024-08-14 13:24:50 -05:00
{
while (true)
2024-08-14 13:24:50 -05:00
{
var input = await ReadLine();
2024-08-14 13:24:50 -05:00
if (input.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase))
break;
2024-08-14 13:24:50 -05:00
if (input.StartsWith('$'))
input = "Write-Host " + input;
ps.Commands.Clear();
ps.AddScript(input);
2024-08-14 13:24:50 -05:00
await ps.InvokeAsync();
2024-08-14 13:24:50 -05:00
}
Visible = false;
await InvokeAsync(StateHasChanged);
};
2024-08-14 13:24:50 -05:00
}
private async Task OnFirstRender()
2024-08-14 13:24:50 -05:00
{
await Terminal.Addon("addon-fit").InvokeVoidAsync("fit");
2024-08-14 13:24:50 -05:00
}
private async Task<string> ReadLine()
2024-08-14 13:24:50 -05:00
{
return await Terminal.Addon("readline").InvokeAsync<string>("read", "> ");
2024-08-14 13:24:50 -05:00
}
}