LANCommander/LANCommander.Launcher.Services/LibraryService.cs

189 lines
5.9 KiB
C#
Raw Permalink Normal View History

using LANCommander.Launcher.Data;
using LANCommander.Launcher.Data.Models;
using LANCommander.Launcher.Models;
using LANCommander.Launcher.Services.Extensions;
using LANCommander.SDK;
using LANCommander.SDK.Extensions;
using LANCommander.SDK.Helpers;
using LANCommander.SDK.PowerShell;
2024-05-23 23:41:38 -05:00
using Microsoft.EntityFrameworkCore;
2024-09-11 00:24:34 -05:00
using Microsoft.Extensions.Logging;
using Steamworks.Ugc;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
2024-05-25 22:21:04 -05:00
using System.Diagnostics;
using System.Linq;
using System.Management.Automation.Language;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace LANCommander.Launcher.Services
{
public class LibraryService : BaseService
{
private readonly InstallService InstallService;
2024-05-29 02:02:40 -05:00
private readonly GameService GameService;
private readonly SaveService SaveService;
2024-06-03 19:06:25 -05:00
private readonly PlaySessionService PlaySessionService;
private readonly RedistributableService RedistributableService;
2024-07-13 13:43:24 -05:00
private readonly ImportService ImportService;
2024-07-11 18:32:09 -05:00
private readonly MessageBusService MessageBusService;
2024-05-25 22:21:04 -05:00
public Dictionary<Guid, Process> RunningProcesses = new Dictionary<Guid, Process>();
2024-11-09 17:15:04 -06:00
public ObservableCollection<ListItem> Items { get; set; } = new ObservableCollection<ListItem>();
2024-06-28 03:50:21 -05:00
2024-11-09 17:15:04 -06:00
public delegate Task OnLibraryChangedHandler(IEnumerable<ListItem> items);
2024-05-29 02:02:40 -05:00
public event OnLibraryChangedHandler OnLibraryChanged;
2024-11-09 17:15:04 -06:00
public delegate Task OnPreLibraryItemsFilteredHandler(IEnumerable<ListItem> items);
2024-07-13 12:55:42 -05:00
public event OnPreLibraryItemsFilteredHandler OnPreLibraryItemsFiltered;
2024-11-09 17:15:04 -06:00
public delegate Task OnItemsFilteredHandler(IEnumerable<ListItem> items);
public event OnItemsFilteredHandler OnItemsFiltered;
2024-06-28 03:50:21 -05:00
2024-11-09 17:15:04 -06:00
public LibraryFilter Filter { get; set; } = new LibraryFilter();
public LibraryService(
SDK.Client client,
2024-09-11 00:24:34 -05:00
ILogger<LibraryService> logger,
InstallService installService,
GameService gameService,
SaveService saveService,
2024-06-03 19:06:25 -05:00
PlaySessionService playSessionService,
2024-07-11 18:32:09 -05:00
RedistributableService redistributableService,
2024-07-13 13:43:24 -05:00
ImportService importService,
2024-09-11 00:24:34 -05:00
MessageBusService messageBusService) : base(client, logger)
{
InstallService = installService;
2024-05-29 02:02:40 -05:00
GameService = gameService;
SaveService = saveService;
2024-06-03 19:06:25 -05:00
PlaySessionService = playSessionService;
RedistributableService = redistributableService;
2024-07-13 13:43:24 -05:00
ImportService = importService;
2024-07-11 18:32:09 -05:00
MessageBusService = messageBusService;
2024-05-29 02:02:40 -05:00
InstallService.OnInstallComplete += InstallService_OnInstallComplete;
2024-07-13 13:43:24 -05:00
ImportService.OnImportComplete += ImportService_OnImportComplete;
Filter.OnChanged += Filter_OnChanged;
}
private async Task Filter_OnChanged()
{
2024-11-09 17:15:04 -06:00
if (OnItemsFiltered != null)
await OnItemsFiltered.Invoke(Filter.ApplyFilter(Items));
2024-07-13 13:43:24 -05:00
}
private async Task ImportService_OnImportComplete()
{
2024-11-09 17:15:04 -06:00
await RefreshItemsAsync();
2024-07-13 13:43:24 -05:00
LibraryChanged();
2024-05-29 02:02:40 -05:00
}
private async Task InstallService_OnInstallComplete(Game game)
2024-05-29 02:02:40 -05:00
{
2024-07-13 12:55:42 -05:00
if (OnLibraryChanged != null)
2024-11-09 17:15:04 -06:00
await OnLibraryChanged.Invoke(Items);
}
2024-11-09 17:15:04 -06:00
public async Task<IEnumerable<ListItem>> RefreshItemsAsync()
2024-06-28 03:50:21 -05:00
{
2024-11-09 17:15:04 -06:00
Items = new ObservableCollection<ListItem>(await GetItemsAsync());
2024-06-28 03:50:21 -05:00
2024-11-09 17:15:04 -06:00
if (OnItemsFiltered != null)
await OnItemsFiltered.Invoke(Filter.ApplyFilter(Items));
2024-11-09 17:15:04 -06:00
return Items;
2024-06-28 03:50:21 -05:00
}
2024-11-09 17:15:04 -06:00
public IEnumerable<ListItem> GetItems<T>()
2024-06-28 03:50:21 -05:00
{
2024-11-09 17:15:04 -06:00
return Items.Where(i => i.DataItem is T).DistinctBy(i => i.Key);
2024-06-28 03:50:21 -05:00
}
2024-11-09 17:15:04 -06:00
public async Task<IEnumerable<ListItem>> GetItemsAsync()
2024-05-23 23:41:38 -05:00
{
2024-11-09 17:15:04 -06:00
Items.Clear();
2024-09-17 18:14:40 -05:00
using (var op = Logger.BeginOperation(LogLevel.Trace, "Loading library items from local database"))
{
2024-11-16 01:45:01 -06:00
var games = await GameService
.Get(x => true)
.ToListAsync();
Filter.Populate(games);
2024-11-09 17:15:04 -06:00
foreach (var item in games.Select(g => new ListItem(g)).OrderByTitle(g => !String.IsNullOrWhiteSpace(g.SortName) ? g.SortName : g.Name))
{
2024-11-09 17:15:04 -06:00
Items.Add(item);
}
2024-09-25 20:27:48 -05:00
op.Complete();
}
2024-11-09 17:15:04 -06:00
return Items;
}
2024-11-09 17:15:04 -06:00
public IEnumerable<ListItem> GetFilteredItems()
{
2024-11-09 17:15:04 -06:00
return Filter.ApplyFilter(Items);
2024-05-23 23:41:38 -05:00
}
2024-11-09 17:15:04 -06:00
public ListItem GetItem(Guid key)
2024-06-28 03:50:21 -05:00
{
2024-11-09 17:15:04 -06:00
var item = Items.FirstOrDefault(i => i.Key == key);
2024-06-28 03:50:21 -05:00
if (item == null)
2024-11-09 17:15:04 -06:00
item = Items.FirstOrDefault(i => i.Key == key);
2024-06-28 03:50:21 -05:00
return item;
}
2024-11-09 17:15:04 -06:00
public async Task<ListItem> GetItemAsync(ListItem libraryItem)
{
2024-11-09 17:15:04 -06:00
return await GetItemAsync(libraryItem.Key);
}
2024-11-09 17:15:04 -06:00
public async Task<ListItem> GetItemAsync(Guid key)
{
var game = await GameService.Get(key);
2024-11-09 17:15:04 -06:00
return new ListItem(game);
}
2024-11-12 02:35:28 -06:00
public async Task AddToLibraryAsync(Guid id)
{
await Client.Library.AddToLibrary(id);
2024-11-13 23:10:31 -06:00
await ImportService.ImportGamesAsync(id);
2024-11-12 02:35:28 -06:00
await LibraryChanged();
}
public async Task RemoveFromLibraryAsync(Guid id)
{
await Client.Library.RemoveFromLibrary(id);
var localGame = await GameService.Get(id);
await GameService.Delete(localGame);
await LibraryChanged();
}
2024-06-10 23:29:19 -05:00
public async Task LibraryChanged()
2024-05-29 02:02:40 -05:00
{
2024-07-13 12:55:42 -05:00
if (OnLibraryChanged != null)
2024-11-09 17:15:04 -06:00
await OnLibraryChanged.Invoke(Items);
2024-07-13 12:55:42 -05:00
}
public async Task FilterChanged()
{
2024-11-09 17:15:04 -06:00
Items = new ObservableCollection<ListItem>(await GetItemsAsync());
2024-05-29 02:02:40 -05:00
}
}
}