Ejemplo n.º 1
0
        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"));
        }
Ejemplo n.º 2
0
        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());
        }
Ejemplo n.º 3
0
        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
            });
        }
Ejemplo n.º 4
0
        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);
        }
    }
Ejemplo n.º 5
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
            });
        }