예제 #1
0
 public static string BestPlayers(int count)
 {
     try
     {
         using (var db = new ContextDB(nameDB))
         {
             var scoreboards = db.Scoreboards.GroupBy(sc => sc.Name.ToLower())
                               .Select(g => new
             {
                 name     = g.Key,
                 allKills = db.Scoreboards.Where(sc => sc.Name.ToLower() == g.Key)
                            .Sum(sc => sc.Kills),
                 allDeaths = db.Scoreboards.Where(sc => sc.Name.ToLower() == g.Key)
                             .Sum(sc => sc.Deaths),
                 count = g.Count()
             }).Where(pl => pl.allDeaths != 0 && pl.count >= 10)
                               .Select(pl => new BestPlayer
             {
                 name             = pl.name,
                 killToDeathRatio = (double)pl.allKills / pl.allDeaths
             })
                               .OrderByDescending(g => g.killToDeathRatio).Take(count);
             return(JsonConvert.SerializeObject(scoreboards, Formatting.Indented));
         }
     }
     catch
     {
         return(string.Empty);
     }
 }
예제 #2
0
        public static string PopularServers(int count)
        {
            try
            {
                using (var db = new ContextDB(nameDB))
                {
                    DateTime MaxDayOnStatServer = db.Matches.Max(m => DbFunctions.TruncateTime(m.Timestamp).Value);
                    var      popularServerList  = db.Servers.Include(s => s.Matches).Select(s => new
                    {
                        endpoint     = s.Endpoint,
                        name         = s.Name,
                        matchesCount = s.Matches.Count(),
                        firstDay     = db.Matches.Where(m => s.Id == m.ServerId).Min(m => DbFunctions.TruncateTime(m.Timestamp).Value)
                    }).ToList();

                    var popularServers = popularServerList.Select(ps => new PopularServer
                    {
                        endpoint             = ps.endpoint,
                        name                 = ps.name,
                        averageMatchesPerDay = (double)ps.matchesCount / ((MaxDayOnStatServer - ps.firstDay).Days + 1)
                    })
                                         .OrderByDescending(s => s.averageMatchesPerDay).Take(count);

                    return(JsonConvert.SerializeObject(popularServers, Formatting.Indented));
                }
            }
            catch
            {
                return(string.Empty);
            }
        }
예제 #3
0
 public static string GetMatchInfo(string endpoint, string timestamp)
 {
     try
     {
         using (var db = new ContextDB(nameDB))
         {
             var matchInfo = db.Servers.Include(s => s.Matches)
                             .First(s => s.Endpoint == endpoint)
                             .Matches.Where(m => m.Timestamp == DateTime.Parse(timestamp))
                             .Select(m => new
             {
                 map         = m.Map,
                 gameMode    = m.GameMode,
                 fragLimit   = m.FragLimit,
                 timeLimit   = m.TimeLimit,
                 timeElapsed = m.TimeElapsed,
                 scoreboard  = db.Scoreboards.Where(sb => sb.MatchId == m.Id).Select(sb => new
                 {
                     name   = sb.Name,
                     frags  = sb.Frags,
                     kills  = sb.Kills,
                     deaths = sb.Deaths
                 })
             }).First();
             return(JsonConvert.SerializeObject(matchInfo, Formatting.Indented));
         }
     }
     catch
     {
         return(string.Empty);
     }
 }
예제 #4
0
        public static string GetPlayerStats(string name)
        {
            PlayerStats playerStats = new PlayerStats();

            using (var db = new ContextDB(nameDB))
            {
                name = name.ToLower();
                try
                {
                    var scoreboards = db.Scoreboards.Where(sc => sc.Name.ToLower() == name)
                                      .Include(sc => sc.Match);
                    var matches = scoreboards.Select(scr => scr.Match);

                    DateTime MaxDayOnStatServer   = db.Matches.Max(m => DbFunctions.TruncateTime(m.Timestamp).Value);
                    DateTime MinDayPlayerPlay     = scoreboards.Min(sc => DbFunctions.TruncateTime(sc.Match.Timestamp).Value);
                    int      countDayOnStatServer = (MaxDayOnStatServer - MinDayPlayerPlay).Days + 1;

                    playerStats.totalMatchesPlayed = scoreboards.Count();
                    playerStats.totalMatchesWon    = scoreboards.Where(sc => sc.Name.ToLower() == name && sc.PlaceInMatch == 1).Count();

                    var servers = matches.GroupBy(m => m.Server.Endpoint)
                                  .Select(g => new { server = g.Key, count = g.Count() })
                                  .OrderByDescending(g => g.count);
                    playerStats.favoriteServer   = servers.First().server;
                    playerStats.uniqueServers    = servers.Count();
                    playerStats.favoriteGameMode = matches.GroupBy(m => m.GameMode)
                                                   .Select(g => new { gameMode = g.Key, count = g.Count() })
                                                   .OrderByDescending(g => g.count).First().gameMode;

                    var playersResult = scoreboards.Select(sc => new
                    {
                        place        = sc.PlaceInMatch,
                        countPlayers = sc.Match.Scoreboards.Count
                    }).ToList();

                    playerStats.averageScoreboardPercent = playersResult.Select(pl => new {
                        percentScoreboard = (pl.countPlayers != 1) ?
                                            ((pl.countPlayers - pl.place) / ((double)pl.countPlayers - 1)) * 100 : 100
                    })
                                                           .Average(x => x.percentScoreboard);
                    var MatchesPerDay = matches
                                        .Select(m => new { day = DbFunctions.TruncateTime(m.Timestamp) })
                                        .GroupBy(g => g.day)
                                        .Select(g => new { Date = g.Key, Count = g.Count() });
                    playerStats.maximumMatchesPerDay = MatchesPerDay.Max(m => m.Count);
                    playerStats.averageMatchesPerDay = (double)playerStats.totalMatchesPlayed / countDayOnStatServer;
                    DateTime lastMatch = matches.Max(m => m.Timestamp);
                    playerStats.lastMatchPlayed = lastMatch.ToString("yyyy-MM-ddTHH:mm:ssZ");
                    int totalKills  = scoreboards.Sum(sc => sc.Kills);
                    int totalDeaths = scoreboards.Sum(sc => sc.Deaths);
                    playerStats.killToDeathRatio = (double)totalKills / totalDeaths;
                }
                catch
                {
                    return(string.Empty);
                }
            }
            return(JsonConvert.SerializeObject(playerStats, Formatting.Indented));
        }
예제 #5
0
        public static string GetServerStats(string endpoint)
        {
            ServerStats serverStats = new ServerStats();

            using (var db = new ContextDB(nameDB))
            {
                var server = db.Servers.FirstOrDefault(s => s.Endpoint == endpoint);
                if (server == null)
                {
                    return(string.Empty);
                }
                try
                {
                    var matches = db.Matches.Include(m => m.Scoreboards).Where(m => m.ServerId == server.Id);
                    if (matches.Count() == 0)
                    {
                        return(JsonConvert.SerializeObject(serverStats, Formatting.Indented));
                    }

                    var MatchesPerDay = matches
                                        .Select(m => new { day = DbFunctions.TruncateTime(m.Timestamp) })
                                        .GroupBy(g => g.day)
                                        .Select(g => new { Date = g.Key, Count = g.Count() });

                    serverStats.totalMatchesPlayed   = matches.Count();
                    serverStats.maximumMatchesPerDay = MatchesPerDay.Max(m => m.Count);

                    DateTime MaxDayOnStatServer   = db.Matches.Max(m => DbFunctions.TruncateTime(m.Timestamp).Value);
                    DateTime MinDayOnServer       = matches.Min(m => DbFunctions.TruncateTime(m.Timestamp).Value);
                    int      countDayOnStatServer = (MaxDayOnStatServer - MinDayOnServer).Days + 1;
                    serverStats.averageMatchesPerDay = (double)serverStats.totalMatchesPlayed / countDayOnStatServer;

                    serverStats.maximumPopulation = matches.Select(m => m.Scoreboards.Count()).ToList().Max();
                    serverStats.averagePopulation = matches.Select(m => m.Scoreboards.Count()).ToList().Sum() / (double)matches.Count();
                    serverStats.top5GameModes     = matches.GroupBy(m => m.GameMode)
                                                    .Select(m => new { gameMode = m.Key, count = m.Count() })
                                                    .OrderByDescending(g => g.count).Take(5)
                                                    .Select(g => g.gameMode).ToList();
                    serverStats.top5Maps = matches.GroupBy(m => m.Map)
                                           .Select(g => new { map = g.Key, count = g.Count() })
                                           .OrderByDescending(g => g.count).Take(5)
                                           .Select(g => g.map).ToList();
                }
                catch
                {
                    return(string.Empty);
                }
            }
            return(JsonConvert.SerializeObject(serverStats, Formatting.Indented));
        }
예제 #6
0
        public static int PutServerInfo(string endpoint, string requestBody)
        {
            int        statusCode;
            ServerInfo requestObject = JsonConvert.DeserializeObject <ServerInfo>(requestBody);

            try
            {
                using (var db = new ContextDB(nameDB))
                {
                    Server server = db.Servers.FirstOrDefault(s => s.Endpoint == endpoint);
                    if (server == null)
                    {
                        server = new Server {
                            Endpoint = endpoint, Name = requestObject.name
                        };
                        db.Servers.Add(server);
                        foreach (var gm in requestObject.gameModes)
                        {
                            db.GameModes.Add(new GameMode
                            {
                                Server = server, Name = gm
                            });
                        }
                    }
                    else
                    {
                        server.Name = requestObject.name;
                        var removedGameModes = db.GameModes.Where(gm => gm.ServerId == server.Id);
                        db.GameModes.RemoveRange(removedGameModes);
                        foreach (var gm in requestObject.gameModes)
                        {
                            db.GameModes.Add(new GameMode
                            {
                                Server = server, Name = gm
                            });
                        }
                    }
                    db.SaveChanges();
                }
                statusCode = 200;
            }
            catch
            {
                statusCode = 400;
            }
            return(statusCode);
        }
예제 #7
0
        public static string RecentMatches(int count)
        {
            try
            {
                using (var db = new ContextDB(nameDB))
                {
                    var matches = db.Matches.OrderByDescending(m => m.Timestamp).Take(count)
                                  .Select(m => new
                    {
                        server    = m.Server.Endpoint,
                        timestamp = m.Timestamp,
                        results   = new MatchInfo
                        {
                            map         = m.Map,
                            gameMode    = m.GameMode,
                            fragLimit   = m.FragLimit,
                            timeLimit   = m.TimeLimit,
                            timeElapsed = m.TimeElapsed,
                            scoreboard  = m.Scoreboards.Select(sc => new Scboard
                            {
                                name   = sc.Name,
                                frags  = sc.Frags,
                                kills  = sc.Kills,
                                deaths = sc.Deaths
                            }).ToList()
                        }
                    }).ToList();
                    var recentMatches = matches
                                        .Select(m => new RecentMatch
                    {
                        server    = m.server,
                        timestamp = m.timestamp.ToString("yyyy-MM-ddTHH:mm:ssZ"),
                        results   = m.results
                    });

                    return(JsonConvert.SerializeObject(recentMatches, Formatting.Indented));
                }
            }
            catch
            {
                return(string.Empty);
            }
        }
예제 #8
0
 public static string GetServerInfo(string endpoint)
 {
     try
     {
         using (var db = new ContextDB(nameDB))
         {
             var serverInfo = db.Servers.Where(s => s.Endpoint == endpoint).Select(s => new
             {
                 name      = s.Name,
                 gameModes = db.GameModes.Where(gm => gm.ServerId == s.Id).Select(x => x.Name).ToList()
             }).First();
             return(JsonConvert.SerializeObject(serverInfo, Formatting.Indented));
         }
     }
     catch
     {
         return(string.Empty);
     }
 }
예제 #9
0
 public static string GetAllServersInfo()
 {
     try
     {
         using (var db = new ContextDB(nameDB))
         {
             var serverInfo = db.Servers.Select(s => new
             {
                 endpoint = s.Endpoint,
                 info     = new
                 {
                     name      = s.Name,
                     gameModes = db.GameModes.Where(gm => gm.ServerId == s.Id).Select(x => x.Name).ToList()
                 }
             });
             var json = JsonConvert.SerializeObject(serverInfo, Formatting.Indented);
             return(json);
         }
     }
     catch
     {
         return(string.Empty);
     }
 }
예제 #10
0
        public static int PutMatchInfo(string endpoint, string matchTimestamp, string requestBody)
        {
            int       statusCode;
            MatchInfo requestObject = JsonConvert.DeserializeObject <MatchInfo>(requestBody);

            try
            {
                using (var db = new ContextDB(nameDB))
                {
                    Server server = db.Servers.Include(s => s.Matches).FirstOrDefault(s => s.Endpoint == endpoint);
                    if (server == null)
                    {
                        return(400);
                    }
                    DateTime timestamp = DateTime.Parse(matchTimestamp);
                    Match    match     = server.Matches.FirstOrDefault(m => m.Timestamp == timestamp);
                    if (match == null)
                    {
                        match = new Match
                        {
                            Timestamp   = timestamp,
                            Map         = requestObject.map,
                            GameMode    = requestObject.gameMode,
                            FragLimit   = requestObject.fragLimit,
                            TimeLimit   = requestObject.timeLimit,
                            TimeElapsed = requestObject.timeElapsed,
                            Server      = server
                        };
                        db.Matches.Add(match);
                        int i = 1;
                        foreach (var scbrd in requestObject.scoreboard)
                        {
                            db.Scoreboards.Add(new Scoreboard
                            {
                                PlaceInMatch = i,
                                Name         = scbrd.name,
                                Frags        = scbrd.frags,
                                Kills        = scbrd.kills,
                                Deaths       = scbrd.deaths,
                                Match        = match
                            });
                            i++;
                        }
                    }
                    else
                    {
                        match.Timestamp   = timestamp;
                        match.Map         = requestObject.map;
                        match.GameMode    = requestObject.gameMode;
                        match.FragLimit   = requestObject.fragLimit;
                        match.TimeLimit   = requestObject.timeLimit;
                        match.TimeElapsed = requestObject.timeElapsed;
                        var removeScoreboards = db.Scoreboards.Where(scr => scr.MatchId == match.Id);
                        db.Scoreboards.RemoveRange(removeScoreboards);
                        int i = 1;
                        foreach (var scbrd in requestObject.scoreboard)
                        {
                            db.Scoreboards.Add(new Scoreboard
                            {
                                PlaceInMatch = i,
                                Name         = scbrd.name,
                                Frags        = scbrd.frags,
                                Kills        = scbrd.kills,
                                Deaths       = scbrd.deaths,
                                Match        = match
                            });
                            i++;
                        }
                    }
                    db.SaveChanges();
                    statusCode = 200;
                }
            }
            catch
            {
                statusCode = 400;
            }
            return(statusCode);
        }