/// <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
            });
        }
Ejemplo n.º 2
0
        /// <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
            });
        }