using LANCommander.Launcher.Data; using LANCommander.Launcher.Data.Models; using LANCommander.Launcher.Models; using LANCommander.SDK; using LANCommander.SDK.Extensions; using LANCommander.SDK.Helpers; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; using System.Diagnostics; namespace LANCommander.Launcher.Services { public class GameService( DatabaseContext dbContext, ILogger logger, AuthenticationService authenticationService, PlaySessionService playSessionService, SDK.Client client, IServiceProvider serviceProvider) : BaseDatabaseService(dbContext, logger) { public Dictionary RunningProcesses = new Dictionary(); public delegate Task OnUninstallCompleteHandler(Game game); public event OnUninstallCompleteHandler OnUninstallComplete; public delegate Task OnUninstallHandler(Game game); public event OnUninstallHandler OnUninstall; public async Task UninstallAsync(Game game) { using (var operation = Logger.BeginOperation("Uninstalling game {GameTitle} ({GameId})", game.Title, game.Id)) { try { OnUninstall?.Invoke(game); await client.Games.UninstallAsync(game.InstallDirectory, game.Id); if (game.BaseGameId.HasValue) { var libraryService = serviceProvider.GetService(); var isInstalled = await libraryService!.IsInstalledAsync(game.BaseGameId.Value); if (!isInstalled) { var baseGame = await GetAsync(game.BaseGameId.Value); await client.Games.UninstallAsync(game.InstallDirectory, baseGame?.Id ?? game.BaseGameId.Value); ClearGameState(baseGame!, skipAddons: true); } } ClearGameState(game); await UpdateAsync(game); OnUninstallComplete?.Invoke(game); operation.Complete(); } catch (Exception ex) { Logger?.LogError(ex, "Game {GameTitle} ({GameId}) could not be uninstalled", game.Title, game.Id); } } } public async Task Run(Game game, SDK.Models.Manifest.Action action) { Guid userId; if (client.Connection.IsConnected()) { var profile = await client.Profile.GetAsync(); userId = profile.Id; } else { userId = authenticationService.GetUserId(); } try { var latestSession = await playSessionService.GetLatestSession(game.Id, userId); await playSessionService.StartSession(game.Id, userId); await client.Games.RunAsync(game.InstallDirectory, game.Id, action, latestSession?.CreatedOn); } catch (Exception ex) { Logger?.LogError(ex, "Game failed to run"); } finally { await playSessionService.EndSession(game.Id, userId); } } protected void ClearGameState(Game game, bool skipAddons = false) { if (game == null) return; game.InstallDirectory = null; game.Installed = false; game.InstalledOn = null; game.InstalledVersion = null; if (!skipAddons) { foreach (var addon in (game.DependentGames ?? [])) { ClearGameState(addon); } } } } }