@using LANCommander.Launcher.Data.Models @using LANCommander.SDK.Extensions @namespace LANCommander.Launcher.UI @inherits FeedbackComponent @inject InstallService InstallService @inject ToolService ToolService @inject LocalizationService LocalizationService @inject GameClient GameClient @inject ISettingsProvider SettingsProvider
@if (Addons.Any()) { } @if (Tools.Any()) { } @if (SettingsProvider.CurrentValue.Games.InstallDirectories.Length > 1) { @foreach (var directory in SettingsProvider.CurrentValue.Games.InstallDirectories) { @directory } }
@if (GetOperation() != "None") { } @code { string SelectedDirectory = ""; SDK.Models.Game RemoteGame; Data.Models.Game Game; List Addons = new(); IEnumerable SelectedAddons = new List(); List Tools = new(); IEnumerable SelectedTools = new List(); protected override async Task OnInitializedAsync() { Game = Options.DataItem as Game; if (Game.Installed) SelectedDirectory = SettingsProvider.CurrentValue.Games.InstallDirectories.FirstOrDefault(d => Game.InstallDirectory.StartsWith(d)); if (String.IsNullOrWhiteSpace(SelectedDirectory)) SelectedDirectory = SettingsProvider.CurrentValue.Games.InstallDirectories.First(); RemoteGame = await GameClient.GetAsync(Options.Key); await LoadAddons(); await LoadTools(); var localAddons = Game?.DependentGames.Where(g => g.Installed).Select(addon => addon.Id).ToArray() ?? []; SelectedAddons = Addons?.Where(addon => localAddons.Contains(addon.Id)).ToList() ?? []; var localTools = Game?.Tools.Where(t => t.Installed).Select(tool => tool.Id).ToArray() ?? []; SelectedTools = Tools?.Where(tool => localTools.Contains(tool.Id)).ToList() ?? []; } async Task LoadAddons() { try { Addons = (await GameClient.GetAddonsAsync(Options.Key)).OrderByTitle(g => g.SortTitle ?? g.Title).ToList(); } catch (Exception ex) { // TODO: Add logging Addons = []; } } async Task LoadTools() { try { Tools = (await GameClient.GetToolsAsync(Options.Key)).OrderByTitle(t => t.Name).ToList(); } catch (Exception ex) { // TODO: Add logging Tools = []; } } async Task Close() { await CloseFeedbackAsync(); } async Task Install() { var game = Options.DataItem as Game; await CloseFeedbackAsync(); await InstallService.Add(game, SelectedDirectory, SelectedAddons.ToArray()); foreach (var tool in SelectedTools) await InstallService.Add(tool, SelectedDirectory); } string GetOperation() { if (!Game.Installed) return "Install"; if (Game.DependentGames.Any(g => g.Installed ^ SelectedAddons.Any(a => a.Id == g.Id))) return "Modify"; if (!Game.InstallDirectory.StartsWith(SelectedDirectory)) return "Move"; return string.Empty; } long GetDownloadSize() { long size = 0; if (RemoteGame != null && RemoteGame.Archives.Any()) { size += RemoteGame.Archives.OrderByDescending(a => a.CreatedOn).First().CompressedSize; size += SelectedAddons.Sum(a => a.Archives.OrderByDescending(arc => arc.CreatedOn).First().CompressedSize); size += SelectedTools.Sum(t => t.Archives.OrderByDescending(arc => arc.CreatedOn).First().CompressedSize); } return size; } long GetSpaceRequired() { long size = 0; if (RemoteGame != null && RemoteGame.Archives.Any()) { size += RemoteGame.Archives.OrderByDescending(a => a.CreatedOn).First().UncompressedSize; size += SelectedAddons.Sum(a => a.Archives.OrderByDescending(arc => arc.CreatedOn).First().UncompressedSize); size += SelectedTools.Sum(t => t.Archives.OrderByDescending(arc => arc.CreatedOn).First().UncompressedSize); } return size; } long GetFreeSpace(string path) { var root = Path.GetPathRoot(path); var drive = new DriveInfo(path); return drive.AvailableFreeSpace; } }