Пример #1
0
        public async Task <(ICollection <Validation> Validations, int TotalValidations, int ValidationsNumber)> GetPlayerDefaultValidationsAsync(Guid gameId, int roundNumber, Guid playerId, string theme, string sortedLetter)
        {
            var players = await _playerStorage.GetPlayersInRoundAsync(gameId);

            var playerValidations = players.GetValidations(roundNumber, theme);

            if (!playerValidations.HasValidatiosOfPlayer(playerId))
            {
                var answers                     = players.GetAnswers(roundNumber);
                var totalValidations            = answers.GetTotalThemesForPlayerValidate(playerId, roundNumber);
                var defaultValidationsForPlayer = answers.BuildValidationsForPlayer(playerId, theme, sortedLetter);

                var validationsNumber = players.First(p => p.Id == playerId).GetTotalValidationsInRound(roundNumber) + 1;
                return(defaultValidationsForPlayer.ToList(), totalValidations, validationsNumber);
            }

            return(new List <Validation>(), 0, 0);
        }
Пример #2
0
        public async Task ProcessRoundPontuationAsync(Round round)
        {
            if (round.Finished)
            {
                return;
            }

            var pontuations = new List <RoundPontuations>();
            var gameId      = round.GameId;

            var players = await _playerStorage.GetPlayersInRoundAsync(gameId);

            var roundNumber  = round.Number;
            var roundAnswers = players.GetAnswers(roundNumber).ToList();
            var validations  = players.GetValidations(roundNumber).ToList();
            var gameThemes   = await _gameStorage.GetThemesAsync(round.GameId);

            foreach (var theme in gameThemes)
            {
                var answers = roundAnswers.GetAnswersOfTheme(theme);

                foreach (var answer in answers)
                {
                    int validVotesCountForAnswer   = validations.GetValidVotesCountForAnswer(answer);
                    int invalidVotesCountForAnswer = validations.GetInvalidVotesCountForAnswer(answer);

                    if (validVotesCountForAnswer >= invalidVotesCountForAnswer)
                    {
                        var playersThatRepliedAnswer = roundAnswers.GetPlayersIdsThatRepliedAnswer(answer);

                        if (!playersThatRepliedAnswer.Any())
                        {
                            continue;
                        }

                        if (playersThatRepliedAnswer.Count() > 1)
                        {
                            GiveFivePointsForEachPlayer(theme, playersThatRepliedAnswer);
                        }
                        else
                        {
                            GiveTenPointsForEachPlayer(theme, playersThatRepliedAnswer);
                        }
                    }
                    else
                    {
                        var playersThatRepliedAnswer = roundAnswers.GetPlayersIdsThatRepliedAnswer(answer);
                        GiveZeroPointsForEachPlayer(theme, playersThatRepliedAnswer);
                    }
                }

                var playersWithBlankAnswers = roundAnswers.GetPlayersIdsWithBlankAnswersForTheme(theme);
                GiveZeroPointsForEachPlayer(theme, playersWithBlankAnswers);
            }

            await SavePlayersPontuations();

            round.Finish();

            #region Local Methods
            async Task SavePlayersPontuations()
            {
                foreach (var playerPontuations in pontuations)
                {
                    var player = players.FirstOrDefault(p => p.Id == playerPontuations.PlayerId);

                    if (player != null)
                    {
                        player.Pontuations.Add(playerPontuations);
                        await _playerStorage.EditAsync(player);
                    }
                }
            }

            void GiveZeroPointsForEachPlayer(string theme, IEnumerable <Guid> playersIds)
            {
                foreach (var playerId in playersIds)
                {
                    AddPlayerPontuation(playerId, theme, 0);
                }
            }

            void GiveFivePointsForEachPlayer(string theme, IEnumerable <Guid> playersIds)
            {
                foreach (var playerId in playersIds)
                {
                    AddPlayerPontuation(playerId, theme, 5);
                }
            }

            void GiveTenPointsForEachPlayer(string theme, IEnumerable <Guid> playersIds)
            {
                foreach (var playerId in playersIds)
                {
                    AddPlayerPontuation(playerId, theme, 10);
                }
            }

            void AddPlayerPontuation(Guid playerId, string theme, int pontuation)
            {
                var playerPontuations = pontuations.FirstOrDefault(pp => pp.PlayerId == playerId);

                if (playerPontuations is null)
                {
                    var roundPontuations = new RoundPontuations(gameId, roundNumber, playerId);
                    roundPontuations.AddPontuationForTheme(theme, pontuation);
                    pontuations.Add(roundPontuations);
                }
                else
                {
                    playerPontuations.AddPontuationForTheme(theme, pontuation);
                }
            }

            #endregion
        }