/// <summary> /// Find all votes tied to a given vote line. /// The "plan name" (possibly user name) is checked with the /// standard and alternate extractions (adding a special marker character /// depending on whether the word "plan" is used, and whether it's /// standard or alt) in order to look up votes that said (possible) voter /// supports. /// </summary> /// <param name="voteLine">The vote line to be checked.</param> /// <param name="author">The author of the vote. Prevent circular references.</param> /// <returns>Returns a list of all votes supported by the user or plan /// specified in the vote line, if found. Otherwise returns an /// empty list.</returns> public List <string> GetVotesFromReference(string voteLine, string author) { if (voteLine == null) { throw new ArgumentNullException(nameof(voteLine)); } if (author == null) { throw new ArgumentNullException(nameof(author)); } List <string> results = new List <string>(); var referenceNames = VoteString.GetVoteReferenceNames(voteLine); if (!referenceNames[ReferenceType.Any].Any()) { return(results); } string proxyName = null; if (referenceNames[ReferenceType.Label].Any()) { // If there is a "plan" prefix, then if it's a user reference, // check for a ◈plan before checking for the user's base vote. // If the reference exists as a plan, use it. if (referenceNames[ReferenceType.Plan].Any() && HasPlan(referenceNames[ReferenceType.Plan].First())) { // If this is not a user name, get the plan name as the proxy reference. proxyName = PlanNames.First(p => referenceNames[ReferenceType.Plan] .Contains(VoteString.DeUrlContent(VoteString.RemoveBBCode(p)), Agnostic.StringComparer)); } else if (ReferenceVoters.Contains(referenceNames[ReferenceType.Voter].First(), Agnostic.StringComparer)) { // If it doesn't exist as a plan, then we can check for users. if (!AdvancedOptions.Instance.DisableProxyVotes) { proxyName = ReferenceVoters.First(n => referenceNames[ReferenceType.Voter].Contains(n, Agnostic.StringComparer)); if (proxyName == author) { proxyName = null; } } } } else { // If there is no "plan" prefix, and if the plan name is a user // reference, it may only refer to that user's vote as a whole. // If this matches a user name, get that user name as the proxy reference. if (ReferenceVoters.Contains(referenceNames[ReferenceType.Voter].First(), Agnostic.StringComparer)) { if (!AdvancedOptions.Instance.DisableProxyVotes) { proxyName = ReferenceVoters.First(n => referenceNames[ReferenceType.Voter].Contains(n, Agnostic.StringComparer)); if (proxyName == author) { proxyName = null; } } } else if (referenceNames[ReferenceType.Plan].Any() && HasPlan(referenceNames[ReferenceType.Plan].First())) { // If this is not a user name, get the plan name as the proxy reference. proxyName = PlanNames.First(p => referenceNames[ReferenceType.Plan].Contains(p, Agnostic.StringComparer)); } } if (!string.IsNullOrEmpty(proxyName)) { var planVotes = VotesWithSupporters.Where(v => v.Value.Contains(proxyName)); results.AddRange(planVotes.Select(v => v.Key)); } return(results); }
/// <summary> /// Find all votes tied to a given vote line. /// The "plan name" (possibly user name) is checked with the /// standard and alternate extractions (adding a special marker character /// depending on whether the word "plan" is used, and whether it's /// standard or alt) in order to look up votes that said (possible) voter /// supports. /// </summary> /// <param name="voteLine">The vote line to be checked.</param> /// <param name="author">The author of the vote. Prevent circular references.</param> /// <returns>Returns a list of all votes supported by the user or plan /// specified in the vote line, if found. Otherwise returns an /// empty list.</returns> public List <string> GetVotesFromReference(string voteLine, string author) { if (voteLine == null) { throw new ArgumentNullException(nameof(voteLine)); } if (author == null) { throw new ArgumentNullException(nameof(author)); } List <string> results = new List <string>(); var referenceNames = VoteString.GetVoteReferenceNames(voteLine); if (!referenceNames[ReferenceType.Any].Any()) { return(results); } string proxyName = null; // Label ^ or 'pin' means it must be a user reference. // Label 'plan' means it might be user or plan reference. if (referenceNames[ReferenceType.Label].Contains("plan")) { // If it's labeled as a 'plan', check plans first, then users. // If the reference exists as a plan, use it. if (referenceNames[ReferenceType.Plan].Any() && HasPlan(referenceNames[ReferenceType.Plan].First())) { // Get the plan name from the recorded plan names collection. proxyName = PlanNames.First(p => referenceNames[ReferenceType.Plan] .Contains(VoteString.DeUrlContent(VoteString.RemoveBBCode(p)), Agnostic.StringComparer)); } // If it doesn't exist as a plan, then we can check for users, as long as the quest hasn't disabled proxy votes. else if (!Quest.DisableProxyVotes && ReferenceVoters.Contains(referenceNames[ReferenceType.Voter].First(), Agnostic.InsensitiveComparer)) { proxyName = ReferenceVoters.First(n => referenceNames[ReferenceType.Voter].Contains(n, Agnostic.InsensitiveComparer)); // But don't allow self-references. Some user names conflict with normal vote lines. if (proxyName == author) { proxyName = null; } } } else { // If it's not labeled as a 'plan', then it's either a pin or an unlabeled reference. // Either way, check for users first. // See if any voter names match the line (as long as we're allowing proxy votes). If so, use that. if (!Quest.DisableProxyVotes && ReferenceVoters.Contains(referenceNames[ReferenceType.Voter].First(), Agnostic.InsensitiveComparer)) { proxyName = ReferenceVoters.First(n => referenceNames[ReferenceType.Voter].Contains(n, Agnostic.InsensitiveComparer)); // And make sure it's not the user using their own name. Some user names conflict with normal vote lines. if (proxyName == author) { proxyName = null; } } // If a user isn't found, only check for regular plans if there's not a non-plan label being used, // but not if the quest requires plan vote lines to be labeled. else if (!Quest.ForcePlanReferencesToBeLabeled && !referenceNames[ReferenceType.Label].Any()) { if (referenceNames[ReferenceType.Plan].Any() && HasPlan(referenceNames[ReferenceType.Plan].First())) { // Get the plan name from the recorded plan names collection. proxyName = PlanNames.First(p => referenceNames[ReferenceType.Plan] .Contains(VoteString.DeUrlContent(VoteString.RemoveBBCode(p)), Agnostic.StringComparer)); } } } if (!string.IsNullOrEmpty(proxyName)) { var planVotes = VotesWithSupporters.Where(v => v.Value.Contains(proxyName)); if (planVotes.Count() > 1) { planVotes = VotesWithSupporters.Where(v => v.Value.Contains(proxyName, Agnostic.StringComparer)); } results.AddRange(planVotes.Select(v => v.Key)); } return(results); }