Esempio n. 1
0
        public async Task SetBuildCache()
        {
            Size = 0;
            using (var scope = scopeFactory.CreateScope())
            {
                var context = scope.ServiceProvider.GetService <sc2dsstatsContext>();

                var request = new DsBuildRequest()
                {
                    Playername = "PAX",
                };
                request.SetTime("Patch 2.60");

                foreach (var cmdr in DSData.cmdrs)
                {
                    request.Interest = cmdr;
                    request.Versus   = String.Empty;

                    var result = await BuildService.GetBuild(context, request);

                    memoryCache.Set(request.CacheKey, result, BuildCacheOptions);
                    Size++;

                    foreach (var vs in DSData.cmdrs)
                    {
                        request.Versus = vs;
                        result         = await BuildService.GetBuild(context, request);

                        memoryCache.Set(request.CacheKey, result, BuildCacheOptions);
                        Size++;
                    }
                }
            }
            logger.LogInformation($"Build cache set. Now at {Size} items.");
        }
Esempio n. 2
0
        public async Task <ActionResult <DsBuildResponse> > GetBuild(DsBuildRequest request)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            DsBuildResponse response;

            if (!memoryCache.TryGetValue(request.CacheKey, out response))
            {
                response = await BuildService.GetBuild(context, request);

                memoryCache.Set(request.CacheKey, response, CacheService.BuildCacheOptions);
                sw.Stop();
                logger.LogInformation($"Get Build in {sw.ElapsedMilliseconds} ms");
            }
            else
            {
                sw.Stop();
                logger.LogInformation($"Get Build from Cache in {sw.ElapsedMilliseconds} ms");
            }
            return(response);
        }
Esempio n. 3
0
 public async Task <DsBuildResponse> GetBuild(DsBuildRequest request)
 {
     return(await BuildService.GetBuild(context, request));
 }
Esempio n. 4
0
 public static IQueryable <BuildHelper> GetBuildResultQuery(IQueryable <Dsreplay> replays, DsBuildRequest request, List <string> playernames)
 {
     return((String.IsNullOrEmpty(request.Versus), !playernames.Any()) switch
     {
         (true, true) => from r in replays
         from p in r.Dsplayers
         where p.Race == (byte)DSData.GetCommander(request.Interest)
         from b in p.Breakpoints
         select new BuildHelper()
         {
             Id = r.Id,
             Hash = r.Hash,
             Gametime = r.Gametime,
             UnitString = b.DsUnitsString,
             Win = p.Win,
             UpgradeSpending = b.Upgrades,
             GasCount = b.Gas,
             Breakpoint = b.Breakpoint1,
             Duration = r.Duration
         },
         (true, false) => from r in replays
         from p in r.Dsplayers
         where p.Race == (byte)DSData.GetCommander(request.Interest) && playernames.Contains(p.Name)
         from b in p.Breakpoints
         select new BuildHelper()
         {
             Id = r.Id,
             Hash = r.Hash,
             Gametime = r.Gametime,
             UnitString = b.DsUnitsString,
             Win = p.Win,
             UpgradeSpending = b.Upgrades,
             GasCount = b.Gas,
             Breakpoint = b.Breakpoint1,
             Duration = r.Duration
         },
         (false, true) => from r in replays
         from p in r.Dsplayers
         where p.Race == (byte)DSData.GetCommander(request.Interest) && p.Opprace == (byte)DSData.GetCommander(request.Versus)
         from b in p.Breakpoints
         select new BuildHelper()
         {
             Id = r.Id,
             Hash = r.Hash,
             Gametime = r.Gametime,
             UnitString = b.DsUnitsString,
             Win = p.Win,
             UpgradeSpending = b.Upgrades,
             GasCount = b.Gas,
             Breakpoint = b.Breakpoint1,
             Duration = r.Duration
         },
         (false, false) => from r in replays
         from p in r.Dsplayers
         where p.Race == (byte)DSData.GetCommander(request.Interest) && p.Opprace == (byte)DSData.GetCommander(request.Versus) && playernames.Contains(p.Name)
         from b in p.Breakpoints
         select new BuildHelper()
         {
             Id = r.Id,
             Hash = r.Hash,
             Gametime = r.Gametime,
             UnitString = b.DsUnitsString,
             Win = p.Win,
             UpgradeSpending = b.Upgrades,
             GasCount = b.Gas,
             Breakpoint = b.Breakpoint1,
             Duration = r.Duration
         },
     });
Esempio n. 5
0
        public static async Task <DsBuildResponse> GetBuild(sc2dsstatsContext context, DsBuildRequest request)
        {
            var replays = ReplayFilter.DefaultFilter(context);

            replays = replays.Where(x => x.Gametime >= request.StartTime);
            if (request.EndTime != DateTime.Today)
            {
                replays = replays.Where(x => x.Gametime <= request.EndTime);
            }

            IQueryable <BuildHelper> buildResults;

            if (request.Playernames == null || !request.Playernames.Any())
            {
                string Playername = request.Playername;
                if (!String.IsNullOrEmpty(Playername))
                {
                    var player = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.Name == request.Playername);

                    if (player != null)
                    {
                        Playername = player.DbId.ToString();
                    }
                    //Playername = request.Playername switch
                    //{
                    //    "PAX" => await context.DsPlayerNames.FirstOrDefaultAsync(f => f.Name ==),
                    //    "Feralan" => "e2dfd75fcad1c454cfb2526fae4f3feb5e901039f7d366f69094c0d16a12e338",
                    //    "Panzerfaust" => "bd78339bb80c299a6c82812d9d4547d09cf15b0e8bb99b38090dc3bc4a5af8b5",
                    //    _ => "b33aef3fcc740b0d67eda3faa12c0f94cef5213fe70921d72fc2bfa8125a5889"
                    //};
                }

                buildResults = GetBuildResultQuery(replays, request, new List <string>()
                {
                    Playername
                });
            }
            else
            {
                buildResults = GetBuildResultQuery(replays, request, request.Playernames);
            }

            var builds = await buildResults.AsSplitQuery().ToListAsync();

            var uniqueBuilds = builds.GroupBy(g => g.Id).Select(s => s.First()).ToList();


            var response = new DsBuildResponse()
            {
                Interest = request.Interest,
                Versus   = request.Versus,
                Count    = uniqueBuilds.Count,
                Wins     = uniqueBuilds.Where(s => s.Win).Count(),
                Duration = uniqueBuilds.Sum(s => s.Duration),
                Gas      = uniqueBuilds.Sum(s => s.GasCount),
                Upgrades = uniqueBuilds.Sum(s => s.UpgradeSpending),
                Replays  = uniqueBuilds.Select(t => new DsBuildResponseReplay()
                {
                    Hash     = t.Hash,
                    Gametime = t.Gametime
                }).ToList(),
                Breakpoints = new List <DsBuildResponseBreakpoint>()
            };

            var breakpoints = buildResults.Select(s => s.Breakpoint).Distinct();

            foreach (var bp in breakpoints)
            {
                var bpReplays = builds.Where(x => x.Breakpoint == bp).ToList();

                response.Breakpoints.Add(new DsBuildResponseBreakpoint()
                {
                    Breakpoint = bp,
                    Count      = bpReplays.Count,
                    Wins       = bpReplays.Where(x => x.Win).Count(),
                    Duration   = bpReplays.Sum(s => s.Duration),
                    Gas        = bpReplays.Sum(s => s.GasCount),
                    Upgrades   = bpReplays.Sum(s => s.UpgradeSpending),
                    Units      = GetUnits(bpReplays.Select(s => s.UnitString).ToList())
                });
            }
            return(response);
        }