Example #1
0
        public static int GetUnitId(sc2dsstatsContext context, string name)
        {
            var unit = UnitNames.FirstOrDefault(f => f.Name == name);

            if (unit == null)
            {
                if (context == null)
                {
                    return(-1);
                }
                else
                {
                    int id = !UnitNames.Any() ? 0 : UnitNames.Last().sId + 1;
                    unit = new UnitName()
                    {
                        sId  = id,
                        Name = name
                    };
                    UnitNames.Add(unit);
                    context.UnitNames.Add(unit);
                    var info = context.DsInfo.First(f => f.Id == 1);
                    var now  = DateTime.UtcNow;
                    info.UnitNamesUpdate = new DateTime(now.Year, now.Month, now.Day);
                }
            }
            return(unit.sId);
        }
Example #2
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());
        }
Example #3
0
        public static async Task GetInfo(sc2dsstatsContext context, string timespan)
        {
            DsRequest request = new DsRequest()
            {
                Filter = new DsFilter()
            };

            request.Filter.SetOff();
            request.SetTime(timespan);
            request.Filter.GameModes = new List <int>()
            {
                (int)Gamemode.Commanders, (int)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();

            int count1 = lleaver[0].Count;
            int count2 = lleaver[1].Count;
        }
Example #4
0
        public static async Task <DsPlayerName> GetPlayerName(sc2dsstatsContext context, DsUploadRequest request)
        {
            var playerName = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.AppId == request.AppId);

            if (playerName == null)
            {
                playerName = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.Hash == request.Hash);
            }
            if (playerName == null)
            {
                var restPlayer = await context.DSRestPlayers.FirstOrDefaultAsync(f => f.Name == request.Hash);

                playerName = new DsPlayerName()
                {
                    AppId        = request.AppId,
                    DbId         = Guid.NewGuid(),
                    Hash         = request.Hash,
                    Name         = String.Empty,
                    AppVersion   = request.Version,
                    LatestReplay = restPlayer == null ? new DateTime(2018, 1, 1) : restPlayer.LastRep
                };
                context.DsPlayerNames.Add(playerName);
            }
            // TODO DEBUG
            // else if (playerName.AppId == new Guid())
            // {
            playerName.AppId = request.AppId;
            // }
            playerName.TotlaReplays = request.Total;
            playerName.LatestUpload = DateTime.UtcNow;
            playerName.AppVersion   = request.Version;
            await context.SaveChangesAsync();

            return(playerName);
        }
Example #5
0
        public static async Task <DsResponse> GetMvp(sc2dsstatsContext context, DsRequest request)
        {
            var data = await GetMVPData(context, request);

            var response = new DsResponse()
            {
                Interest = request.Interest,
                Count    = data.Select(s => s.Id).Distinct().Count(),
                Items    = new List <DsResponseItem>()
            };

            response.AvgDuration = (int)((double)data.Sum(s => s.Duration) / (double)data.Count);

            foreach (var cmdr in Enum.GetValues <DSData.Commander>())
            {
                var cmdrreps = (request.Interest == "ALL") switch
                {
                    true => data.Where(x => x.Race == (byte)cmdr),
                    false => data.Where(x => x.OppRace == (byte)cmdr)
                };

                response.Items.Add(new DsResponseItem()
                {
                    Label = cmdr.ToString(),
                    Count = cmdrreps.Count(),
                    Wins  = cmdrreps.Where(x => x.MVP == true).Count()
                });
            }

            return(response);
        }
Example #6
0
    private async Task SetPlayerNames(Dsreplay replay, sc2dsstatsContext context)
    {
        foreach (var player in replay.Dsplayers.Where(x => x.isPlayer))
        {
            DsPlayerName playerName;
            if (player.Name.Length == 64)
            {
                playerName = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.Hash == player.Name);
            }
            else
            {
                playerName = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.AppId.ToString() == player.Name);
            }
            if (playerName == null)
            {
                continue;
            }
            player.Name       = playerName.DbId.ToString();
            player.PlayerName = playerName;
            if (!playerName.NamesMapped && playerName.AppId != Guid.Empty && !String.IsNullOrEmpty(playerName.Hash))
            {
                var mapReps = await context.Dsplayers.Where(x => x.Name == playerName.Hash).ToListAsync();

                foreach (var pl in mapReps)
                {
                    pl.Name       = playerName.DbId.ToString();
                    pl.PlayerName = playerName;
                }
                playerName.NamesMapped = true;
            }
        }
    }
Example #7
0
 public UploadController(sc2dsstatsContext context, ProducerService producerService, CacheService cacheService, ILogger <UploadController> logger)
 {
     this.context         = context;
     this.producerService = producerService;
     this.cacheService    = cacheService;
     this.logger          = logger;
 }
Example #8
0
        public static async Task <double> GetQuits(sc2dsstatsContext context, DsRequest request)
        {
            var replays = GetCountReplays(context, request);



            var quits = from r in replays
                        group r by r.Winner into g
                        select new
            {
                Winner = g.Key,
                Count  = g.Count()
            };
            var lquits = await quits.ToListAsync();

            if (lquits.Any())
            {
                double sum = (double)lquits.Sum(s => s.Count);
                if (sum > 0)
                {
                    return(Math.Round(lquits.Where(x => x.Winner == -1).Count() * 100 / sum, 2));
                }
                else
                {
                    return(0);
                }
            }
            else
            {
                return(0);
            }
        }
Example #9
0
    private async Task <bool> CheckDuplicate(Dsreplay replay, sc2dsstatsContext context)
    {
        var dbReplay = await context.Dsreplays
                       .Include(i => i.Dsplayers)
                       .FirstOrDefaultAsync(f => f.Hash == replay.Hash);

        if (dbReplay == null)
        {
            return(false);
        }

        foreach (var incPlayer in replay.Dsplayers.Where(x => x.isPlayer))
        {
            var exPlayer = dbReplay.Dsplayers.FirstOrDefault(f => f.Realpos == incPlayer.Realpos);
            if (exPlayer != null && exPlayer.PlayerName == null)
            {
                exPlayer.PlayerName = incPlayer.PlayerName;
                exPlayer.Name       = incPlayer.PlayerName.DbId.ToString();
            }
        }

        if (new Version(dbReplay.Version) <= new Version(4, 0) &&
            new Version(replay.Version) > new Version(4, 0))
        {
            dbReplay.Bunker = replay.Bunker;
            dbReplay.Cannon = replay.Cannon;
            dbReplay.Mid1   = replay.Mid1;
            dbReplay.Mid2   = replay.Mid2;
        }

        return(true);
    }
Example #10
0
        public static void CopyRestPlayerData(sc2dsstatsContext context, DSRestContext restContext)
        {
            var restPlayers = restContext.DSRestPlayers.AsNoTracking().ToList();

            foreach (var restPlayer in restPlayers)
            {
                var newPlayer = context.DSRestPlayers.FirstOrDefault(f => f.Name == restPlayer.Name);

                if (newPlayer == null)
                {
                    newPlayer = new db.DSRestPlayer()
                    {
                        Name       = restPlayer.Name,
                        Json       = restPlayer.Json,
                        LastRep    = restPlayer.LastRep,
                        LastUpload = restPlayer.LastUpload,
                        Data       = restPlayer.Data,
                        Total      = restPlayer.Total,
                        Version    = restPlayer.Version
                    };
                    context.DSRestPlayers.Add(newPlayer);
                }
                else
                {
                    if (newPlayer.LastRep < restPlayer.LastRep)
                    {
                        newPlayer.LastRep = restPlayer.LastRep;
                    }
                }
            }
            context.SaveChanges();
        }
Example #11
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);
        }
Example #12
0
 public StatsController(sc2dsstatsContext context, IMemoryCache memoryCache, CacheService cacheService, ILogger <StatsController> logger)
 {
     this.context      = context;
     this.memoryCache  = memoryCache;
     this.cacheService = cacheService;
     this.logger       = logger;
 }
Example #13
0
        public static string ConvertUpgradeString(sc2dsstatsContext context, string upgradeString)
        {
            StringBuilder sb = new StringBuilder();

            if (!String.IsNullOrEmpty(upgradeString))
            {
                var ups = upgradeString.Split("|");
                for (int i = 0; i < ups.Length; i++)
                {
                    int id;
                    if (int.TryParse(ups[i], out id))
                    {
                        var jsonUpgrade = DSData.Upgrades.FirstOrDefault(f => f.ID == id);
                        if (jsonUpgrade != null)
                        {
                            id = GetUpgradeId(context, jsonUpgrade.Name);
                        }
                    }
                    else
                    {
                        id = GetUpgradeId(context, ups[i]);
                    }
                    sb.Append($"{id}|");
                }
                if (sb.Length > 0)
                {
                    sb.Remove(sb.Length - 1, 1);
                }
            }

            return(sb.Length == 0 ? null : sb.ToString());
        }
Example #14
0
 public static async Task GetTeammateStats(sc2dsstatsContext context)
 {
     //select p.name, p.Team, count(*) as c from DSReplays as r
     //inner join DSPlayers as p on p.DSReplayID = r.ID
     //where 0 = (select t.Team from DSPlayers as t where t.DSReplayID = r.ID and t.name = 'PAX')
     //group by p.name, p.Team
     //order by c desc
 }
Example #15
0
 public DataService(sc2dsstatsContext context, IMemoryCache memoryCache, IHttpClientFactory clientFactory, IServiceScopeFactory scopeFactory, ILogger <DataService> logger)
 {
     this.context       = context;
     this.memoryCache   = memoryCache;
     this.clientFactory = clientFactory;
     this.scopeFactory  = scopeFactory;
     this.logger        = logger;
 }
Example #16
0
        public static (string, string) ConvertUnitStrings(sc2dsstatsContext context, string dsUnitsString, string dbUnitsString)
        {
            StringBuilder newdsUnitsString = new StringBuilder();
            StringBuilder newdbUnitsString = new StringBuilder();

            if (!String.IsNullOrEmpty(dsUnitsString))
            {
                var units = dsUnitsString.Split("|");
                for (int i = 0; i < units.Length; i++)
                {
                    var unitcounts = units[i].Split(",");
                    int id;
                    if (int.TryParse(unitcounts[0], out id))
                    {
                        var jsonUnit = DSData.Units.FirstOrDefault(f => f.ID == id);
                        if (jsonUnit != null)
                        {
                            id = GetUnitId(context, jsonUnit.Name);
                        }
                    }
                    else
                    {
                        id = GetUnitId(context, unitcounts[0]);
                    }
                    newdsUnitsString.Append($"{id},{unitcounts[1]}|");
                }
                newdsUnitsString.Remove(newdsUnitsString.Length - 1, 1);
            }

            if (!String.IsNullOrEmpty(dbUnitsString))
            {
                var pos = dbUnitsString.Split("|");
                for (int i = 0; i < pos.Length; i++)
                {
                    var unitpos = pos[i].Split(",");
                    int id;
                    if (int.TryParse(unitpos[0], out id))
                    {
                        var jsonUnit = DSData.Units.FirstOrDefault(f => f.ID == id);
                        if (jsonUnit != null)
                        {
                            id = GetUnitId(context, jsonUnit.Name);
                        }
                    }
                    else
                    {
                        id = GetUnitId(context, unitpos[0]);
                    }
                    newdbUnitsString.Append($"{id},{unitpos[1]},{unitpos[2]}|");
                }
                if (newdbUnitsString.Length > 0)
                {
                    newdbUnitsString.Remove(newdbUnitsString.Length - 1, 1);
                }
            }
            return(newdsUnitsString.Length == 0 ? null : newdsUnitsString.ToString(), newdbUnitsString.Length == 0 ? null : newdbUnitsString.ToString());
        }
Example #17
0
 public static IQueryable <Dsreplay> DefaultFilter(sc2dsstatsContext context)
 {
     return(context.Dsreplays
            .Include(p => p.Dsplayers)
            .AsNoTracking()
            .Where(x =>
                   x.DefaultFilter == true
                   ));
 }
Example #18
0
    public static bool CreateJson(sc2dsstatsContext context, localContext?localContext)
    {
        try
        {
            var names = context.UnitNames.Select(s => new NameResponse()
            {
                sId  = s.sId,
                Name = s.Name
            }).ToList();
            var upgrades = context.UpgradeNames.Select(s => new NameResponse()
            {
                sId  = s.sId,
                Name = s.Name
            });

            var unitfile    = "../sc2dsstats.app/json/unitnames.json";
            var upgradefile = "../sc2dsstats.app/json/upgradenames.json";

            File.WriteAllText(unitfile, JsonSerializer.Serialize(names));
            File.WriteAllText(upgradefile, JsonSerializer.Serialize(upgrades));

            if (localContext != null)
            {
                localContext.Database.ExecuteSqlRaw("TRUNCATE TABLE unitnames");
                localContext.UnitNames.AddRange(names.Select(s => new UnitName()
                {
                    sId  = s.sId,
                    Name = s.Name
                }));
                localContext.SaveChanges();

                localContext.Database.ExecuteSqlRaw("TRUNCATE TABLE upgradenames");
                localContext.UpgradeNames.AddRange(upgrades.Select(s => new UpgradeName()
                {
                    sId  = s.sId,
                    Name = s.Name
                }));
                localContext.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            Program.logger?.LogError($"failed creating name jsons: {ex.Message}");
            return(false);
        }

        var      info = context.DsInfo.First(f => f.Id == 1);
        DateTime now  = DateTime.UtcNow;

        info.UnitNamesUpdate    = new DateTime(now.Year, now.Month, now.Day);
        info.UpgradeNamesUpdate = new DateTime(now.Year, now.Month, now.Day);
        context.SaveChanges();
        Program.logger?.LogInformation("Successfully created name jsons with DsInfo update");
        return(true);
    }
Example #19
0
        public static async Task <List <DsRankingResponse> > GetRanking(sc2dsstatsContext context)
        {
            var replays = ReplayFilter.DefaultFilter(context);

            replays = replays.Where(x => x.Gametime >= new DateTime(2018, 1, 1));
            var players = await GetDatasets(context);

            List <DsRankingResponse> rankings = new List <DsRankingResponse>();

            foreach (var ent in players)
            {
                var plReplays = from r in replays
                                from p in r.Dsplayers
                                where p.Name == ent.Key
                                select new RankingHelper()
                {
                    Id            = r.Id,
                    Gametime      = r.Gametime,
                    MVP           = r.Maxkillsum == p.Killsum,
                    WIN           = p.Win,
                    Commander     = ((DSData.Commander)p.Race).ToString(),
                    WithTeammates = r.Dsplayers.Where(x => x.Team == p.Team && x != p && x.isPlayer).Any()
                };
                var plData = await plReplays.AsSplitQuery().ToListAsync();

                if (plData.Count < 20)
                {
                    continue;
                }

                int    maincount = 0;
                string main      = "";
                foreach (var cmdr in DSData.cmdrs)
                {
                    int c = plData.Where(x => x.Commander == cmdr).Count();
                    if (c > maincount)
                    {
                        maincount = c;
                        main      = cmdr;
                    }
                }

                rankings.Add(new DsRankingResponse()
                {
                    Playername    = !String.IsNullOrEmpty(ent.Value) ? ent.Value : ent.Key,
                    Games         = plData.Count,
                    Wins          = plData.Where(x => x.WIN).Count(),
                    MVPs          = plData.Where(x => x.MVP).Count(),
                    MainCommander = main,
                    GamesMain     = maincount,
                    Teamgames     = plData.Where(x => x.WithTeammates).Count()
                });
            }
            return(rankings);
        }
Example #20
0
 public static IQueryable <Dsreplay> Filter(sc2dsstatsContext context, DsReplayRequest request)
 {
     if (request.Filter == null || request.Filter.isDefault)
     {
         return(DefaultFilter(context));
     }
     else
     {
         return(GetFilteredReplays(context, request.Filter, DateTime.MinValue, DateTime.Today));
     }
 }
Example #21
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);
        }
Example #22
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);
        }
        public static async Task <TimelineResponse> GetCustomTimeline(sc2dsstatsContext context, TimelineRequest request)
        {
            if (request.Step < 3)
            {
                request.Step = 3;
            }

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

            var lresults = await GetTimelineData(request, context);

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

            DateTime _dateTime = request.StartTime;

            while (_dateTime < request.EndTime)
            {
                DateTime dateTime    = _dateTime.AddMonths(1);
                var      stepResults = lresults.Where(x => x.GameTime >= _dateTime && x.GameTime < dateTime).ToList();

                response.Items.Add(new TimelineResponseItem()
                {
                    Label = $"{_dateTime.ToString("yyyy-MM-dd")} ({stepResults.Count})",
                    Count = stepResults.Count,
                    Wins  = stepResults.Where(x => x.Win == true).Count()
                });
                _dateTime = dateTime;
            }

            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);
        }
Example #24
0
        public static async Task <List <DsReplayResponse> > GetReplays(sc2dsstatsContext context, DsReplayRequest request, CancellationToken cancellationToken)
        {
            var replays = GetQueriableReplays(context, request);

            if (request.sortOrders != null && request.sortOrders.Any())
            {
                foreach (var sortOrder in request.sortOrders)
                {
                    if (sortOrder.Order)
                    {
                        replays = replays.AppendOrderBy(sortOrder.Sort);
                    }
                    else
                    {
                        replays = replays.AppendOrderByDescending(sortOrder.Sort);
                    }
                }
            }
            else
            {
                replays = replays.OrderByDescending(o => o.Gametime);
            }

            replays = replays.Skip(request.Skip).Take(request.Take);

            List <DsReplayResponse> replayResponses = new List <DsReplayResponse>();

            if (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    replayResponses = await replays.Select(s => new DsReplayResponse()
                    {
                        Id            = s.Id,
                        Hash          = s.Hash,
                        Races         = s.Dsplayers.OrderBy(o => o.Realpos).Select(r => ((Commander)r.Race).ToString()).ToList(),
                        Players       = s.Dsplayers.OrderBy(o => o.Realpos).Select(r => r.Name).ToList(),
                        Gametime      = s.Gametime,
                        Duration      = s.Duration,
                        PlayerCount   = s.Playercount,
                        GameMode      = ((Gamemode)s.Gamemode).ToString(),
                        MaxLeaver     = s.Maxleaver,
                        MaxKillsum    = s.Maxkillsum,
                        Winner        = s.Winner,
                        DefaultFilter = s.DefaultFilter
                    }).ToListAsync(cancellationToken);
                }
                catch (TaskCanceledException)
                {
                    return(replayResponses);
                }
            }
Example #25
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
            }));
        }
Example #26
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);
        }
Example #27
0
    public static async Task <PlayerNameStatsResponse?> GetPlayerStats(sc2dsstatsContext context, string name, CancellationToken token)
    {
        if (token.IsCancellationRequested)
        {
            return(null);
        }
        var player = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.Name == name, token);

        var appplayer = await context.DsPlayerNames.FirstOrDefaultAsync(f => f.AppId != Guid.Empty, token);


        var plrepsTeam = from r in context.Dsreplays
                         from p in r.Dsplayers
                         from a in r.Dsplayers
                         where a.PlayerName == player
                         where p.PlayerName == appplayer
                         where a.Team == p.Team
                         group a by a.Win into g
                         select new
        {
            Win   = g.Key,
            Games = g.Count(),
        };
        var plrepsOpp = from r in context.Dsreplays
                        from p in r.Dsplayers
                        from a in r.Dsplayers
                        where a.PlayerName == player
                        where p.PlayerName == appplayer
                        where a.Team != p.Team
                        group a by a.Win into g
                        select new
        {
            Win   = g.Key,
            Games = g.Count(),
        };

        var teamStats = await plrepsTeam.AsNoTracking().ToListAsync(token);

        var oppStats = await plrepsOpp.AsNoTracking().ToListAsync(token);

        return(new PlayerNameStatsResponse()
        {
            TeamGames = teamStats.Sum(s => s.Games),
            TeamWins = teamStats.Where(x => x.Win).Sum(s => s.Games),
            OppGames = oppStats.Sum(s => s.Games),
            OppWins = oppStats.Where(x => x.Win).Sum(s => s.Games)
        });
    }
Example #28
0
        public static IQueryable <Dsreplay> Filter(sc2dsstatsContext context, DsRequest request)
        {
            if (request.Filter == null || request.Filter.isDefault)
            {
                var dreplays = DefaultFilter(context);
                dreplays = dreplays.Where(x => x.Gametime >= request.StartTime);
                if (request.EndTime != DateTime.Today)
                {
                    dreplays = dreplays.Where(x => x.Gametime <= request.EndTime);
                }

                return(dreplays);
            }

            return(GetFilteredReplays(context, request.Filter, request.StartTime, request.EndTime));
        }
Example #29
0
        private static async Task <List <DbStatsResult> > GetData(DsRequest request, sc2dsstatsContext context)
        {
            var replays = ReplayFilter.DefaultFilter(context);

            var reps = request.Player switch
            {
                false => from r in replays
                from p in r.Dsplayers
                where r.Gametime >= request.StartTime && r.Gametime <= request.EndTime
                select new DbStatsResult()
                {
                    Id       = r.Id,
                    Win      = p.Win,
                    Race     = p.Race,
                    OppRace  = p.Opprace,
                    GameTime = r.Gametime
                },
                true => from r in replays
                from p in r.Dsplayers
                where r.Gametime >= request.StartTime && r.Gametime <= request.EndTime &&
                p.isPlayer
                select new DbStatsResult()
                {
                    Id       = r.Id,
                    Win      = p.Win,
                    Race     = p.Race,
                    OppRace  = p.Opprace,
                    GameTime = r.Gametime
                }
            };

            return(await reps.ToListAsync());

            //var dbresults = context.DbStatsResults
            // .AsNoTracking()
            // .Where(x =>
            //       x.GameTime >= request.StartTime
            //    && x.GameTime <= request.EndTime
            //);

            //if (request.Player)
            //{
            //    dbresults = dbresults.Where(x => x.Player == true);
            //}

            // return await dbresults.ToListAsync();
        }
Example #30
0
    public static async Task <List <PlayerNameResponse> > GetPlayers(sc2dsstatsContext context)
    {
        var request = from r in context.Dsreplays
                      from p in r.Dsplayers
                      group p by p.Name into g
                      select new PlayerNameResponse()
        {
            Name  = g.Key,
            Games = g.Count(),
            Wins  = g.Count(c => c.Win)
        };

        return(await request
               .AsNoTracking()
               .OrderByDescending(o => o.Games)
               .ToListAsync());
    }