public PartialGameState GetPartialGameState() { return(new PartialGameState { PartialVoteStates = CurrentVotingOptions.Select(x => { var votesForOption = CurrentVotes.Values.Count(y => y == x.Id); return new PartialVoteState { Id = x.Id, Count = votesForOption }; }) }); }
public CompleteGameState GetCompleteGameState() { return(new CompleteGameState { PreviousResultDescription = PreviousVoteDescription, CurrentRound = _currentVotingRound, VoteOptionsState = CurrentVotingOptions.Select(x => { var votesForOption = CurrentVotes.Values.Count(y => y == x.Id); return new FullVoteOptionState { Description = x.Description, Id = x.Id, Count = votesForOption }; }).ToArray() }); }
public async Task CastClientVote(int votedOptionId, string voterIPAddress, int round) { if (round != _currentVotingRound) { return; } if (!CurrentVotingOptions.Any(x => x.Id == votedOptionId)) { return; } logger.LogDebug($"Casting vote from {voterIPAddress} for {votedOptionId} during round {round}"); var hasVoterAlreadyVoted = CurrentVotes.TryGetValue(voterIPAddress, out var existingValue); if (hasVoterAlreadyVoted && existingValue.Equals(votedOptionId)) { return; } if (hasVoterAlreadyVoted) { CurrentVotes.TryUpdate(voterIPAddress, votedOptionId, existingValue); } else { CurrentVotes.TryAdd(voterIPAddress, votedOptionId); } var currentVote = GetCurrentVoteOptionFromVotes(); if (currentVote.Id != _currentVotingOption) { await PushNewVoteResultToHost(currentVote.ChaosId); } _currentVotingOption = currentVote.Id; await PushVoteStateToClients(); }
public async Task SetNewVoteOptions(VoteOption[] newVotingOptions) { logger.LogInformation("Setting new vote options"); PreviousVoteDescription = CurrentVotingOptions?.FirstOrDefault(x => x.Id == _currentVotingOption)?.Description ?? "No Voting rounds completed yet"; CurrentVotingOptions = newVotingOptions; CurrentVotes.Clear(); _currentVotingRound++; logger.LogInformation("Updating Game State"); var currentVote = GetCurrentVoteOptionFromVotes(); _currentVotingOption = currentVote.Id; await PushNewVoteResultToHost(currentVote.ChaosId); await PushNewVoteOptionsToClients(); }
private VoteOption GetCurrentVoteOptionFromVotes() { var options = CurrentVotingOptions.Clone() as VoteOption[]; var votes = CurrentVotes.Values.ToArray(); if (!votes.Any()) { var randomIndex = random.Next(0, options.Length - 1); var randomVote = options[randomIndex]; return(randomVote); } else { var groupings = votes.Where(x => options.Any(y => y.Id == x)) .GroupBy(x => x) .OrderByDescending(x => x.Count()); var maxCount = groupings.First().Count(); var relevantGroupings = groupings.Where(x => x.Count() == maxCount); if (relevantGroupings.Count() == 1) { return(options.First(x => x.Id == relevantGroupings.First().Key)); } else { var randomizedGroupingIndex = random.Next(0, relevantGroupings.Count()); var randomizedGrouping = relevantGroupings.ElementAt(randomizedGroupingIndex); return(options.First(x => x.Id == randomizedGrouping.Key)); } } }