Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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($"--------------------------------------");
        }