/// <summary> /// Add a collection of votes to the vote counter. /// </summary> /// <param name="votePartitions">A string list of all the parts of the vote to be added.</param> /// <param name="voter">The voter for this vote.</param> /// <param name="postID">The post ID for this vote.</param> /// <param name="voteType">The type of vote being added.</param> public void AddVotes(IEnumerable <VoteLineBlock> votePartitions, Origin voter) { if (!votePartitions.Any()) { return; } // Remove the voter from any existing votes VoteStorage.RemoveVoterFromVotes(voter); // Add/update all segments of the provided vote foreach (var partition in votePartitions) { VoteStorage.AddSupporterToVote(partition, voter); AddPotentialVoteTask(partition.Task); } // Cleanup any votes that no longer have any support VoteStorage.RemoveUnsupportedVotes(); }
public bool Join(List <Origin> voters, Origin voterToJoin) { bool joined = false; UndoBuffer.Push(new UndoAction(UndoActionType.Join, VoteStorage)); foreach (var voter in voters) { joined = JoinImpl(voter, voterToJoin) || joined; } if (joined) { OnPropertyChanged("Votes"); OnPropertyChanged("Voters"); OnPropertyChanged(nameof(HasUndoActions)); } else { UndoBuffer.Pop(); } return(joined); /// <summary> /// Implement joining logic per voter. /// </summary> /// <param name="joiningVoter">The voter being moved to a new voting support set.</param> /// <param name="voterToJoin">The voter being joined.</param> /// <returns>Returns true if the join was completed.</returns> bool JoinImpl(Origin joiningVoter, Origin voterToJoin) { var source = GetVotesBy(joiningVoter); var dest = GetVotesBy(voterToJoin); if (!source.Any() || !dest.Any()) { return(false); } bool joined = false; // Remove support from any votes where the target voter isn't also present. foreach (var vote in source) { if (!VoteStorage.DoesVoterSupportVote(voterToJoin, vote)) { VoteStorage.RemoveSupporterFromVote(vote, joiningVoter); } } VoteStorage.RemoveUnsupportedVotes(); foreach (var vote in dest) { if (!VoteStorage.DoesVoterSupportVote(joiningVoter, vote)) { VoteStorage.AddSupporterToVote(vote, joiningVoter); joined = true; } } return(joined); } }