From a6280631943a4161c13d4518ab6845bfc29e7140 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 1 Jul 2014 16:59:36 -0400 Subject: [PATCH] Added Guild Leader Elections --- scripts/radial/object/guild_access_device.py | 53 +++++++++++- src/resources/guild/Guild.java | 18 +++++ src/resources/guild/GuildMember.java | 27 ++++++- src/services/GuildService.java | 85 ++++++++++++++++++++ 4 files changed, 180 insertions(+), 3 deletions(-) diff --git a/scripts/radial/object/guild_access_device.py b/scripts/radial/object/guild_access_device.py index 4c92fbe7..962f12db 100644 --- a/scripts/radial/object/guild_access_device.py +++ b/scripts/radial/object/guild_access_device.py @@ -36,7 +36,7 @@ def createRadial(core, owner, target, radials): radials.add(RadialOptions(3, RadialOptions.serverGuildDisband, 3, '@guild:menu_disband')) # Disband Guild if member.hasChangeNamePermission(): radials.add(RadialOptions(3, RadialOptions.serverGuildNameChange, 3, '@guild:menu_namechange')) # Change Guild Name - + #### Member Management #### radials.add(RadialOptions(4, RadialOptions.serverGuildMembers, 3, '@guild:menu_members')) # Guild Members if member.hasSponsorPermission(): @@ -46,6 +46,22 @@ def createRadial(core, owner, target, radials): if owner.getObjectID() == guild.getLeader(): radials.add(RadialOptions(4, 218, 3, '@guild:menu_member_motd')) # Create a Guild Message radials.add(RadialOptions(4, 69, 3, '@guild:menu_leader_change')) # Transfer PA Leadership + + #### Guild Leader Elections #### + if guild.isElectionsEnabled(): + radials.add(RadialOptions(0, 71, 3, '@guild:menu_leader_race')) # Guild Leader Elections + + if guild.getLeaderCandidates().containsKey(owner.getObjectID()): + radials.add(RadialOptions(5, 72, 3, '@guild:menu_leader_register')) # Register to Run + else + radials.add(RadialOptions(5, 73, 3, '@guild:menu_leader_unregister')) # Unregister from Race + radials.add(RadialOptions(5, 74, 4, '@guild:menu_leader_vote')) # Cast a Vote + radials.add(RadialOptions(5, 75, 4, '@guild:menu_leader_standings')) # View Standings + if owner.getObjectID() == guild.getLeader(): + radials.add(4, 56, 3, '@guild:menu_disable_elections') # Disable Elections + else: + if owner.getObjectID() == guild.getLeader(): + radials.add(RadialOptions(4, 57, 3, '@guild:menu_enable_elections')) # Enable Elections return return @@ -81,7 +97,7 @@ def handleSelection(core, owner, target, option): elif option == RadialOptions.serverGuildNameChange: core.guildService.handleChangeGuildName(owner, guild) return - + #### Member Management #### # - Guild Members @@ -108,4 +124,37 @@ def handleSelection(core, owner, target, option): elif option == 218: core.guildService.handleChangeGuildMotd(owner, guild) return + + #### Guild Management #### + + # - Register to Run + elif option == 72: + guild.getLeaderCandidates().put(owner.getObjectID(), 1) + owner.sendSystemMessage('@guild:vote_register_congrats', 0) + return + + # - Unregister from Race + elif option == 73: + guild.getLeaderCandidates().remove(owner.getObjectID()) + owner.sendSystemMessage('@guild:vote_unregistered', 0) + return + + # - Cast a Vote + elif option == 74: + core.guildService.handleVoteForLeader(owner, guild) + return + + # - View Standings + elif option == 75: + core.guildService.handleViewElectionStandings(owner, guild) + return + + # - Enable Elections + elif option == 56: + core.guildService.handleEnableGuildElections(guild) + return + + # - Disable Elections + elif option == 57: + return return \ No newline at end of file diff --git a/src/resources/guild/Guild.java b/src/resources/guild/Guild.java index 76d0ac30..727fd17a 100644 --- a/src/resources/guild/Guild.java +++ b/src/resources/guild/Guild.java @@ -40,8 +40,10 @@ public class Guild { private String leaderName; private Map members = new HashMap(); private Map sponsoredPlayers = new HashMap(); + private Map leaderCandidates; private String motd = ""; private boolean electionsEnabled = false; + private long electionResultsDate; public Guild(int id, String abbreviation, String name, SWGObject leader) { this.id = id; @@ -171,4 +173,20 @@ public class Guild { public void setElectionsEnabled(boolean electionsEnabled) { this.electionsEnabled = electionsEnabled; } + + public long getElectionResultsDate() { + return electionResultsDate; + } + + public void setElectionResultsDate(long electionResultsDate) { + this.electionResultsDate = electionResultsDate; + } + + public Map getLeaderCandidates() { + return leaderCandidates; + } + + public void setLeaderCandidates(Map leaderCandidates) { + this.leaderCandidates = leaderCandidates; + } } diff --git a/src/resources/guild/GuildMember.java b/src/resources/guild/GuildMember.java index e60573de..f6721ff2 100644 --- a/src/resources/guild/GuildMember.java +++ b/src/resources/guild/GuildMember.java @@ -33,7 +33,8 @@ public class GuildMember { private String rank = ""; private String name = ""; private String title = ""; - + private int votes = 0; + private long votedId; private Vector permissions = new Vector(); private boolean mailPermission = false; private boolean sponsorPermission = false; @@ -93,6 +94,30 @@ public class GuildMember { this.joinTime = joinTime; } + public int getVotes() { + return votes; + } + + public void setVotes(int votes) { + this.votes = votes; + } + + public void incrementVotes() { + this.votes++; + } + + public void decrementVotes() { + this.votes--; + } + + public long getVotedId() { + return votedId; + } + + public void setVotedId(long votedId) { + this.votedId = votedId; + } + public boolean hasMailPermission() { return mailPermission; } diff --git a/src/services/GuildService.java b/src/services/GuildService.java index 5c36eec2..28094a54 100644 --- a/src/services/GuildService.java +++ b/src/services/GuildService.java @@ -252,6 +252,91 @@ public class GuildService implements INetworkDispatch { core.suiService.openSUIWindow(window); } + public void handleEnableGuildElections(Guild guild) { + guild.setElectionsEnabled(true); + guild.setElectionResultsDate(System.currentTimeMillis() + (12095 * 100000)); // 2 weeks + + Map candidates = new HashMap(); + candidates.put(guild.getLeader(), 1); + + GuildMember leader = guild.getMember(guild.getLeader()); + + leader.setVotedId(guild.getLeader()); + + guild.sendGuildMail(guild.getName(), "@guild:open_elections_email_subject", "@guild:open_elections_email_body"); + } + + public void handleViewElectionStandings(CreatureObject actor, Guild guild) { + + Map candidates = guild.getLeaderCandidates(); + + if (candidates.size() <= 1) { + actor.sendSystemMessage("@guild:vote_no_candidates", DisplayType.Broadcast); + return; + } + + SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@guild:leader_standings_t", "@guild:leader_standings_d", new TreeMap(), actor, null, 0); + + candidates.keySet().stream().forEach(candidateId -> { + if (candidateId == guild.getLeader()) { + window.addListBoxMenuItem("Incumbent: " + guild.getLeaderName() + " -- Votes: " + String.valueOf(candidates.get(candidateId)), candidateId); + } else { + GuildMember candidate = guild.getMember(candidateId); + + window.addListBoxMenuItem("Challenger: " + candidate.getName() + " -- Votes: " + String.valueOf(candidates.get(candidateId)), candidateId); + } + + }); + core.suiService.openSUIWindow(window); + } + + public void handleVoteForLeader(CreatureObject actor, Guild guild) { + + SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@guild:leader_vote_t", "@guild:leader_vote_d", new TreeMap(), actor, null, 0); + + Map candidates = guild.getLeaderCandidates(); + candidates.keySet().stream().forEach(candidateId -> { + if (candidateId == guild.getLeader()) { + window.addListBoxMenuItem("Incumbent: " + guild.getLeaderName() + " -- Votes: " + String.valueOf(candidates.get(candidateId)), candidateId); + } else { + GuildMember candidate = guild.getMember(candidateId); + + window.addListBoxMenuItem("Challenger: " + candidate.getName() + " -- Votes: " + String.valueOf(candidates.get(candidateId)), candidateId); + } + + }); + + Vector returnList = new Vector(); + returnList.add("List.lstList:SelectedRow"); + + window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, (owner, eventType, resultList) -> { + long voteId = Long.parseLong(resultList.get(0)); + + GuildMember voter = guild.getMember(actor.getObjectID()); + if (voter == null) + return; + + if (voter.getVotedId() == voteId) { + if (guild.getLeaderCandidates().containsKey(voteId)) + guild.getLeaderCandidates().put(voteId, guild.getLeaderCandidates().get(voteId) - 1); + + actor.sendSystemMessage("@guild:vote_abstain", DisplayType.Broadcast); + return; + } + + // remove prior votes + if (voter.getVotedId() != 0 && guild.getLeaderCandidates().containsKey(voter.getVotedId())) + guild.getLeaderCandidates().put(voter.getVotedId(), guild.getLeaderCandidates().get(voter.getVotedId()) - 1); + + voter.setVotedId(voteId); + guild.getLeaderCandidates().put(voteId, guild.getLeaderCandidates().get(voteId) + 1); + actor.sendSystemMessage(OutOfBand.ProsePackage("@guild:vote_placed", "TO", guild.getMember(voteId).getName()), DisplayType.Broadcast); + + }); + + core.suiService.openSUIWindow(window); + } + public void handleCreateGuildAbbrev(CreatureObject actor, String guildName, SWGObject creationSource) { SUIWindow window = core.suiService.createInputBox(InputBoxType.INPUT_BOX_OK_CANCEL, "@guild:create_abbrev_title", "@guild:create_abbrev_prompt", actor, null, 0, (owner, eventType, returnList) -> {