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()); }
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 }); }
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; }
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); }
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); }
// 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 })); }
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); }
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); }
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 }); }
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); }
// 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 }); }
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(); }
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); } }
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 }); }