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

97 lines
3.2 KiB
C#
Raw Normal View History

2025-01-29 12:32:42 +03:00
using System;
2025-01-28 19:59:35 +03:00
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using Nebula.Shared;
using Nebula.Shared.Models;
using Nebula.Shared.Services;
using Nebula.Shared.Utils;
namespace Nebula.Launcher.ViewModels.Pages;
public partial class ServerListViewModel
{
[GenerateProperty] private ConfigurationService ConfigurationService { get; }
[GenerateProperty] private RestService RestService { get; }
[ObservableProperty] private bool _favoriteVisible = false;
public List<(RobustUrl,ServerStatus)> FavoriteServers = new();
public ObservableCollection<ServerEntryModelView> SortedFavoriteServers { get; } = new();
private void SortFavorite()
{
SortedFavoriteServers.Clear();
FavoriteServers.Sort(new ServerComparer());
foreach (var server in FavoriteServers.Where(a => CheckServerThink(a.Item2)))
SortedFavoriteServers.Add(GetServerEntryModelView(server));
}
private ServerEntryModelView GetServerEntryModelView((RobustUrl, ServerStatus) server)
{
var model = ViewHelperService.GetViewModel<ServerEntryModelView>().WithData(server.Item1, server.Item2);
model.OnFavoriteToggle += ()=> RemoveFavorite(model);
2025-01-29 12:32:42 +03:00
model.IsFavorite = true;
2025-01-28 19:59:35 +03:00
return model;
}
private async void FetchFavorite()
{
FavoriteServers.Clear();
var servers = ConfigurationService.GetConfigValue(CurrentConVar.Favorites);
if (servers is null || servers.Length == 0)
{
FavoriteVisible = false;
return;
}
FavoriteVisible = true;
foreach (var server in servers)
{
var uri = server.ToRobustUrl();
2025-01-29 12:32:42 +03:00
try
2025-01-28 19:59:35 +03:00
{
2025-01-29 12:32:42 +03:00
var serverInfo = await RestService.GetAsync<ServerStatus>(uri.StatusUri, CancellationToken.None);
if (serverInfo.Value is null)
{
throw new Exception("Server info is null");
}
2025-01-28 19:59:35 +03:00
2025-01-29 12:32:42 +03:00
FavoriteServers.Add((uri, serverInfo.Value));
}
catch (Exception e)
{
FavoriteServers.Add((uri, new ServerStatus("ErrorLand",$"ERROR: {e.Message}",[],"",-1,-1,-1,false,DateTime.Now, -1)));
}
2025-01-28 19:59:35 +03:00
}
SortFavorite();
}
public void AddFavorite(ServerEntryModelView entryModelView)
2025-01-29 12:32:42 +03:00
{
entryModelView.IsFavorite = true;
AddFavorite(entryModelView.Address);
}
public void AddFavorite(RobustUrl robustUrl)
2025-01-28 19:59:35 +03:00
{
var servers = (ConfigurationService.GetConfigValue(CurrentConVar.Favorites) ?? []).ToList();
2025-01-29 12:32:42 +03:00
servers.Add(robustUrl.ToString());
2025-01-28 19:59:35 +03:00
ConfigurationService.SetConfigValue(CurrentConVar.Favorites, servers.ToArray());
2025-01-29 12:32:42 +03:00
FetchFavorite();
2025-01-28 19:59:35 +03:00
}
public void RemoveFavorite(ServerEntryModelView entryModelView)
{
var servers = (ConfigurationService.GetConfigValue(CurrentConVar.Favorites) ?? []).ToList();
servers.Remove(entryModelView.Address.ToString());
ConfigurationService.SetConfigValue(CurrentConVar.Favorites, servers.ToArray());
2025-01-29 12:32:42 +03:00
entryModelView.IsFavorite = false;
FetchFavorite();
2025-01-28 19:59:35 +03:00
}
}