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.");
        }
    }