@page "/servers/{ServerId:int}" @page "/servers/{ServerId:int}/{TabPath:alpha}" @using Microsoft.AspNetCore.SignalR.Client @using MoonCore.Blazor.FlyonUi.Components @using MoonCore.Exceptions @using MoonCore.Helpers @using MoonlightServers.Frontend.Interfaces @using MoonlightServers.Frontend.Models @using MoonlightServers.Frontend.Services @using MoonlightServers.Shared.Enums @using MoonlightServers.Shared.Http.Responses.Client.Servers @inject ServerService ServerService @inject NavigationManager Navigation @inject IEnumerable TabProviders @implements IAsyncDisposable @if (NotFound) { The requested server could not be found } else {
@{ var bgColor = State switch { ServerState.Installing => "bg-primary", ServerState.Offline => "bg-error", ServerState.Starting => "bg-warning", ServerState.Stopping => "bg-warning", ServerState.Online => "bg-success", _ => "bg-gray-500" }; }
@if (HasPermissionTo("power", ServerPermissionType.ReadWrite)) { @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 { } } else { }
@if (CurrentTab == null) { Seems like you are missing access to all tabs or no tabs for this server could be found } else { var rf = ComponentHelper.FromType(CurrentTab!.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; } [Parameter] public string? TabPath { get; set; } private ServerTab[] Tabs; private ServerTab? CurrentTab; private ServerDetailResponse Server; private bool NotFound = false; private ServerState State; private string InitialConsoleMessage = ""; private HubConnection? HubConnection; public ConcurrentList CommandHistory = new(); private async Task Load(LazyLoader _) { try { // Load meta data Server = await ServerService.GetServer(ServerId); // Load server tabs var tmpTabs = new List(); foreach (var serverTabProvider in TabProviders) tmpTabs.AddRange(await serverTabProvider.GetTabs(Server)); // If we are accessing a shared server, we need to handle permissions if (Server.Share != null) { // This removes all tabs where the permission filter is not set tmpTabs.RemoveAll(tab => { if (tab.PermissionFilter == null) return false; return !Server.Share.Permissions.Any(tab.PermissionFilter); }); } Tabs = tmpTabs.OrderBy(x => x.Priority).ToArray(); // Find current tab if (!string.IsNullOrEmpty(TabPath)) { CurrentTab = Tabs.FirstOrDefault(x => TabPath.Equals(x.Path, StringComparison.InvariantCultureIgnoreCase) ); } if (CurrentTab == null) CurrentTab = Tabs.FirstOrDefault(); // Load initial status for first render var status = await ServerService.GetStatus(ServerId); State = status.State; if (!HasPermissionTo("console", ServerPermissionType.Read)) return; // Exit early if we don't have permissions to load the console // Load initial messages var initialLogs = await ServerService.GetLogs(ServerId); InitialConsoleMessage = ""; foreach (var message in initialLogs.Messages) InitialConsoleMessage += message; // Load websocket meta var websocketDetails = await ServerService.GetWebSocket(ServerId); // Build signal r HubConnection = new HubConnectionBuilder() .WithUrl(websocketDetails.Target, options => { options.AccessTokenProvider = async () => { var details = await ServerService.GetWebSocket(ServerId); return details.AccessToken; }; }) .WithAutomaticReconnect() .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(); } catch (HttpApiException e) { if (e.Status == 404) NotFound = true; else throw; } } private bool HasPermissionTo(string name, ServerPermissionType type) { // All non shares have permissions if (Server.Share == null) return true; return Server.Share.Permissions.Any(x => x.Name == name && x.Type >= type); } private async Task SwitchTab(ServerTab tab) { CurrentTab = tab; Navigation.NavigateTo($"/servers/{ServerId}/{tab.Path}"); await InvokeAsync(StateHasChanged); } private async Task Start() => await ServerService.Start(ServerId); private async Task Stop() => await ServerService.Stop(ServerId); private async Task Kill() => await ServerService.Kill(ServerId); public async ValueTask DisposeAsync() { if (HubConnection != null) { if (HubConnection.State == HubConnectionState.Connected) await HubConnection.StopAsync(); await HubConnection.DisposeAsync(); } } }