/// <summary> /// Вычисляет новое значение статистики, основываясь на старой статистике и новых данных /// </summary> /// <param name="time">Время окончания матча</param> /// <param name="place">Место игрока</param> /// <param name="matchInfo">Информация о матче</param> /// <param name="info">Результаты игрока в матче</param> /// <returns> /// Новый экземпляр данного класса с обновлённой статистикой, /// старый экземпляр не меняется из-за необходимости блокировок в многопоточной среде /// </returns> public PlayerStats CalcNew(DateTime time, int place, MatchInfo matchInfo, PlayerMatchInfo info) { var totalPlayers = matchInfo.Scoreboard.Count; var playersBelowCurrent = totalPlayers - place; double scoreboardPercent; if (totalPlayers == 1) { scoreboardPercent = 100; } else { scoreboardPercent = (double)playersBelowCurrent / (totalPlayers - 1) * 100; } MatchesPerDay[time.Date] = MatchesPerDay.Get(time.Date) + 1; return(new PlayerStats { TotalDeaths = TotalDeaths + info.Deaths.Value, TotalKills = TotalKills + info.Kills.Value, TotalScoreboard = TotalScoreboard + scoreboardPercent, MatchesPerDay = MatchesPerDay, ServerFrequency = ServerFrequency, GameModeFrequency = GameModeFrequency }); }
/// <summary> /// Вычисляет новое значение статистики, основываясь на старой статистике и новых данных /// </summary> /// <param name="endpoint">Идентификатор сервера</param> /// <param name="timestamp">Временная метка окончания матча</param> /// <param name="place">Место игрока</param> /// <param name="stats">Приватная статистика игрока</param> /// <param name="matchInfo">Информация о матче</param> /// <param name="info">Результаты игрока в матче</param> /// <returns> /// Новый экземпляр данного класса с обновлённой статистикой, /// старый экземпляр не меняется из-за необходимости блокировок в многопоточной среде /// </returns> public PublicPlayerStats CalcNew(string endpoint, string timestamp, int place, PlayerStats stats, MatchInfo matchInfo, PlayerMatchInfo info) { var time = timestamp.ToUtc(); var totalMatches = TotalMatchesPlayed + 1; var favoriteServer = UpdateFavorite(stats.ServerFrequency, endpoint, FavoriteServer); var favoriteGameMode = UpdateFavorite(stats.GameModeFrequency, matchInfo.GameMode, FavoriteGameMode); return(new PublicPlayerStats { TotalMatchesPlayed = totalMatches, LastMatchPlayed = GetLastTimePlayed(timestamp), FavoriteServer = favoriteServer, FavoriteGameMode = favoriteGameMode, UniqueServers = stats.ServerFrequency.Count, TotalMatchesWon = TotalMatchesWon + (place == 1 ? 1 : 0), AverageScoreboardPercent = stats.TotalScoreboard / totalMatches, MaximumMatchesPerDay = Math.Max(MaximumMatchesPerDay, stats.MatchesPerDay[time.Date]), AverageMatchesPerDay = (double)totalMatches / stats.MatchesPerDay.Count, KillToDeathRatio = (double)stats.TotalKills / stats.TotalDeaths }); }