Files
NebulaLauncher/Nebula.Launcher/ViewModels/ServerListViewModel.cs

136 lines
3.6 KiB
C#
Raw Normal View History

2024-12-21 15:15:04 +03:00
using System;
2024-12-26 09:49:01 +03:00
using System.Collections.Generic;
2024-12-22 16:38:47 +03:00
using System.Collections.ObjectModel;
2024-12-27 08:22:17 +03:00
using System.Linq;
2025-01-12 15:15:01 +03:00
using System.Threading.Tasks;
2024-12-22 16:38:47 +03:00
using CommunityToolkit.Mvvm.ComponentModel;
2024-12-21 15:15:04 +03:00
using Nebula.Launcher.ViewHelper;
using Nebula.Launcher.Views.Pages;
2025-01-05 17:05:23 +03:00
using Nebula.Shared.Models;
using Nebula.Shared.Services;
2024-12-21 15:15:04 +03:00
namespace Nebula.Launcher.ViewModels;
2025-01-05 17:05:23 +03:00
[ViewModelRegister(typeof(ServerListView))]
2024-12-22 16:38:47 +03:00
public partial class ServerListViewModel : ViewModelBase
2024-12-21 15:15:04 +03:00
{
2024-12-27 19:15:33 +03:00
private readonly IServiceProvider _serviceProvider;
private readonly HubService _hubService;
public ObservableCollection<ServerEntryModelView> ServerInfos { get; } = new();
2024-12-27 08:22:17 +03:00
public Action? OnSearchChange;
[ObservableProperty] private string _searchText;
2024-12-27 19:15:33 +03:00
private List<ServerHubInfo> UnsortedServers { get; } = new();
2024-12-22 21:38:19 +03:00
//Design think
2024-12-22 16:38:47 +03:00
public ServerListViewModel()
{
2024-12-27 19:15:33 +03:00
ServerInfos.Add(CreateServerView(new ServerHubInfo("ss14://localhost",new ServerStatus("Nebula","TestCraft", ["16+","RU"], "super", 12,55,1,false,DateTime.Now, 20),[])));
2024-12-22 16:38:47 +03:00
}
2024-12-22 21:38:19 +03:00
//real think
2024-12-22 16:38:47 +03:00
public ServerListViewModel(IServiceProvider serviceProvider, HubService hubService) : base(serviceProvider)
{
2024-12-27 19:15:33 +03:00
_serviceProvider = serviceProvider;
_hubService = hubService;
2025-01-12 15:15:01 +03:00
foreach (var info in _hubService.ServerList)
{
UnsortedServers.Add(info);
}
2024-12-22 16:38:47 +03:00
hubService.HubServerChangedEventArgs += HubServerChangedEventArgs;
2025-01-11 20:39:58 +03:00
hubService.HubServerLoaded += HubServerLoaded;
2024-12-27 08:22:17 +03:00
OnSearchChange += OnChangeSearch;
2025-01-12 15:15:01 +03:00
if (!hubService.IsUpdating)
{
SortServers();
}
2024-12-27 08:22:17 +03:00
}
2025-01-11 20:39:58 +03:00
private void HubServerLoaded()
{
SortServers();
}
2024-12-27 08:22:17 +03:00
private void OnChangeSearch()
{
SortServers();
2024-12-22 16:38:47 +03:00
}
private void HubServerChangedEventArgs(HubServerChangedEventArgs obj)
2024-12-21 15:15:04 +03:00
{
2024-12-22 16:38:47 +03:00
if (obj.Action == HubServerChangeAction.Add)
{
foreach (var info in obj.Items)
{
2024-12-26 09:49:01 +03:00
UnsortedServers.Add(info);
2024-12-22 16:38:47 +03:00
}
}
2024-12-27 19:15:33 +03:00
if(obj.Action == HubServerChangeAction.Remove)
2024-12-22 16:38:47 +03:00
{
foreach (var info in obj.Items)
{
2024-12-26 09:49:01 +03:00
UnsortedServers.Remove(info);
2024-12-22 16:38:47 +03:00
}
}
2024-12-27 19:15:33 +03:00
if(obj.Action == HubServerChangeAction.Clear)
{
UnsortedServers.Clear();
}
2024-12-27 08:22:17 +03:00
}
private void SortServers()
{
2025-01-12 15:15:01 +03:00
Task.Run(() =>
2024-12-26 09:49:01 +03:00
{
2025-01-12 15:15:01 +03:00
ServerInfos.Clear();
UnsortedServers.Sort(new ServerComparer());
foreach (var server in UnsortedServers.Where(CheckServerThink))
{
ServerInfos.Add(CreateServerView(server));
}
});
2024-12-26 09:49:01 +03:00
}
2024-12-27 08:22:17 +03:00
private bool CheckServerThink(ServerHubInfo hubInfo)
{
if (string.IsNullOrEmpty(SearchText)) return true;
return hubInfo.StatusData.Name.ToLower().Contains(SearchText.ToLower());
}
2024-12-27 19:15:33 +03:00
private ServerEntryModelView CreateServerView(ServerHubInfo serverHubInfo)
{
2025-01-05 17:05:23 +03:00
var svn = GetViewModel<ServerEntryModelView>();
svn.ServerHubInfo = serverHubInfo;
return svn;
2024-12-27 19:15:33 +03:00
}
public void FilterRequired()
{
}
public void UpdateRequired()
{
2025-01-12 15:15:01 +03:00
Task.Run(_hubService.UpdateHub);
2024-12-27 19:15:33 +03:00
}
2024-12-26 09:49:01 +03:00
}
public class ServerComparer : IComparer<ServerHubInfo>
{
public int Compare(ServerHubInfo? x, ServerHubInfo? y)
{
if (ReferenceEquals(x, y))
return 0;
if (ReferenceEquals(null, y))
return 1;
if (ReferenceEquals(null, x))
return -1;
return y.StatusData.Players.CompareTo(x.StatusData.Players);
2024-12-21 15:15:04 +03:00
}
}