public async Task <string> GetLeaverInfo(string Timespan) { DsRequest request = new DsRequest() { Filter = new DsFilter() }; request.Filter.SetOff(); request.SetTime(Timespan); request.Filter.GameModes = new List <int>() { (int)DSData.Gamemode.Commanders, (int)DSData.Gamemode.CommandersHeroic }; var replays = ReplayFilter.Filter(context, request); var leaver = from r in replays group r by r.Maxleaver > 89 into g select new { Leaver = g.Key, Count = g.Count() }; var lleaver = await leaver.ToListAsync(); return(lleaver[0].Count == 0 ? "0" : (lleaver[1].Count / (double)lleaver[0].Count * 100).ToString("00.00")); }
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 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 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> 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 }); }