예제 #1
0
    public async Task <FreeCompanySearchResult> Process(FreeCompanySearchCriteria criteria)
    {
        _validator.ValidateAndThrow(criteria);

        _logger.LogTrace("Processing Free Company search. Query: '{Query}'.", criteria.Query);

        var(name, server) = NameServerEngine.Parse(criteria.Query);
        var searchQuery = new SearchFreeCompanyQuery()
        {
            Name   = name,
            Server = server
        };

        _logger.LogDebug("Searching Free Company. Name: '{Name}'. Server: '{Server}'.", searchQuery.Name, searchQuery.Server);

        var searchData = await _xivApiAccessor.SearchFreeCompany(searchQuery);

        _logger.LogTrace("Search yielded {Count} results.", searchData.Pagination?.ResultsTotal);

        var result = new FreeCompanySearchResult()
        {
            FreeCompanies = searchData.Results?.Select(freeCompany => new Abstractions.Business.Models.FreeCompanySearch.FreeCompany()
            {
                Crest  = freeCompany.Crest,
                Id     = freeCompany.Id,
                Name   = freeCompany.Name,
                Server = freeCompany.Server
            })
        };

        return(result);
    }
예제 #2
0
    public async Task <SearchFreeCompanyData> SearchFreeCompany(SearchFreeCompanyQuery query)
    {
        var name   = WebUtility.UrlEncode(query.Name);
        var server = query.Server is object?WebUtility.UrlEncode(query.Server) : null;

        var uri = $"/freecompany/search?private_key={_privateKey}&name={name}";

        if (!string.IsNullOrEmpty(server))
        {
            uri += $"&server={server}";
        }

        var data = await Send <SearchFreeCompanyData>(uri);

        return(data);
    }
예제 #3
0
    public async Task <SetVerificationResult> SetVerification(SetVerificationCriteria criteria)
    {
        _setVerificationValidator.ValidateAndThrow(criteria);

        _logger.LogDebug("Setting verification options for guild '{GuildId}' with role '{RoleId}' and free company '{Query}'.", criteria.GuildId, criteria.RoleId, criteria.FreeCompanyAndServer);

        var(name, server) = NameServerEngine.Parse(criteria.FreeCompanyAndServer);

        var fcSearchQuery = new SearchFreeCompanyQuery()
        {
            Name   = name,
            Server = server
        };

        _logger.LogDebug("Searching for free company '{FreeCompanyName}' on server '{ServerName}'", name, server);

        var fcSearchData = await _xivApiAccessor.SearchFreeCompany(fcSearchQuery);

        // Find single, exact match.
        var fc = fcSearchData.Results?.SingleOrDefault(x =>
                                                       (x.Name?.Equals(name, StringComparison.OrdinalIgnoreCase) ?? false) &&
                                                       (x.Server?.Equals(server, StringComparison.OrdinalIgnoreCase) ?? false));

        if (fc is null)
        {
            _logger.LogDebug("Could not find single exact match of '{FreeCompanyName}' on server '{ServerName}'", name, server);

            return(new SetVerificationResult()
            {
                Status = SetVerificationStatus.FreeCompanyNotFound
            });
        }

        _logger.LogDebug("Found free company '{FreeCompanyName}' with Id '{FreeCompanyId}'. Saving verification options to database.", fc.Name, fc.Id);

        var getOptionsQuery = new GetOptionsQuery()
        {
            GuildId = criteria.GuildId
        };

        var options = await _guildAccessor.GetOptions(getOptionsQuery) ?? new GuildOptions();

        options.Id             = criteria.GuildId;
        options.VerifiedRoleId = criteria.RoleId;
        options.FreeCompany    = new Abstractions.Data.Storage.Models.Guild.FreeCompany()
        {
            Id     = fc.Id,
            Name   = fc.Name,
            Server = fc.Server
        };

        var saveOptionsQuery = new SaveOptionsQuery()
        {
            Options = options
        };

        await _guildAccessor.SaveOptions(saveOptionsQuery);

        return(new SetVerificationResult()
        {
            Status = SetVerificationStatus.Success
        });
    }