public async Task <CharacterSearchResult> Process(CharacterSearchCriteria criteria) { _validator.ValidateAndThrow(criteria); _logger.LogTrace("Processing character search. Query: '{Query}'.", criteria.Query); var(name, server) = NameServerEngine.Parse(criteria.Query); var searchQuery = new SearchCharacterQuery() { Name = name, Server = server }; _logger.LogDebug("Searching character. Name: '{Name}'. Server: '{Server}'.", searchQuery.Name, searchQuery.Server); var searchData = await _xivApiAccessor.SearchCharacter(searchQuery); _logger.LogTrace("Search yielded {Count} results. Taking top five.", searchData.Pagination?.ResultsTotal); var topFiveCharacters = searchData.Results.Take(5); return(new CharacterSearchResult() { Characters = ProcessDetails(topFiveCharacters) }); }
public async Task Search([Remainder] string query) { using var setTyping = Context.Channel.EnterTypingState(); var criteria = new CharacterSearchCriteria() { Query = query }; CharacterSearchResult result; try { result = await _characterSearchManager.Process(criteria); } catch (Exception ex) { _logger.LogError(ex, "Exception thrown during character search."); await ReplyAsync("Unfortunately something went wrong with the search."); return; } if (result.Characters is null) { await ReplyAsync("I did not find any characters with that query."); return; } var tasks = new ConcurrentBag <Task>(); await foreach (var character in result.Characters) { var embed = new EmbedBuilder() .WithColor(new Color(114, 137, 218)) .WithTitle(character.Name) .WithUrl(character.LodestoneUrl) .WithThumbnailUrl(character.AvatarUrl) .WithDescription(BuildDescription(character)) .Build(); tasks.Add(ReplyAsync(message: null, isTTS: false, embed: embed)); } await Task.WhenAll(tasks); if (tasks.IsEmpty) { await ReplyAsync("I did not find any characters with that query."); } }