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; } } }
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"); }
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; } } }
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}")); }
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))); }
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; } }
public Task <IEnumerable <T> > ExecuteQueryList <T>(CensusQuery query) { return(ExecuteQuery <IEnumerable <T> >(query)); }