Exemplo n.º 1
0
        /// <summary>
        /// Requests data for current region from game api.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="requestUri"></param>
        /// <param name="namespace"></param>
        /// <param name="requestOptions"></param>
        /// <returns></returns>
        public async Task <T> GetAsync <T>(string requestUri, string @namespace, RequestOptions requestOptions = null)
        {
            // Use default region and locale if not specified in request scope
            var region = requestOptions?.Region ?? _defaultApiConfiguration.Region;
            var locale = requestOptions.UseRegionLocale
                ? region.GetDefaultLocale()
                : (requestOptions?.Locale ?? _defaultApiConfiguration.Locale);
            var useCache      = requestOptions?.UseCache ?? _defaultApiConfiguration.UseCache;
            var cacheDuration = requestOptions?.CacheDuration ?? _defaultApiConfiguration.CacheDuration;

            // Refresh token
            var token = await RequestTokenAsync(region);

            // Build query string
            var queryParams = requestOptions?.QueryParams ?? new Dictionary <string, string>();

            queryParams.Add("locale", locale.ToQueryString());
            if (!string.IsNullOrEmpty(@namespace))
            {
                queryParams.Add("namespace", $"{@namespace}-{region.ToQueryString()}");
            }

            var finalUri = QueryHelpers.AddQueryString($"{_defaultApiConfiguration.GetGameApiUrl(region)}{requestUri}", queryParams);

            // Setup request authorization
            _gameApiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);

            // Send request
            var response = useCache ? await _cache.GetAsync <string>(finalUri) : null;

            if (response == null)
            {
                using var responseMessage = await _gameApiClient.GetAsync(finalUri);

                responseMessage.EnsureSuccessStatusCode();

                response = await responseMessage.Content.ReadAsStringAsync();

                if (useCache)
                {
                    _cache.Add(finalUri, response, TimeSpan.FromSeconds(cacheDuration));
                }
            }

            // Return response
            return(JsonConvert.DeserializeObject <T>(response));
        }