Exemple #1
0
        private static async Task <List <DbStatsResult> > GetMVPData(sc2dsstatsContext context, DsRequest request)
        {
            var replays = ReplayFilter.Filter(context, request);

            var results = from r in replays
                          from p in r.Dsplayers
                          select new DbStatsResult()
            {
                Id       = r.Id,
                Race     = p.Race,
                OppRace  = p.Opprace,
                Duration = r.Duration,
                Win      = p.Win,
                Player   = p.isPlayer,
                MVP      = p.Killsum == r.Maxkillsum
            };

            if (request.Interest != "ALL")
            {
                results = results.Where(x => x.Race == (byte)DSData.GetCommander(request.Interest));
            }

            if (request.Player)
            {
                results = results.Where(x => x.Player);
            }

            return(await results.ToListAsync());
        }
        public static async Task <List <DbStatsResult> > GetTimelineData(TimelineRequest request, sc2dsstatsContext context)
        {
            var replays = ReplayFilter.Filter(context, request);

            var results = from r in replays
                          from p in r.Dsplayers
                          where p.Race == (byte)DSData.GetCommander(request.Interest)
                          select new DbStatsResult()
            {
                Id       = r.Id,
                Win      = p.Win,
                GameTime = r.Gametime,
                Player   = p.isPlayer,
                OppRace  = p.Opprace
            };

            if (request.Player)
            {
                results = results.Where(x => x.Player);
            }

            if (request.Versus != "ALL")
            {
                results = results.Where(x => x.OppRace == (byte)DSData.GetCommander(request.Versus));
            }

            return(await results.ToListAsync());
        }
Exemple #3
0
        public static async Task <DsResponse> GetSynergy(sc2dsstatsContext context, DsRequest request)
        {
            var timestrings = DSData.Timestrings(request.Timespan);

            var results = context.DsTimeResults
                          .Include(i => i.Teammates)
                          .AsNoTracking()
                          .Where(x => x.Player == request.Player && timestrings.Contains(x.Timespan) && x.Cmdr == request.Interest);

            var synresults = await results.ToListAsync();

            int tcount   = synresults.Sum(s => s.Count);
            var response = new DsResponse()
            {
                Interest    = request.Interest,
                Count       = tcount,
                AvgDuration = (int)(synresults.Sum(s => s.Duration) / tcount),
                Items       = new List <DsResponseItem>()
            };

            foreach (var cmdr in DSData.cmdrs)
            {
                var teammates = synresults.SelectMany(s => s.Teammates).Where(x => x.Cmdr == cmdr);
                int count     = teammates.Sum(s => s.Count);
                response.Items.Add(new DsResponseItem()
                {
                    Label = cmdr,
                    Count = count / 6,
                    Wins  = teammates.Sum(s => s.Wins)
                });
            }

            return(response);
        }
        public static DsResponse GetMvp(DsRequest request, List <CmdrStats> cmdrstats)
        {
            var stats = GetTimeStats(request, cmdrstats);

            if (request.Interest != "ALL")
            {
                stats = stats.Where(x => x.RACE == (byte)DSData.GetCommander(request.Interest)).ToList();
            }

            List <DsResponseItem> items = request.Interest == "ALL"
                ? stats.GroupBy(g => g.RACE).Select(s => new DsResponseItem
            {
                Label = ((Commander)s.Key).ToString(),
                Count = s.Sum(c => c.count),
                Wins  = s.Sum(c => c.mvp),
            }).ToList()
                : stats.GroupBy(g => g.OPPRACE).Select(s => new DsResponseItem
            {
                Label = ((Commander)s.Key).ToString(),
                Count = s.Sum(c => c.count),
                Wins  = s.Sum(c => c.mvp),
            }).ToList();
            int tcount = items.Sum(s => s.Count);

            return(new DsResponse()
            {
                Interest = request.Interest,
                Count = request.Player ? tcount : tcount / 6,
                AvgDuration = tcount == 0 ? 0 : (int)(stats.Sum(s => s.duration) / tcount),
                Items = items
            });
        }
Exemple #5
0
 public Dsreplay(DsReplayDto dto)
 {
     Dsplayers = dto.DSPlayer.Select(s => new Dsplayer()
     {
         Breakpoints = s.Breakpoints.Select(b => new Breakpoint()
         {
             Breakpoint1      = b.Breakpoint,
             Gas              = b.Gas,
             Income           = b.Income,
             Army             = b.Army,
             Kills            = b.Kills,
             Upgrades         = b.Upgrades,
             Tier             = b.Tier,
             Mid              = b.Mid,
             DsUnitsString    = b.dsUnitsString,
             DbUnitsString    = b.dbUnitsString,
             DbUpgradesString = b.dbUpgradesString
         }).ToList(),
         Pos       = (byte)s.POS,
         Realpos   = (byte)s.REALPOS,
         Name      = s.NAME,
         Race      = (byte)DSData.GetCommander(s.RACE),
         Opprace   = (byte)DSData.GetCommander(s.OPPRACE),
         Win       = s.WIN,
         Team      = (byte)s.TEAM,
         Killsum   = s.KILLSUM,
         Income    = s.INCOME,
         Pduration = s.PDURATION,
         Army      = s.ARMY,
         Gas       = (byte)s.GAS,
         isPlayer  = s.isPlayer
     }).ToList();
     Middles = dto.Middle.Select(m => new Middle()
     {
         Gameloop = m.Gameloop,
         Team     = (byte)m.Team
     }).ToList();
     Replay      = dto.REPLAY;
     Gametime    = dto.GAMETIME;
     Winner      = (sbyte)dto.WINNER;
     Duration    = dto.DURATION;
     Minkillsum  = dto.MINKILLSUM;
     Maxkillsum  = dto.MAXKILLSUM;
     Minarmy     = dto.MINARMY;
     Minincome   = dto.MININCOME;
     Maxleaver   = dto.MAXLEAVER;
     Playercount = (byte)dto.PLAYERCOUNT;
     Reported    = (byte)dto.REPORTED;
     Isbrawl     = dto.ISBRAWL;
     Gamemode    = (byte)DSData.GetGameMode(dto.GAMEMODE);
     Version     = dto.VERSION;
     Hash        = dto.HASH;
     Replaypath  = dto.REPLAYPATH;
     Objective   = dto.OBJECTIVE;
     Upload      = dto.Upload;
     Bunker      = dto.Bunker;
     Cannon      = dto.Cannon;
     Mid1        = dto.Mid1;
     Mid2        = dto.Mid2;
 }
Exemple #6
0
        private static IQueryable <Dsreplay> GetCountReplays(sc2dsstatsContext context, DsRequest request)
        {
            var replays = context.Dsreplays.Where(x => x.Gametime > request.StartTime);

            if (request.Filter == null)
            {
                replays = replays.Where(x => new List <int>()
                {
                    (int)Gamemode.Commanders, (int)Gamemode.CommandersHeroic
                }.Contains(x.Gamemode));
            }
            else if (request.Filter.GameModes.Any())
            {
                replays = replays.Where(x => request.Filter.GameModes.Contains(x.Gamemode));
            }

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

            if (!String.IsNullOrEmpty(request.Interest) && !request.Interest.Equals("ALL"))
            {
                replays = replays.Include(i => i.Dsplayers);
                if (request.Player)
                {
                    replays = from r in replays
                              from p in r.Dsplayers
                              where p.isPlayer && p.Race == (byte)DSData.GetCommander(request.Interest)
                              select r;
                }
                else
                {
                    replays = from r in replays
                              from p in r.Dsplayers
                              where p.Race == (byte)DSData.GetCommander(request.Interest)
                              select r;
                }
                replays = replays.Distinct();
            }
            if (request.Filter != null && request.Filter.Players.Any())
            {
                replays = from r in replays
                          from p in r.Dsplayers
                          where request.Filter.Players.Contains(p.Name)
                          select r;
                if (request.Filter.Players.Count > 0)
                {
                    return(replays.Distinct());
                }
            }

            return(replays);
        }
Exemple #7
0
        public static async Task <DsResponse> GetCrosstableFromTimeResults(sc2dsstatsContext context, DsRequest request)
        {
            var timestrings = DSData.Timestrings(request.Timespan, true);

            var results = await context.DsTimeResults
                          .AsNoTracking()
                          .Where(x =>
                                 x.Player == request.Player &&
                                 timestrings.Contains(x.Timespan))
                          .ToListAsync();

            CrosstableResponse response = new CrosstableResponse()
            {
                Interest = "CrossTable",
                Items    = new List <CrosstableResponseItem>()
            };

            var removeMonths = new List <string>()
            {
                DateTime.Today.ToString("yyyyMM")
            };

            if (DateTime.Today.Day < 16)
            {
                removeMonths.Add((DateTime.Today.AddMonths(-1)).ToString("yyyyMM"));
            }

            foreach (var cmdr in DSData.cmdrs)
            {
                var cmdrResults = results.Where(x => x.Cmdr == cmdr).ToArray();

                foreach (var vs in DSData.cmdrs)
                {
                    if (vs == cmdr)
                    {
                        response.Items.Add(new CrosstableResponseItem());
                    }
                    else
                    {
                        var vsResults    = cmdrResults.Where(x => x.Opp == vs).ToArray();
                        var oldVsResults = vsResults.Where(x => !removeMonths.Contains(x.Timespan)).ToArray();
                        response.Items.Add(new CrosstableResponseItem()
                        {
                            Label    = $"{cmdr} vs {vs}",
                            Count    = vsResults.Sum(s => s.Count),
                            Wins     = vsResults.Sum(s => s.Wins),
                            OldCount = oldVsResults.Sum(s => s.Count),
                            OldWins  = oldVsResults.Sum(s => s.Wins),
                        });
                    }
                }
            }
            return(response);
        }
Exemple #8
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, sc2dsstatsContext context, ILoggerFactory loggerFactory)
        {
            CultureInfo.DefaultThreadCurrentCulture   = CultureInfo.InvariantCulture;
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

            ApplicationLogging.LoggerFactory = loggerFactory;

            context.Database.Migrate();

            var path = ElectronService.GetPath().GetAwaiter().GetResult();

            DSData.Init(path);
            NameService.Init(context, path).GetAwaiter().GetResult();

            app.UseResponseCompression();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
            WebPreferences wp = new WebPreferences();

            wp.NodeIntegration = false;

            Task.Run(async() => await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions()
            {
                AutoHideMenuBar = true,
                Width           = 1920,
                Height          = 1080,
                X = 0,
                Y = 0,
                WebPreferences = wp
            }));
        }
Exemple #9
0
        public static async Task <DsResponse> GetDpsFromTimeResults(sc2dsstatsContext context, DsRequest request)
        {
            var timestrings = DSData.Timestrings(request.Timespan);

            var results = context.DsTimeResults.AsNoTracking().Where(x => x.Player == request.Player && timestrings.Contains(x.Timespan));

            if (request.Interest == "ALL")
            {
                results = results.Where(x => x.Opp == String.Empty);
            }
            else
            {
                results = results.Where(x => x.Cmdr == request.Interest);
            }

            var dpsresults = await results.ToListAsync();

            int count = dpsresults.Sum(s => s.Count);

            var response = new DsResponse()
            {
                Interest    = request.Interest,
                Count       = request.Player ? count : count / 6,
                AvgDuration = (int)(dpsresults.Sum(s => s.Duration) / count),
                Items       = new List <DsResponseItem>()
            };

            foreach (var cmdr in DSData.cmdrs)
            {
                var cmdrresults = (request.Interest == "ALL") switch
                {
                    true => dpsresults.Where(x => x.Cmdr == cmdr).ToList(),
                    false => dpsresults.Where(x => x.Opp == cmdr).ToList(),
                };

                var army  = cmdrresults.Sum(s => s.Army);
                var kills = cmdrresults.Sum(s => s.Kills);
                var dpv   = army / kills;

                response.Items.Add(new DsResponseItem()
                {
                    Label = cmdr,
                    Count = (int)(dpv * 10000),
                    Wins  = 10000
                });
            }

            return(response);
        }
Exemple #10
0
        public static async Task <DsResponse> GetWinrateFromTimeResults(sc2dsstatsContext context, DsRequest request)
        {
            var timestrings = DSData.Timestrings(request.Timespan);

            var results = context.DsTimeResults.AsNoTracking().Where(x => x.Player == request.Player && timestrings.Contains(x.Timespan));

            if (request.Interest == "ALL")
            {
                results = results.Where(x => x.Opp == String.Empty);
            }
            else
            {
                results = results.Where(x => x.Cmdr == request.Interest);
            }

            var timeresults = await results.ToListAsync();

            int tcount   = timeresults.Sum(s => s.Count);
            var response = new DsResponse()
            {
                Interest    = request.Interest,
                Count       = timeresults.Sum(s => s.Count) / 6,
                AvgDuration = tcount == 0 ? 0 : (int)(timeresults.Sum(s => s.Duration) / tcount),
                Items       = new List <DsResponseItem>()
            };

            foreach (var cmdr in DSData.cmdrs)
            {
                var cmdrresults = (request.Interest == "ALL") switch
                {
                    true => timeresults.Where(x => x.Cmdr == cmdr).ToList(),
                    false => timeresults.Where(x => x.Opp == cmdr).ToList(),
                };
                int count = cmdrresults.Sum(s => s.Count);
                response.Items.Add(new DsResponseItem()
                {
                    Label = cmdr,
                    Count = count,
                    Wins  = cmdrresults.Sum(s => s.Wins)
                });
            }

            return(response);
        }
Exemple #11
0
    public async Task <DateTime?> Produce(string gzipbase64String, string nameHash)
    {
        try
        {
            var replays = JsonSerializer.Deserialize <List <DsReplayDto> >(await DSData.UnzipAsync(gzipbase64String)).OrderByDescending(o => o.GAMETIME);

            if (replays.Any())
            {
                var dsreplays = replays.Select(s => new Dsreplay(s)).ToList();
                dsreplays.SelectMany(s => s.Dsplayers).Where(x => x.Name == "player").ToList().ForEach(f => { f.Name = nameHash; f.isPlayer = true; });
                ReplayFilter.SetDefaultFilter(dsreplays);
                Produce(dsreplays);
                return(dsreplays.First().Gametime);
            }
        }
        catch (Exception ex)
        {
            logger.LogError($"failed producing data: {ex.Message}");
        }
        return(null);
    }
        public static async Task <DsResponse> GetSynergy(sc2dsstatsContext context, DsRequest request)
        {
            var replays = ReplayFilter.Filter(context, request);

            var synergy = request.Player
                          ? from r in replays
                          from p in r.Dsplayers
                          from t in r.Dsplayers
                          where p.isPlayer && p.Race == (byte)DSData.GetCommander(request.Interest) && t.Team == p.Team && t.Id != p.Id
                          group new { r, p } by t.Race into g
                select new DsResponseItem()
            {
                Label = ((DSData.Commander)g.Key).ToString(),
                Count = g.Count(),
                Wins  = g.Count(c => c.p.Win),
            }
                          : from r in replays
            from p in r.Dsplayers
            from t in r.Dsplayers
            where p.Race == (byte)DSData.GetCommander(request.Interest) && t.Team == p.Team && t.Id != p.Id
            group new { r, p } by t.Race into g
                select new DsResponseItem()
            {
                Label = ((DSData.Commander)g.Key).ToString(),
                Count = g.Count(),
                Wins  = g.Count(c => c.p.Win),
            };
            var items = await synergy.ToListAsync();

            items = items.Where(x => DSData.cmdrs.Contains(x.Label)).OrderBy(o => o.Label).ToList();

            return(new DsResponse()
            {
                Interest = request.Interest,
                Count = items.Sum(s => s.Count),
                Items = items
            });
        }
Exemple #13
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
         },
     });
        public static TimelineResponse GetTimeline(TimelineRequest request, List <CmdrStats> cmdrstats)
        {
            if (request.Step < 3)
            {
                request.Step = 3;
            }

            if (request.smaK < 3)
            {
                request.smaK = 3;
            }

            var stats = GetTimeStats(request, cmdrstats);

            int tcount = stats.Sum(s => s.count);
            TimelineResponse response = new TimelineResponse()
            {
                Interest    = request.Interest,
                Count       = request.Player ? tcount : tcount / 6,
                Versus      = request.Versus,
                AvgDuration = tcount == 0 ? 0 : (int)(stats.Sum(s => s.duration) / tcount),
                Items       = new List <DsResponseItem>()
            };

            DateTime requestTime = request.StartTime;

            while (requestTime < request.EndTime)
            {
                var timeResults = stats.Where(f => f.year == requestTime.Year && f.month == requestTime.Month && f.RACE == (byte)DSData.GetCommander(request.Interest));

                if (!timeResults.Any())
                {
                    response.Items.Add(new TimelineResponseItem()
                    {
                        Label = $"{requestTime.ToString("yyyy-MM")} (0)",
                        Count = 0,
                        Wins  = 0
                    });
                }
                else
                {
                    int ccount = timeResults.Sum(s => s.count);
                    response.Items.Add(new TimelineResponseItem()
                    {
                        Label = $"{requestTime.ToString("yyyy-MM")} ({ccount})",
                        Count = ccount,
                        Wins  = timeResults.Sum(s => s.wins)
                    });
                }
                requestTime = requestTime.AddMonths(1);
            }

            if (response.Items.Any() && response.Items.Last().Count < 10)
            {
                response.Items.RemoveAt(response.Items.Count - 1);
            }

            var sma = new SimpleMovingAverage(request.smaK);

            response.SmaData = new List <double>();
            response.SmaData = GetNiceLineData(response.Items.Select(s => s.Count == 0 ? 0 : ((double)s.Wins * 100.0 / (double)s.Count)), request.smaK);

            return(response);
        }
Exemple #15
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, sc2dsstatsContext context, ILogger <Startup> _logger, CacheService cacheService)
        {
            CultureInfo.DefaultThreadCurrentCulture   = CultureInfo.InvariantCulture;
            CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

            DSData.Init();

            context.Database.SetCommandTimeout(TimeSpan.FromMinutes(10));
            context.Database.Migrate();

            NameService.Init(context, "").GetAwaiter().GetResult();

            _ = cacheService.SetBuildCache();


            // StatsService.TeamStats(context);

            //var oldreps = oldcontext.DSReplays.Count();
            //_logger.LogInformation($"oldreps: {oldreps}");
            //var newreps = context.Dsreplays.Count();
            //_logger.LogInformation($"newreps: {newreps}");

            //DbService.FixGamemode(context, oldcontext);

            //cacheService.SetBuildCache();

            // OldContextsService.CopyRestPlayerData(context, restcontext);
            // OldContextsService.UpdateFromOldDb(context, oldcontext, insertService, fullCopy: true);

            string basePath = Environment.GetEnvironmentVariable("ASPNETCORE_BASEPATH");

            // string basePath = "/sc2dsstats";
            if (!string.IsNullOrEmpty(basePath))
            {
                app.Use((context, next) =>
                {
                    context.Request.Scheme = "https";
                    return(next());
                });

                app.Use((context, next) =>
                {
                    context.Request.PathBase = new PathString(basePath);
                    if (context.Request.Path.StartsWithSegments(basePath, out var remainder))
                    {
                        context.Request.Path = remainder;
                    }
                    return(next());
                });
            }
            else
            {
                basePath = String.Empty;
            }

            app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
            });

            app.UseResponseCompression();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseWebAssemblyDebugging();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseBlazorFrameworkFiles();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers();
                //endpoints.MapHub<PickBanHub>("/pickbanhub");
                //endpoints.MapHub<GdslHub>("/gdslhub");
                endpoints.MapHub <PbHub>("/pbhub");
                endpoints.MapFallbackToFile("index.html");
            });
        }
        public static async Task <TimelineResponse> GetDuration(sc2dsstatsContext context, DsRequest request)
        {
            var replays = ReplayFilter.Filter(context, request);

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

            var results = request.Player switch
            {
                true => from r in replays
                from p in r.Dsplayers
                where p.Race == (byte)DSData.GetCommander(request.Interest) && p.isPlayer
                select new
                {
                    r.Id,
                    r.Duration,
                    p.Win
                },
                false => from r in replays
                from p in r.Dsplayers
                where p.Race == (byte)DSData.GetCommander(request.Interest)
                select new
                {
                    r.Id,
                    r.Duration,
                    p.Win
                }
            };
            var lresults = await results.ToListAsync();

            TimelineResponse response = new TimelineResponse()
            {
                Interest    = request.Interest,
                Count       = lresults.Select(s => s.Id).Distinct().Count(),
                AvgDuration = lresults.Count == 0 ? 0 : (int)(lresults.Sum(s => s.Duration) / lresults.Count),
                Items       = new List <DsResponseItem>()
            };

            if (lresults.Any())
            {
                for (int i = 0; i < DSData.durations.Length; i++)
                {
                    int startd = 0;
                    if (i > 0)
                    {
                        Match m = d_rx.Match(DSData.durations[i]);
                        if (m.Success)
                        {
                            startd = int.Parse(m.Value);
                        }
                    }
                    int endd = startd + 3;
                    if (i == 0)
                    {
                        endd = 8;
                    }
                    if (i == DSData.durations.Length - 1)
                    {
                        endd = 200;
                    }
                    var ilresults = lresults.Where(x => x.Duration > startd * 60 && x.Duration < endd * 60).ToList();


                    response.Items.Add(new DsResponseItem()
                    {
                        Label = $"{DSData.durations[i]} min ({ilresults.Count})",
                        Count = ilresults.Count,
                        Wins  = ilresults.Where(x => x.Win == true).Count()
                    });
                }
            }
            var sma = new SimpleMovingAverage(4);

            response.SmaData = new List <double>();
            response.SmaData = TimelineService.GetNiceLineData(response.Items.Select(s => s.Count == 0 ? 0 : ((double)s.Wins * 100.0 / (double)s.Count)), 4);

            return(response);
        }
    }
        public static async Task <DsResponse> GetStandardTeamWinrate(DsRequest request, sc2dsstatsContext context)
        {
            var replays = context.Dsreplays
                          .Include(i => i.Dsplayers)
                          .AsNoTracking()
                          .Where(x =>
                                 x.Gamemode == (byte)DSData.Gamemode.Standard &&
                                 x.Gametime > request.StartTime &&
                                 x.Duration > 300 &&
                                 x.Maxleaver < 90 &&
                                 x.Playercount == 6
                                 );

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

            byte[] races = null;
            if (!String.IsNullOrEmpty(request.Interest) && request.Interest != "ALL")
            {
                string[] iSplit = Regex.Split(request.Interest, @"(?<!^)(?=[A-Z])");
                if (iSplit.Length == 3)
                {
                    races = iSplit.Select(s => (byte)DSData.GetCommander(s)).ToArray();
                }
            }

            List <DsResponseItem> teamResponses = new List <DsResponseItem>();

            for (int p1 = 1; p1 < 4; p1++)
            {
                for (int p2 = 1; p2 < 4; p2++)
                {
                    for (int p3 = 1; p3 < 4; p3++)
                    {
                        var team1Replays = races == null?
                                           replays.Where(x =>
                                                         (x.Dsplayers.Where(s => s.Realpos == 1 && s.Race == p1).Any() &&
                                                          x.Dsplayers.Where(s => s.Realpos == 2 && s.Race == p2).Any() &&
                                                          x.Dsplayers.Where(s => s.Realpos == 3 && s.Race == p3).Any())
                                                         )
                                               : replays.Where(x =>
                                                               (x.Dsplayers.Where(s => s.Realpos == 1 && s.Race == p1).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 2 && s.Race == p2).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 3 && s.Race == p3).Any())
                                                               &&
                                                               (x.Dsplayers.Where(s => s.Realpos == 4 && s.Race == races[0]).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 5 && s.Race == races[1]).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 6 && s.Race == races[2]).Any())
                                                               );

                        var team2Replays = races == null?
                                           replays.Where(x =>
                                                         (x.Dsplayers.Where(s => s.Realpos == 4 && s.Race == p1).Any() &&
                                                          x.Dsplayers.Where(s => s.Realpos == 5 && s.Race == p2).Any() &&
                                                          x.Dsplayers.Where(s => s.Realpos == 6 && s.Race == p3).Any())
                                                         )
                                               : replays.Where(x =>
                                                               (x.Dsplayers.Where(s => s.Realpos == 4 && s.Race == p1).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 5 && s.Race == p2).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 6 && s.Race == p3).Any())
                                                               &&
                                                               (x.Dsplayers.Where(s => s.Realpos == 1 && s.Race == races[0]).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 2 && s.Race == races[1]).Any() &&
                                                                x.Dsplayers.Where(s => s.Realpos == 3 && s.Race == races[2]).Any())
                                                               );

                        var team1Results = from r in team1Replays
                                           group r by r.Winner into g
                                           select new
                        {
                            Winner   = g.Key,
                            Count    = g.Count(),
                            duration = g.Sum(s => s.Duration),
                        };
                        var team2Results = from r in team2Replays
                                           group r by r.Winner into g
                                           select new
                        {
                            Winner   = g.Key,
                            Count    = g.Select(s => s.Id).Distinct().Count(),
                            duration = g.Sum(s => s.Duration),
                        };

                        var t1 = await team1Results.AsNoTracking().ToListAsync();

                        var t2 = await team2Results.AsNoTracking().ToListAsync();

                        int count = t1.Sum(s => s.Count) + t2.Sum(s => s.Count);
                        if (count > 0)
                        {
                            teamResponses.Add(new DsResponseItem()
                            {
                                Label    = ((DSData.Commander)p1).ToString() + ((DSData.Commander)p2).ToString() + ((DSData.Commander)p3).ToString(),
                                Count    = count,
                                Wins     = t1.Where(x => x.Winner == 0).Sum(s => s.Count) + t2.Where(x => x.Winner == 1).Sum(s => s.Count),
                                duration = t1.Sum(s => s.duration) + t2.Sum(s => s.duration),
                                Replays  = count,
                            });
                        }
                    }
                }
            }

            int tcount = teamResponses.Sum(s => s.Count);

            return(new DsResponse()
            {
                Interest = request.Interest,
                Count = tcount,
                AvgDuration = tcount == 0 ? 0 : (int)(teamResponses.Sum(s => s.duration) / tcount),
                Items = teamResponses
            });
        }
        public static async Task <DsResponse> GetStandardWinrate(DsRequest request, sc2dsstatsContext context)
        {
            var replays = context.Dsreplays.Where(x =>
                                                  x.Gamemode == (byte)DSData.Gamemode.Standard &&
                                                  x.Gametime > request.StartTime
                                                  ).AsNoTracking();

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


            var responses = (request.Player, request.Interest == "ALL") switch
            {
                (false, true) => from r in replays
                from p in r.Dsplayers
                group new { r, p } by new { race = p.Race } into g
                select new DsResponseItem()
                {
                    Label    = ((DSData.Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Win),
                    duration = g.Sum(s => s.r.Duration),
                    Replays  = g.Select(s => s.r.Id).Distinct().Count()
                },
                (false, false) => from r in replays
                from p in r.Dsplayers
                where p.Race == (byte)DSData.GetCommander(request.Interest)
                group new { r, p } by new { race = p.Opprace } into g
                select new DsResponseItem()
                {
                    Label    = ((DSData.Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Win),
                    duration = g.Sum(s => s.r.Duration),
                    Replays  = g.Select(s => s.r.Id).Distinct().Count()
                },
                (true, true) => from r in replays
                from p in r.Dsplayers
                where p.isPlayer
                group new { r, p } by new { race = p.Race } into g
                select new DsResponseItem()
                {
                    Label    = ((DSData.Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Win),
                    duration = g.Sum(s => s.r.Duration),
                    Replays  = g.Select(s => s.r.Id).Distinct().Count()
                },
                (true, false) => from r in replays
                from p in r.Dsplayers
                where p.isPlayer && p.Race == (byte)DSData.GetCommander(request.Interest)
                group new { r, p } by new { race = p.Opprace } into g
                select new DsResponseItem()
                {
                    Label    = ((DSData.Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Win),
                    duration = g.Sum(s => s.r.Duration),
                    Replays  = g.Select(s => s.r.Id).Distinct().Count()
                }
            };

            var items = await responses.ToListAsync();

            items = items.Where(x => DSData.cmdrs.Contains(x.Label)).ToList();

            int tcount = items.Sum(s => s.Count);

            return(new DsResponse()
            {
                Interest = request.Interest,
                Count = tcount / 6,
                AvgDuration = tcount == 0 ? 0 : (int)(items.Sum(s => s.duration) / tcount),
                Items = items
            });
        }
Exemple #19
0
        static void Main(string[] args)
        {
            var logger = ApplicationLogging.CreateLogger <Program>();

            logger.LogInformation("Running ...");

            var services = new ServiceCollection();

            var json             = JsonSerializer.Deserialize <JsonElement>(File.ReadAllText("/data/localserverconfig.json"));
            var config           = json.GetProperty("ServerConfig");
            var connectionString = config.GetProperty("WSLConnectionString2").GetString();
            var serverVersion    = new MySqlServerVersion(new System.Version(5, 0, 34));

            bool dbToggle = true;

            if (dbToggle)
            {
                logger.LogInformation("--------------------- MYSQL -------------------");
                services.AddDbContext <sc2dsstatsContext>(options =>
                {
                    options.UseLoggerFactory(ApplicationLogging.LogFactory);
                    options.UseMySql(connectionString, serverVersion, p =>
                    {
                        p.EnableRetryOnFailure();
                        p.MigrationsAssembly("sc2dsstats.2022.Server");
                        p.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery);
                    });
                });
            }
            else
            {
                logger.LogInformation("--------------------- SQLITE -------------------");
                services.AddDbContext <sc2dsstatsContext>(options =>
                {
                    options.UseLoggerFactory(ApplicationLogging.LogFactory);
                    options.UseSqlite(@"Data Source=C:\Users\pax77\AppData\Local\sc2dsstats_desktop\data_v4_1.db",
                                      x =>
                    {
                        x.MigrationsAssembly("sc2dsstats.app");
                        x.UseQuerySplittingBehavior(QuerySplittingBehavior.SingleQuery);
                    }
                                      )
                    .EnableSensitiveDataLogging()
                    .EnableDetailedErrors();
                });
            }



            var serviceProvider = services.BuildServiceProvider();
            var context         = serviceProvider.GetService <sc2dsstatsContext>();
            var users           = context.DSRestPlayers.Count();

            logger.LogInformation($"Rest user count: {users}");

            // PlayerService.GetPlayerStats(context, new List<string>() { "b33aef3fcc740b0d67eda3faa12c0f94cef5213fe70921d72fc2bfa8125a5889" }).GetAwaiter().GetResult();
            // context.Database.ExecuteSqlRaw("RESET QUERY CACHE");
            // context.Database.ExecuteSqlRaw("SET SESSION query_cache_type=0;");

            DSData.Init();
            NameService.Init(context, Assembly.GetExecutingAssembly().Location).GetAwaiter().GetResult();

            Stopwatch sw = new Stopwatch();

            sw.Start();

            logger.LogInformation($"replays: {context.Dsreplays.Count()}");

            var replays = context.Dsreplays
                          .Include(i => i.Dsplayers).ThenInclude(j => j.PlayerName)
                          .Where(x => x.DefaultFilter)
                          .OrderBy(o => o.Gametime)
                          .AsNoTracking()
                          // .Take(40000)
                          .ToList();

            //Dictionary<string, EloPlayer> eloPlayers = new Dictionary<string, EloPlayer>();
            //foreach (var replay in replays)
            //{
            //    HashSet<EloPlayer> team1 = new HashSet<EloPlayer>();
            //    HashSet<EloPlayer> team2 = new HashSet<EloPlayer>();
            //    foreach (var pl in replay.Dsplayers)
            //    {
            //        string name = pl.PlayerName == null ? pl.Name : pl.PlayerName.Name;
            //        if (name.StartsWith("player") || !eloPlayers.ContainsKey(name))
            //        {
            //            eloPlayers[name] = new EloPlayer()
            //            {
            //                Rating = 1500
            //            };
            //        }
            //        if (pl.Team == 0)
            //        {
            //            team1.Add(eloPlayers[name]);
            //        }
            //        else if (pl.Team == 1)
            //        {
            //            team2.Add(eloPlayers[name]);
            //        }
            //    }

            //    Result result = replay.Winner == 0 ? Result.Win : Result.Lose;

            //    EloGame eloGame = new EloGame(team1, team2, result);

            //    foreach (var eloPl in team1)
            //    {
            //        eloPl.Rating += eloGame.Team1Delta;
            //    }
            //    foreach (var eloPl in team2)
            //    {
            //        eloPl.Rating += eloGame.Team2Delta;
            //    }
            //}

            //foreach (var ent in eloPlayers.OrderBy(o => o.Value.Rating))
            //{
            //    Console.WriteLine($"{ent.Key} => {ent.Value.Rating} ({ent.Value.Games})");
            //}

            //var replays = context.Dsreplays
            //    .Include(i => i.Dsplayers)
            //    .AsNoTracking()
            //    .Where(x =>
            //        x.Gamemode == (byte)DSData.Gamemode.Standard
            //        && x.Gametime > new DateTime(2019, 1, 1)
            //        && x.Duration > 300
            //        && x.Maxleaver < 90
            //        && x.Playercount == 6
            //    );

            //string interest = "ZergZergZerg";
            //string[] iSplit = Regex.Split(interest, @"(?<!^)(?=[A-Z])");
            //byte[] races = iSplit.Select(s => (byte)DSData.GetCommander(s)).ToArray();

            // replays = replays.Where(x =>
            //              (x.Dsplayers.Where(s => s.Realpos == 1 && s.Race == races[0]).Any()
            //              && x.Dsplayers.Where(s => s.Realpos == 2 && s.Race == races[1]).Any()
            //              && x.Dsplayers.Where(s => s.Realpos == 3 && s.Race == races[2]).Any())
            //             ||
            //              (x.Dsplayers.Where(s => s.Realpos == 4 && s.Race == races[0]).Any()
            //              && x.Dsplayers.Where(s => s.Realpos == 5 && s.Race == races[1]).Any()
            //              && x.Dsplayers.Where(s => s.Realpos == 6 && s.Race == races[2]).Any())
            // );

            //List<DsResponseItem> teamResponses = new List<DsResponseItem>();
            //for (int p1 = 1; p1 < 4; p1++)
            //{
            //    for (int p2 = 1; p2 < 4; p2++)
            //    {
            //        for (int p3 = 1; p3 < 4; p3++)
            //        {
            //            var team1Replays = replays.Where(x =>
            //             (x.Dsplayers.Where(s => s.Realpos == 1 && s.Race == p1).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 2 && s.Race == p2).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 3 && s.Race == p3).Any())
            //             &&
            //            (x.Dsplayers.Where(s => s.Realpos == 4 && s.Race == races[0]).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 5 && s.Race == races[1]).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 6 && s.Race == races[2]).Any())
            //            );

            //            var team2Replays = replays.Where(x =>
            //             (x.Dsplayers.Where(s => s.Realpos == 4 && s.Race == p1).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 5 && s.Race == p2).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 6 && s.Race == p3).Any())
            //             &&
            //            (x.Dsplayers.Where(s => s.Realpos == 1 && s.Race == races[0]).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 2 && s.Race == races[1]).Any()
            //             && x.Dsplayers.Where(s => s.Realpos == 3 && s.Race == races[2]).Any())
            //            );

            //            var team1Results = from r in team1Replays
            //                               group r by r.Winner into g
            //                               select new
            //                               {
            //                                   Winner = g.Key,
            //                                   Count = g.Count(),
            //                                   duration = g.Sum(s => s.Duration),
            //                               };
            //            var team2Results = from r in team2Replays
            //                               group r by r.Winner into g
            //                               select new
            //                               {
            //                                   Winner = g.Key,
            //                                   Count = g.Select(s => s.Id).Distinct().Count(),
            //                                   duration = g.Sum(s => s.Duration),
            //                               };

            //            var t1 = team1Results.AsNoTracking().ToList();
            //            var t2 = team2Results.AsNoTracking().ToList();
            //            int count = t1.Sum(s => s.Count) + t2.Sum(s => s.Count);
            //            teamResponses.Add(new DsResponseItem()
            //            {
            //                Label = ((DSData.Commander)p1).ToString() + ((DSData.Commander)p2).ToString() + ((DSData.Commander)p3).ToString(),
            //                Count = count,
            //                Wins = t1.Where(x => x.Winner == 0).Sum(s => s.Count) + t2.Where(x => x.Winner == 1).Sum(s => s.Count),
            //                duration = t1.Sum(s => s.duration) + t2.Sum(s => s.duration),
            //                Replays = count,
            //            });

            //        }
            //    }
            //}


            //foreach (var teamResponse in teamResponses.OrderBy(o => o.Winrate))
            //{
            //    logger.LogInformation($"{teamResponse.Label} => {teamResponse.Winrate}% ({teamResponse.Count})");
            //}


            sw.Stop();
            Console.WriteLine($"Elapsed: {sw.ElapsedMilliseconds}ms");
            Console.ReadLine();
        }
Exemple #20
0
        public static async Task <bool> Upload(HttpClient Http, sc2dsstatsContext context, UserConfig config, ILogger logger)
        {
            logger.LogInformation($"Uplading replay(s) {DateTime.UtcNow}");
            if (!context.Dsreplays.Any())
            {
                return(true);
            }

            string id;

            using (SHA256 sha256Hash = SHA256.Create())
            {
                string names = String.Join(";", config.PlayersNames);
                id = GetHash(sha256Hash, names);
            }

            DsUploadRequest uploadRequest = new DsUploadRequest()
            {
                RealName = !String.IsNullOrEmpty(config.DisplayName) ? config.DisplayName : String.Empty,
                AppId    = config.AppId,
                Hash     = id,
                LastRep  = (await context.Dsreplays.OrderByDescending(o => o.Gametime).FirstAsync()).Gametime.ToString("yyyyMMddHHmmss"),
                Total    = await context.Dsreplays.CountAsync(),
                Version  = Program.Version.ToString()
            };

            DateTime lastUploadReplayGametime = DateTime.MinValue;

            try
            {
                var iresponse = await Http.PostAsJsonAsync("secure/data/uploadrequest", uploadRequest);

                if (iresponse.IsSuccessStatusCode)
                {
                    lastUploadReplayGametime = await iresponse.Content.ReadFromJsonAsync <DateTime>();
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception e)
            {
                logger.LogError($"failed getting upload request: {e.Message}");
                return(false);
            }

            var replays = await context.Dsreplays
                          .Include(i => i.Middles)
                          .Include(i => i.Dsplayers)
                          .ThenInclude(j => j.Breakpoints)
                          .AsNoTracking()
                          .AsSplitQuery()
                          .Where(x => x.Gametime > lastUploadReplayGametime)
                          .ToListAsync();

            if (!replays.Any())
            {
                return(true);
            }
            replays.SelectMany(s => s.Dsplayers).ToList().ForEach(f => f.Name = config.PlayersNames.Contains(f.Name) ? "player" : $"player{f.Realpos}");

            replays.ForEach(f => f.Replaypath = String.Empty);

            var json = System.Text.Json.JsonSerializer.Serialize(replays.Select(s => s.GetDto()).ToList());

            json = DSData.Zip(json);


            var response = await Http.PostAsJsonAsync($"secure/data/replayupload/{config.AppId}", json);

            if (response.IsSuccessStatusCode)
            {
                var uploadResponse = await response.Content.ReadFromJsonAsync <DsUploadResponse>();

                config.DbId = uploadResponse.DbId;
                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemple #21
0
        public static async Task <DsResponse> GetCustomMvp(DsRequest request, sc2dsstatsContext context)
        {
            var replays = ReplayFilter.Filter(context, request);

            var responses = (request.Player, request.Interest == "ALL") switch
            {
                (false, true) => from r in replays
                from p in r.Dsplayers
                group new { r, p } by new { race = p.Race } into g
                select new DsResponseItem()
                {
                    Label    = ((Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Killsum == c.r.Maxkillsum),
                    duration = g.Sum(s => s.r.Duration)
                },
                (false, false) => from r in replays
                from p in r.Dsplayers
                where p.Race == (byte)DSData.GetCommander(request.Interest)
                group new { r, p } by new { race = p.Opprace } into g
                select new DsResponseItem()
                {
                    Label    = ((Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Killsum == c.r.Maxkillsum),
                    duration = g.Sum(s => s.r.Duration)
                },
                (true, true) => from r in replays
                from p in r.Dsplayers
                where p.isPlayer
                group new { r, p } by new { race = p.Race } into g
                select new DsResponseItem()
                {
                    Label    = ((Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Killsum == c.r.Maxkillsum),
                    duration = g.Sum(s => s.r.Duration)
                },
                (true, false) => from r in replays
                from p in r.Dsplayers
                where p.isPlayer && p.Race == (byte)DSData.GetCommander(request.Interest)
                group new { r, p } by new { race = p.Opprace } into g
                select new DsResponseItem()
                {
                    Label    = ((Commander)g.Key.race).ToString(),
                    Count    = g.Count(),
                    Wins     = g.Count(c => c.p.Killsum == c.r.Maxkillsum),
                    duration = g.Sum(s => s.r.Duration)
                }
            };

            var items = await responses.ToListAsync();

            items = items.Where(x => DSData.cmdrs.Contains(x.Label)).ToList();

            int tcount = items.Sum(s => s.Count);

            return(new DsResponse()
            {
                Interest = request.Interest,
                Count = tcount / 6,
                AvgDuration = tcount == 0 ? 0 : (int)(items.Sum(s => s.duration) / tcount),
                Items = items
            });
        }