Example #1
0
        private async Task <Character?> _GetCharacterFromCensusByName(string name, bool retry)
        {
            CensusQuery query = _Census.Create("character");

            query.Where("name.first_lower").Equals(name.ToLower());
            query.AddResolve("outfit");

            try {
                JToken result = await query.GetAsync();

                Character?player = _ParseCharacter(result);

                return(player);
            } catch (CensusConnectionException ex) {
                if (retry == true)
                {
                    _Logger.LogWarning("Retrying {Char} from API", name);
                    return(await _GetCharacterFromCensusByName(name, false));
                }
                else
                {
                    _Logger.LogError(ex, "Failed to get {0} from API", name);
                    throw ex;
                }
            }
        }
Example #2
0
        public async Task CacheBlock(List <string> IDs)
        {
            _Logger.LogInformation($"Caching {IDs.Count} characters");

            int blockSize = 20;

            for (int i = 0; i < IDs.Count; i += blockSize)
            {
                int           count = Math.Min(blockSize, IDs.Count - i);
                List <string> block = IDs.GetRange(i, count);

                CensusQuery query = _Census.Create("character");
                foreach (string ID in block)
                {
                    query.Where("character_id").Equals(ID);
                }
                query.AddResolve("outfit");
                query.AddResolve("outfit", "online_status");
                query.ShowFields("character_id", "name", "faction_id", "outfit", "online_status");

                List <JToken> tokens = (await query.GetListAsync()).ToList();
                foreach (JToken token in tokens)
                {
                    Character?c = _ParseCharacter(token);
                    if (c != null)
                    {
                        _Cache.TryAdd(c.ID, c);
                    }
                }

                //_Logger.LogInformation($"Cached {i}/{IDs.Count} characters");
            }
            _Logger.LogInformation($"Cached all characters");
        }
Example #3
0
        private async Task <Character?> _GetCharacterFromCensus(string ID, bool retry)
        {
            CensusQuery query = _Census.Create("character");

            query.Where("character_id").Equals(ID);
            query.AddResolve("outfit", "online_status");
            query.ShowFields("character_id", "name", "faction_id", "outfit", "online_status");

            try {
                JToken result = await query.GetAsync();

                Character?player = _ParseCharacter(result);

                return(player);
            } catch (CensusConnectionException ex) {
                if (retry == true)
                {
                    _Logger.LogWarning("Retrying {Char} from API", ID);
                    return(await _GetCharacterFromCensus(ID, false));
                }
                else
                {
                    _Logger.LogError(ex, "Failed to get {0} from API", ID);
                    throw ex;
                }
            }
        }
Example #4
0
        public Uri CreateRequestUri(CensusQuery query)
        {
            var sId = query.ServiceId ?? _options.Value.CensusServiceId;
            var ns  = query.ServiceNamespace ?? _options.Value.CensusServiceNamespace;

            var encArgs = query.ToString();

            return(new Uri($"http://{Constants.CensusEndpoint}/s:{sId}/get/{ns}/{encArgs}"));
        }
Example #5
0
        public async Task <IEnumerable <T> > ExecuteQueryBatch <T>(CensusQuery query)
        {
            var           count       = 0;
            List <JToken> batchResult = new List <JToken>();

            if (query.Limit == null)
            {
                query.SetLimit(Constants.DefaultBatchLimit);
            }

            if (query.Start == null)
            {
                query.SetStart(count);
            }

            var result = await ExecuteQueryList <JToken>(query);

            if (result.Count() < Constants.DefaultBatchLimit)
            {
                return(result.Select(r => Convert <T>(r)));
            }

            do
            {
                batchResult.AddRange(result);

                if (result.Count() < Constants.DefaultBatchLimit)
                {
                    return(batchResult.Select(r => Convert <T>(r)));
                }

                count += result.Count();
                query.SetStart(count);

                result = await ExecuteQuery <JToken>(query);
            } while (result.Any());

            return(batchResult.Select(r => Convert <T>(r)));
        }
Example #6
0
        public async Task <T> ExecuteQuery <T>(CensusQuery query)
        {
            var requestUri = CreateRequestUri(query);

            _logger.LogTrace(85400, $"Getting Census request for: \"{ requestUri}\"");

            try
            {
                HttpResponseMessage result;

                try
                {
                    result = await _client.GetAsync(requestUri);
                }
                catch (HttpRequestException ex)
                {
                    var exMessage    = ex.InnerException?.Message ?? ex.Message;
                    var errorMessage = $"Census query failed for query: {requestUri}: {exMessage}";

                    throw new CensusConnectionException(errorMessage);
                }

                _logger.LogTrace(85401, $"Census Request completed with status code: {result.StatusCode}");

                if (!result.IsSuccessStatusCode)
                {
                    throw new CensusConnectionException($"Census returned status code {result.StatusCode}");
                }

                JToken jResult;

                try
                {
                    var serializedString = await result.Content.ReadAsStringAsync();

                    jResult = JsonConvert.DeserializeObject <JToken>(serializedString, new JsonSerializerSettings
                    {
                        ContractResolver = new UnderscorePropertyNamesContractResolver()
                    });
                }
                catch (JsonReaderException)
                {
                    throw new CensusException("Failed to read JSON. Endpoint may be in maintence mode.");
                }

                var error     = jResult.Value <string>("error");
                var errorCode = jResult.Value <string>("errorCode");

                if (error != null)
                {
                    if (error == "service_unavailable")
                    {
                        throw new CensusServiceUnavailableException();
                    }
                    else
                    {
                        throw new CensusServerException(error);
                    }
                }
                else if (errorCode != null)
                {
                    var errorMessage = jResult.Value <string>("errorMessage");

                    throw new CensusServerException($"{errorCode}: {errorMessage}");
                }

                var jBody = jResult.SelectToken($"{query.ServiceName}_list");
                return(Convert <T>(jBody));
            }
            catch (Exception ex)
            {
                HandleCensusExceptions(ex, requestUri);
                throw ex;
            }
        }
Example #7
0
 public Task <IEnumerable <T> > ExecuteQueryList <T>(CensusQuery query)
 {
     return(ExecuteQuery <IEnumerable <T> >(query));
 }