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; }
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); }); }