private async Task<string> ProcessAuthToken(LeagueRegion region, AuthorizationResponse response, int retryCount = 0) { if (!string.IsNullOrWhiteSpace(response.Token)) return response.Token; if (retryCount > MaxRetries) throw new TimeoutException("Retry limit exceeded. Try again later."); // Sleep for a small amount of time await Task.Delay(TimeSpan.FromMilliseconds(response.Delay/10)); Debug.WriteLine("Retrieving auth token for user: {0}, attempt: {1}", response.User, retryCount); using (var client = new HttpClient()) { try { var uri = new Uri(region.QueueUri, "/login-queue/rest/queue/authToken/" + response.User); var data = await client.GetStringAsync(uri); var parsed = JsonConvert.DeserializeObject<AuthorizationResponse>(data); return await ProcessAuthToken(region, parsed, retryCount); } catch (Exception) { Debug.WriteLine("Could not parse response, retrying."); } return await ProcessAuthToken(region, response, retryCount + 1); } }
private async Task<string> ProcessTicker(LeagueRegion region, AuthorizationResponse response, AuthorizationTicker ticker) { var position = ticker.Id - ticker.Current; Debug.WriteLine("In login queue (#" + position + " in line)"); if (position <= response.Rate) return await ProcessAuthToken(region, response); // Sleep until the queue updates await Task.Delay(TimeSpan.FromMilliseconds(response.Rate)); using (var client = new HttpClient()) { var uri = new Uri(region.QueueUri, "/login-queue/rest/queue/ticker/" + response.Champ); var data = await client.GetStringAsync(uri); var parsed = JObject.Parse(data); JToken nextPosition; if (!parsed.TryGetValue(response.Node.ToString(), out nextPosition)) return await ProcessTicker(region, response, ticker); var hex = nextPosition.Value<string>(); var next = Convert.ToInt32(hex, 16); // convert from Hex (base-16) ticker.Current = next; return await ProcessTicker(region, response, ticker); } }