From 428e2668d379d0e82d0eeac1076c26807a954628 Mon Sep 17 00:00:00 2001 From: Marcel Baumgartner Date: Wed, 12 Jul 2023 02:03:20 +0200 Subject: [PATCH] Fixed server list and server navigation --- .../Views/Server/ServerNavigation.razor | 56 +++++++++++---- Moonlight/Shared/Views/Servers/Index.razor | 70 ++++++++++++++----- 2 files changed, 92 insertions(+), 34 deletions(-) diff --git a/Moonlight/Shared/Views/Server/ServerNavigation.razor b/Moonlight/Shared/Views/Server/ServerNavigation.razor index c32ac0d..778aefa 100644 --- a/Moonlight/Shared/Views/Server/ServerNavigation.razor +++ b/Moonlight/Shared/Views/Server/ServerNavigation.razor @@ -25,11 +25,17 @@
- - + + @if (Console.ServerState == ServerState.Stopping) { - + } else { @@ -47,7 +53,7 @@
Shared IP: - @($"{CurrentServer.Node.Fqdn}:{CurrentServer.MainAllocation.Port}") + @($"{CurrentServer.Node.Fqdn}:{CurrentServer.MainAllocation?.Port ?? 0}")
Server ID: @@ -68,21 +74,29 @@ @switch (Console.ServerState) { case ServerState.Offline: - Offline + + Offline + break; case ServerState.Starting: - Starting + + Starting + (@(Formatter.FormatUptime(Console.Resource.Uptime))) break; case ServerState.Stopping: - Stopping + + Stopping + (@(Formatter.FormatUptime(Console.Resource.Uptime))) break; case ServerState.Running: - Online + + Online + (@(Formatter.FormatUptime(Console.Resource.Uptime))) break; } @@ -110,7 +124,9 @@ - Console + + Console + @@ -118,7 +134,9 @@ - Files + + Files + @@ -126,7 +144,9 @@ - Backups + + Backups + @@ -134,7 +154,9 @@ - Network + + Network + @@ -142,7 +164,9 @@ - Addons + + Addons + @@ -150,7 +174,9 @@ - Settings + + Settings + @@ -169,7 +195,7 @@ { [CascadingParameter] public Server CurrentServer { get; set; } - + [CascadingParameter] public User User { get; set; } diff --git a/Moonlight/Shared/Views/Servers/Index.razor b/Moonlight/Shared/Views/Servers/Index.razor index e634054..4df99d7 100644 --- a/Moonlight/Shared/Views/Servers/Index.razor +++ b/Moonlight/Shared/Views/Servers/Index.razor @@ -221,6 +221,8 @@ { ServerGroups = (JsonConvert.DeserializeObject( User.ServerListLayoutJson) ?? Array.Empty()).ToList(); + + await CheckServerGroups(); } foreach (var server in AllServers) @@ -256,8 +258,8 @@ private async Task RemoveGroup(ServerGroup group) { ServerGroups.Remove(group); - await EnsureAllServersInGroups(); - + + await CheckServerGroups(); await InvokeAsync(StateHasChanged); await JsRuntime.InvokeVoidAsync("moonlight.serverList.init"); @@ -266,11 +268,10 @@ private async Task SetEditMode(bool toggle) { EditMode = toggle; - await InvokeAsync(StateHasChanged); if (EditMode) { - await EnsureAllServersInGroups(); + await CheckServerGroups(); await InvokeAsync(StateHasChanged); await JsRuntime.InvokeVoidAsync("moonlight.serverList.init"); @@ -278,6 +279,9 @@ else { var json = JsonConvert.SerializeObject(await GetGroupsFromClient()); + + await CheckServerGroups(); + User.ServerListLayoutJson = json; UserRepository.Update(User); @@ -289,7 +293,7 @@ { var serverGroups = await JsRuntime.InvokeAsync("moonlight.serverList.getData"); - // Check user data to prevent users from doing stupid stuff + // Check user data to prevent users from doing stupid stuff foreach (var serverGroup in serverGroups) { if (serverGroup.Name.Length > 30) @@ -297,53 +301,78 @@ Logger.Verbose("Server list group lenght too long"); return Array.Empty(); } - - if (serverGroup.Servers.Any(x => AllServers.All(y => y.Id.ToString() != x))) - { - Logger.Verbose("User tried to add a server in his server list which he has no access to"); - return Array.Empty(); - } } return serverGroups; } - private Task EnsureAllServersInGroups() + private Task CheckServerGroups() { - var presentInGroup = new List(); + var result = new List(); + // Reconstruct the data with checking for invalid server ids foreach (var group in ServerGroups) + { + var checkedGroup = new ServerGroup() + { + Name = group.Name + }; + + foreach (var server in group.Servers) + { + var s = AllServers.FirstOrDefault(x => x.Id.ToString() == server); + + if (s != null) // This is a check for invalid server ids + { + checkedGroup.Servers.Add(s.Id.ToString()); + } + } + + result.Add(checkedGroup); + } + + var presentInGroup = new List(); + + // Copy all servers to preset in group if they are in the users servers + foreach (var group in result) { foreach (var id in group.Servers) - presentInGroup.Add(AllServers.First(x => x.Id.ToString() == id)); + { + var s = AllServers.First(x => x.Id.ToString() == id); + presentInGroup.Add(s); + } } var serversMissing = new List(); + // Make a list of missing servers foreach (var server in AllServers) { if (presentInGroup.All(x => x.Id != server.Id)) serversMissing.Add(server); } + // Add all missing servers into the default group if (serversMissing.Any()) { - var defaultGroup = ServerGroups.FirstOrDefault(x => x.Name == ""); + var defaultGroup = result.FirstOrDefault(x => x.Name == ""); - if (defaultGroup == null) + if (defaultGroup == null) // If group does not exist, create it { defaultGroup = new ServerGroup() { Name = "" }; - ServerGroups.Add(defaultGroup); + result.Add(defaultGroup); } foreach (var server in serversMissing) defaultGroup.Servers.Add(server.Id.ToString()); } + ServerGroups = result; + return Task.CompletedTask; } @@ -351,8 +380,11 @@ { lock (StatusCache) { - StatusCache.Add(server, status); - InvokeAsync(StateHasChanged); + if (!StatusCache.ContainsKey(server)) + { + StatusCache.Add(server, status); + InvokeAsync(StateHasChanged); + } } } } \ No newline at end of file