@using AntDesign.TableModels; @using LANCommander.PCGamingWiki @using LANCommander.SDK.Enums @inject IGDBService IGDBService @inject NavigationManager NavigationManager @inject IMessageService MessageService @inject ILogger Logger @{ RenderFragment Footer = @; } @String.Join(", ", context.Developers?.Select(d => d.Name))
@if (MoreResults && IGDBService.Authenticated) { }
@if (IGDBService.Authenticated) { } else { } @code { [Parameter] public EventCallback OnResultSelected { get; set; } [Parameter] public string ButtonText { get; set; } [Parameter] public bool AutoFocus { get; set; } [Parameter] public string Value { get; set; } [Parameter] public EventCallback ValueChanged { get; set; } ITable? ResultsTable; List Results { get; set; } = new List(); IEnumerable SelectedResults { get; set; } PCGamingWikiClient PCGamingWikiClient { get; set; } bool ModalVisible { get; set; } = false; bool Loading = true; bool MoreResults = false; int Offset = 0; protected override void OnInitialized() { PCGamingWikiClient = new PCGamingWikiClient(); } private void OnRowClicked(RowData row) { ResultsTable.SetSelection(new string[] { row.Data.IGDBId.ToString() }); } private async Task SearchFieldOnKeyDown(KeyboardEventArgs e) { if ((e.Code == "Enter" || e.Code == "NumpadEnter") && !String.IsNullOrWhiteSpace(Value)) await SearchForGame(Value); } private async Task SearchForGame(string title, bool newSearch = true) { try { Loading = true; ModalVisible = true; if (newSearch) { Results = new List(); Offset = 0; } int limit = 10; string[] fields = new string[] { "involved_companies.developer", "involved_companies.publisher", "involved_companies.company.name" }; var results = await IGDBService.SearchAsync(title, limit, Offset, fields); MoreResults = results.Count() == limit; Loading = false; if (results == null) Results = new List(); else { Results.AddRange(results.Select(r => { var result = new Game() { IGDBId = r.Id.GetValueOrDefault(), Title = r.Name, ReleasedOn = r.FirstReleaseDate.GetValueOrDefault().UtcDateTime, Developers = new List(), Publishers = new List() }; if (r.InvolvedCompanies != null && r.InvolvedCompanies.Values != null) { result.Developers = r.InvolvedCompanies.Values.Where(c => c.Developer.HasValue && c.Developer.GetValueOrDefault() && c.Company != null && c.Company.Value != null).Select(c => new Company() { Name = c.Company.Value.Name }).ToList(); result.Publishers = r.InvolvedCompanies.Values.Where(c => c.Publisher.HasValue && c.Publisher.GetValueOrDefault() && c.Company != null && c.Company.Value != null).Select(c => new Company() { Name = c.Company.Value.Name }).ToList(); } return result; })); } } catch (Exception ex) { MessageService.Error("An unknown error occurred when retrieving IGDB metadata"); Logger.LogError(ex, "An unknown error occurred when retrieving IGDB metadata"); Loading = false; ModalVisible = false; } } private async Task SelectGame() { Loading = true; var result = new GameLookupResult(); string[] fields = new string[] { "genres.*", "game_modes.*", "multiplayer_modes.*", "release_dates.*", "platforms.*", "keywords.*", "involved_companies.developer", "involved_companies.publisher", "involved_companies.company.name", "cover.*", "game_engines.*" }; result.IGDBMetadata = await IGDBService.GetAsync(SelectedResults.First().IGDBId.GetValueOrDefault(), fields); result.MultiplayerModes = await GetMultiplayerModes(result.IGDBMetadata.Name); await OnResultSelected.InvokeAsync(result); Close(); } private void Close() { Results = new List(); MoreResults = false; Offset = 0; ModalVisible = false; } private async Task ShowMore() { MoreResults = false; Offset += Results.Count; await SearchForGame(Value, false); } private async Task> GetMultiplayerModes(string gameTitle) { var multiplayerModes = new List(); try { var multiplayerInfo = await PCGamingWikiClient.GetMultiplayerPlayerInfo(gameTitle); if (multiplayerInfo != null) { foreach (var info in multiplayerInfo) { MultiplayerType type; switch (info.MultiplayerType.ToLower()) { case "local": case "local play": type = MultiplayerType.Local; break; case "lan": case "lan play": type = MultiplayerType.LAN; break; case "online": case "online play": type = MultiplayerType.Online; break; default: continue; } multiplayerModes.Add(new MultiplayerMode() { Type = type, MaxPlayers = info.PlayerCount, MinPlayers = 2, Description = info.Notes, }); } } } catch (Exception ex) { Logger?.LogError(ex, "Could not retrieve multiplayer modes from PCGamingWiki"); } return multiplayerModes; } private void NavigateToSettings() { NavigationManager.NavigateTo("/Settings/General", true); } }