private async void UpdateLadder(string league) { LadderStore.SetLadderRunning(league); var oldLadder = LadderStore.GetLadder(league); var newLadder = new List <LadderPlayerModel>(); var pages = Enumerable.Range(0, 25); using (var rateGate = new RateGate(2, TimeSpan.FromSeconds(1))) { foreach (int page in pages) { await rateGate.WaitToProceed(); LadderApiResponse result = await FetchLadderApiPage(league, page); if (result != null) { var LadderPlayerList = result.Entries.Select(t => new LadderPlayerModel() { Name = t.Character.Name, Level = t.Character.Level, Online = t.Online, Dead = t.Dead, Account = t.Account.Name, Experience = t.Character.Experience, ExperiencePerHour = 0, Rank = new LadderPlayerRankModel() { Overall = t.Rank }, Depth = new LadderPlayerDepthModel() { Solo = t.Character.Depth != null ? t.Character.Depth.Solo : 0, Group = t.Character.Depth != null ? t.Character.Depth.@default : 0 }, Twitch = t.Account.Twitch?.Name, Class = t.Character.Class, Updated = DateTime.Now }).ToList(); // Convert result to LadderPlayer model here newLadder.AddRange(LadderPlayerList); if (newLadder.Count == result.Total || result.Entries.Count == 0) { break; } } else { LadderStore.RemoveLadderStatus(league); break; } } } if (newLadder.Count > 0) { newLadder = CalculateStatistics(oldLadder, newLadder); LadderStore.SetLadder(league, newLadder); LadderStore.SetLadderFinished(league); } }
private async Task UpdateLadder(string leagueName) { Log($"Starting to fetch {leagueName} ladder"); await _repository.SetLadderRunning(leagueName); var ladder = new List <LadderPlayerModel>(); var sortModes = new List <string>() { null, "depth", "depthsolo" }; var pages = Enumerable.Range(0, 75); foreach (var sortMode in sortModes) { var sortNiceName = sortMode ?? "overall"; Log($"Using mode: {sortNiceName}"); foreach (int page in pages) { var interval = 1250; var elapsed = 0; using (var stopwatch = new DisposableStopwatch()) { LadderApiResponse result = await FetchLadderApiPage(leagueName, page, sortMode); if (result != null) { var LadderPlayerList = result.Entries. Where(t => !ladder.Any(x => x.Name == t.Character.Name)) .Select(t => new LadderPlayerModel(t)).ToList(); ladder.AddRange(LadderPlayerList); if (ladder.Count == result.Total || result.Entries.Count == 0) { break; } } else { await _repository.RemoveLadder(leagueName); break; } elapsed = (int)stopwatch.sw.ElapsedMilliseconds; if (interval > elapsed) { Task.Delay(interval - elapsed).Wait(); } } } } if (ladder.Count > 0) { ladder = CalculateStatistics(ladder); await _repository.UpdateLadder(leagueName, ladder); } Log($"Finished fetching {leagueName} ladder."); Log($"--------------------------------------"); }