public PlayerStatistics(PlayerStatisticsEntry entry)
 {
     TotalMatchesPlayed       = entry.TotalMatchesPlayed;
     TotalMatchesWon          = entry.TotalMatchesWon;
     FavoriteServer           = entry.FavoriteServer;
     UniqueServers            = entry.UniqueServers;
     FavoriteGameMode         = entry.FavoriteGameMode;
     AverageScoreboardPercent = entry.AverageScoreboardPercent;
     MaximumMatchesPerDay     = entry.MaximumMatchesPerDay;
     AverageMatchesPerDay     = entry.AverageMatchesPerDay;
     LastMatchPlayed          = entry.LastMatchPlayed;
     KillToDeathRatio         = entry.KillToDeathRatio;
 }
        private void UpdateEntry(PlayerStatisticsEntry previous, MatchInfoEntry infoEntry)
        {
            var position = infoEntry.Scoreboard.FindIndex(x => x.Name == previous.Name);

            var scoreboardPercent = 100.0;

            if (infoEntry.Scoreboard.Count > 1)
            {
                scoreboardPercent = (double)(infoEntry.Scoreboard.Count - position - 1) / (infoEntry.Scoreboard.Count - 1) * 100;
            }

            var totalMatchesWon = position == 0 ? previous.TotalMatchesWon + 1 : previous.TotalMatchesWon;

            previous.ServersPopularity.AddOrUpdate(x => x.Name == infoEntry.Endpoint,
                                                   () => new NameCountEntry {
                Name = infoEntry.GameMode, Count = 1
            }, x => x.Count++);
            previous.GameModePopularity.AddOrUpdate(x => x.Name == infoEntry.GameMode,
                                                    () => new NameCountEntry {
                Name = infoEntry.GameMode, Count = 1
            }, x => x.Count++);
            previous.MatchesPerDay.AddOrUpdate(x => x.Day == infoEntry.Timestamp.Date,
                                               () => new DayCountEntry {
                Day = infoEntry.Timestamp.Date, Count = 1
            }, x => x.Count++);

            previous.TotalKills  += infoEntry.Scoreboard[position].Kills;
            previous.TotalDeaths += infoEntry.Scoreboard[position].Deaths;

            var totalDays = (previous.MatchesPerDay.Max(x => x.Day) - previous.MatchesPerDay.Min(x => x.Day)).TotalDays;
            var averageScoreboardPercent = (previous.AverageScoreboardPercent * previous.TotalMatchesPlayed + scoreboardPercent) / (previous.TotalMatchesPlayed + 1);
            var lastMatchPlayed          = infoEntry.Timestamp > previous.LastMatchPlayed ? infoEntry.Timestamp : previous.LastMatchPlayed;
            var noDeaths = previous.TotalDeaths == 0;

            previous.TotalMatchesPlayed       = previous.TotalMatchesPlayed + 1;
            previous.TotalMatchesWon          = totalMatchesWon;
            previous.FavoriteServer           = previous.ServersPopularity.OrderByDescending(x => x.Count).First().Name;
            previous.UniqueServers            = previous.ServersPopularity.Count;
            previous.FavoriteGameMode         = previous.GameModePopularity.OrderByDescending(x => x.Count).First().Name;
            previous.AverageScoreboardPercent = averageScoreboardPercent;
            previous.MaximumMatchesPerDay     = previous.MatchesPerDay.Select(x => x.Count).Max();
            previous.AverageMatchesPerDay     = Math.Abs(totalDays) < 0.01 ? previous.MatchesPerDay.Select(x => x.Count).Sum() : previous.MatchesPerDay.Select(x => x.Count).Sum() / totalDays;
            previous.LastMatchPlayed          = lastMatchPlayed;
            previous.KillToDeathRatio         = noDeaths ? previous.TotalKills : (double)previous.TotalKills / previous.TotalDeaths;
        }
Exemple #3
0
        public async Task GetPlayerStatistics_ReturnsCorrectStatistics()
        {
            var servers = new[]
            {
                new ServerInfoEntry
                {
                    Endpoint  = "Server1",
                    Name      = "Test",
                    GameModes =
                        new List <StringEntry> {
                        new StringEntry {
                            String = "DM"
                        }, new StringEntry {
                            String = "TDM"
                        }
                    }
                },
                new ServerInfoEntry
                {
                    Endpoint  = "Server2",
                    Name      = "Test",
                    GameModes =
                        new List <StringEntry> {
                        new StringEntry {
                            String = "DM"
                        }, new StringEntry {
                            String = "TDM"
                        }
                    }
                }
            };
            var matches = new[]
            {
                new MatchInfoEntry
                {
                    Endpoint    = "Server1",
                    Timestamp   = DateTime.Today,
                    Map         = "NewMap",
                    GameMode    = "DM",
                    FragLimit   = 200,
                    TimeLimit   = 200,
                    TimeElapsed = 152.9,
                    Scoreboard  = new List <ScoreEntry>
                    {
                        new ScoreEntry {
                            Name = "Player1", Frags = 15, Kills = 6, Deaths = 3
                        },
                        new ScoreEntry {
                            Name = "Player2", Frags = 2, Kills = 2, Deaths = 21
                        }
                    }
                },
                new MatchInfoEntry
                {
                    Endpoint    = "Server2",
                    Timestamp   = DateTime.UtcNow.Date + TimeSpan.FromDays(3),
                    Map         = "NewMap",
                    GameMode    = "TDM",
                    FragLimit   = 200,
                    TimeLimit   = 200,
                    TimeElapsed = 152.9,
                    Scoreboard  = new List <ScoreEntry>
                    {
                        new ScoreEntry {
                            Name = "Player3", Frags = 33, Kills = 2, Deaths = 3
                        },
                        new ScoreEntry {
                            Name = "Player1", Frags = 12, Kills = 6, Deaths = 21
                        },
                        new ScoreEntry {
                            Name = "Player5", Frags = 1, Kills = 3, Deaths = 21
                        }
                    }
                },
                new MatchInfoEntry
                {
                    Endpoint    = "PutServerInfo_SavesInfo",
                    Timestamp   = DateTime.UtcNow.Date + TimeSpan.FromDays(3),
                    Map         = "NewMap",
                    GameMode    = "TDM",
                    FragLimit   = 200,
                    TimeLimit   = 200,
                    TimeElapsed = 152.9,
                    Scoreboard  = new List <ScoreEntry>
                    {
                        new ScoreEntry {
                            Name = "Player3", Frags = 33, Kills = 2, Deaths = 3
                        },
                        new ScoreEntry {
                            Name = "Player4", Frags = 12, Kills = 6, Deaths = 21
                        },
                        new ScoreEntry {
                            Name = "Player6", Frags = 12, Kills = 6, Deaths = 24
                        },
                        new ScoreEntry {
                            Name = "Player5", Frags = 1, Kills = 3, Deaths = 21
                        }
                    }
                }
            };
            var expected = new PlayerStatisticsEntry
            {
                TotalMatchesPlayed       = 3,
                TotalMatchesWon          = 2,
                FavoriteServer           = "PutServerInfo_SavesInfo",
                UniqueServers            = 3,
                FavoriteGameMode         = "TM",
                AverageScoreboardPercent = (100 + 100 + 50) / 3.0,
                MaximumMatchesPerDay     = 1,
                AverageMatchesPerDay     = 3 / 6.0,
                KillToDeathRatio         = 33.0 / 27
            };

            foreach (var server in servers)
            {
                await statistics.PutServerInfo(server.Endpoint,
                                               new ServerInfoEntry { Name = server.Name, GameModes = server.GameModes });
            }
            foreach (var match in matches)
            {
                await statistics.PutMatchInfo(match.Endpoint, match.Timestamp, match);
            }
            var result = statistics.GetPlayerStatistics("Player1").Result;

            result.ShouldBeEquivalentTo(expected, o =>
            {
                o.Excluding(x => x.LastMatchPlayed);
                return(o);
            });
        }