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