private List <MapStats> GetMapStats(List <string> steamIDFilters) { long steamID = GetSteamID(); var mapStats = new List <MapStats>(); var allMaps = new MapStats("[All maps]"); foreach (var match in _Matches) { ProcessMatch(match, steamID, steamIDFilters, mapStats); ProcessMatch(match, steamID, steamIDFilters, mapStats, allMaps); } mapStats = mapStats.OrderByDescending(m => m.Games).ToList(); mapStats.Add(allMaps); return(mapStats); }
private void ProcessMatch(Match match, long steamID, List <string> steamIDFilters, List <MapStats> mapStats, MapStats statsOverride = null) { if (match.Teams.Count != 2) { return; } var player = match.Teams.SelectMany(t => t.Players).FirstOrDefault(p => p.SteamID == steamID); if (player == null) { return; } var team1 = match.Teams[0]; var team2 = match.Teams[1]; bool isOnTeam1 = team1.Players.Contains(player); var playerTeam = isOnTeam1 ? team1 : team2; var enemyTeam = isOnTeam1 ? team2 : team1; var inclusiveSet = new HashSet <long>(); var exclusiveSet = new HashSet <long>(); foreach (string filter in steamIDFilters) { if (filter[0] != '!') { inclusiveSet.Add(long.Parse(filter)); } else { exclusiveSet.Add(long.Parse(filter.Substring(1))); } } var teamSet = new HashSet <long>(playerTeam.Players.Select(p => p.SteamID)); if (!inclusiveSet.IsSubsetOf(teamSet) || exclusiveSet.Intersect(teamSet).Any()) { return; } var stats = statsOverride ?? mapStats.FirstOrDefault(s => s.Map == match.Map); if (stats == null) { stats = new MapStats(match.Map); mapStats.Add(stats); } if (playerTeam.Score > enemyTeam.Score) { stats.Wins++; } else if (playerTeam.Score < enemyTeam.Score) { stats.Losses++; } else { stats.Draws++; } stats.Kills += player.Kills; stats.Deaths += player.Deaths; for (int i = 0; i < player.MultiKills.Length; i++) { stats.MultiKills[i] += player.MultiKills[i]; } stats.RoundsWon += playerTeam.Score; stats.RoundsLost += enemyTeam.Score; }