Example #1
0
        public async Task <CalculateLeaderboardsResult> CalculateLeaderboards()
        {
            var result = new CalculateLeaderboardsResult();

            result.GameTypes.Add("qm", 1);
            result.GameTypes.Add("ud", 2);
            result.GameTypes.Add("sl", 5);

            var heroes = await _context.Heroes.Select(x => new { x.Name, x.Id, x.NewRole }).ToListAsync();

            foreach (var hero in heroes)
            {
                result.Heroes.Add(hero.Name, (int)hero.Id);
            }

            var mmrTypeIds = await(from m in _context.MmrTypeIds
                                   join h in _context.Heroes on m.Name equals h.NewRole
                                   group h by new { m.MmrTypeId, m.Name }
                                   into g
                                   select new
            {
                g.Key.MmrTypeId,
                g.Key.Name
            }).ToListAsync();

            foreach (var mmrTypeId in mmrTypeIds)
            {
                result.Roles.Add(mmrTypeId.Name, (int)mmrTypeId.MmrTypeId);
            }

            var maxCacheNumber = await _cacheContext.TableCacheValue.Where(x => x.TableToCache == "leaderboard")
                                 .MaxAsync(x => x.CacheNumber);


            var maxSeasonDatesId = await _context.SeasonDates.MaxAsync(x => x.Id);

            result.Season = (int)maxSeasonDatesId;

            var startDate = (await _context.SeasonDates.FirstOrDefaultAsync(x => x.Id == result.Season))?.StartDate ??
                            DateTime.Now;

            var weeks = (int)Math.Round((DateTime.Now - startDate).TotalDays / 7, 0);

            if (weeks == 0)
            {
                weeks = 1;
            }

            foreach (var shortGameMode in result.GameTypes.Keys)
            {
                Console.WriteLine("Running Player data for " + shortGameMode);

                await GetPlayers("player", result.Season, startDate, weeks, result.GameTypes[shortGameMode], 10000,
                                 maxCacheNumber);


                foreach (var hero in result.Heroes.Keys)
                {
                    Console.WriteLine("Running " + hero + " data for " + shortGameMode);

                    await GetPlayers("hero", result.Season, startDate, weeks, result.GameTypes[shortGameMode],
                                     result.Heroes[hero], maxCacheNumber);
                }

                foreach (var role in result.Roles.Keys)
                {
                    Console.WriteLine("Running " + role + " data for " + shortGameMode);

                    await GetPlayers("role", result.Season, startDate, weeks, result.GameTypes[shortGameMode],
                                     result.Roles[role], maxCacheNumber);
                }
            }

            await _cacheContext.TableCacheValue.AddAsync(new TableCacheValue
            {
                TableToCache = "leaderboard",
                DateCached   = DateTime.Now
            });

            await _cacheContext.SaveChangesAsync();

            return(result);
        }