@page "/servers/{ServerId:int}" @using Microsoft.AspNetCore.SignalR.Client @using MoonlightServers.Shared.Http.Responses.Users.Servers @using MoonCore.Blazor.Tailwind.Components @using MoonCore.Exceptions @using MoonCore.Helpers @using MoonlightServers.Frontend.Interfaces @using MoonlightServers.Frontend.Models @using MoonlightServers.Shared.Enums @using MoonlightServers.Frontend.UI.Components @using MoonlightServers.Frontend.UI.Components.Servers.ServerTabs @inject HttpApiClient ApiClient @inject IServerTabProvider[] TabProviders @implements IAsyncDisposable @if (NotFound) {
Not found illustration

Server not found

The server you requested does not exist

} else {
@{ var bgColor = State switch { ServerState.Installing => "bg-primary-500", ServerState.Offline => "bg-danger-500", ServerState.Starting => "bg-warning-500", ServerState.Stopping => "bg-warning-500", ServerState.Online => "bg-success-500", _ => "bg-gray-500" }; }
@if (State == ServerState.Offline) { Start } else { } @if (State == ServerState.Online) { } else { } @if (State == ServerState.Starting || State == ServerState.Online || State == ServerState.Stopping) { if (State == ServerState.Stopping) { Kill } else { Stop } } else { }
@foreach (var tab in Tabs) { @{ var rf = ComponentHelper.FromType(tab.ComponentType, parameters => { parameters.Add("Server", Server); parameters.Add("State", State); parameters.Add("InitialConsoleMessage", InitialConsoleMessage); parameters.Add("HubConnection", HubConnection); parameters.Add("Parent", this); }); } @rf }
}
@code { [Parameter] public int ServerId { get; set; } private List Tabs = new(); private ServerDetailResponse Server; private bool NotFound = false; private ServerState State; private string InitialConsoleMessage; private HubConnection HubConnection; private async Task Load(LazyLoader _) { try { // Load meta data Server = await ApiClient.GetJson( $"api/servers/{ServerId}" ); // Load server tabs foreach (var serverTabProvider in TabProviders) Tabs.AddRange(await serverTabProvider.GetTabs(Server)); // Load initial status for first render var status = await ApiClient.GetJson( $"api/servers/{ServerId}/status" ); State = status.State; // Load initial messages var initialLogs = await ApiClient.GetJson( $"api/servers/{ServerId}/logs" ); InitialConsoleMessage = ""; foreach (var message in initialLogs.Messages) InitialConsoleMessage += message; // Load websocket meta var websocketDetails = await ApiClient.GetJson( $"api/servers/{ServerId}/ws" ); // Build signal r HubConnection = new HubConnectionBuilder() .WithUrl(websocketDetails.Target) .Build(); // Define handlers HubConnection.On("StateChanged", async stateStr => { if (!Enum.TryParse(stateStr, out ServerState receivedState)) return; State = receivedState; await InvokeAsync(StateHasChanged); }); HubConnection.On("ConsoleOutput", async content => { // Update initial message InitialConsoleMessage += content; await InvokeAsync(StateHasChanged); }); // Connect await HubConnection.StartAsync(); // Authenticate await HubConnection.SendAsync("Authenticate", websocketDetails.AccessToken); } catch (HttpApiException e) { if (e.Status == 404) NotFound = true; else throw; } } private async Task Start() => await ApiClient.Post($"api/servers/{Server.Id}/start"); private async Task Stop() => await ApiClient.Post($"api/servers/{Server.Id}/stop"); private async Task Kill() => await ApiClient.Post($"api/servers/{Server.Id}/kill"); public async ValueTask DisposeAsync() { if (HubConnection.State == HubConnectionState.Connected) await HubConnection.StopAsync(); await HubConnection.DisposeAsync(); } }