From ac680362ae1f796fb068e5b00346ed30a4c6abe2 Mon Sep 17 00:00:00 2001 From: cswhite2000 <18whitechristop@gmail.com> Date: Sun, 7 Jan 2018 13:34:43 -0800 Subject: [PATCH 01/25] Cleanup polls code --- .../i18n/templates/pgm/PGMErrors.properties | 12 +- .../i18n/templates/pgm/PGMMessages.properties | 10 +- PGM/src/main/java/tc/oc/pgm/PGM.java | 22 +- PGM/src/main/java/tc/oc/pgm/PGMManifest.java | 5 +- .../java/tc/oc/pgm/commands/PollCommands.java | 232 ------------------ .../java/tc/oc/pgm/match/MatchManager.java | 9 +- PGM/src/main/java/tc/oc/pgm/polls/Poll.java | 36 ++- .../PollBlacklist.java} | 37 +-- .../main/java/tc/oc/pgm/polls/PollCustom.java | 28 --- .../main/java/tc/oc/pgm/polls/PollKick.java | 31 --- .../java/tc/oc/pgm/polls/PollListener.java | 33 +-- .../java/tc/oc/pgm/polls/PollManager.java | 85 ++++--- .../java/tc/oc/pgm/polls/PollManifest.java | 29 +++ .../oc/pgm/polls/commands/PollCommands.java | 87 +++++++ .../pgm/polls/commands/PollSubCommands.java | 183 ++++++++++++++ .../pgm/polls/{ => event}/PollEndEvent.java | 4 +- .../oc/pgm/polls/{ => event}/PollEvent.java | 3 +- .../pgm/polls/{ => event}/PollStartEvent.java | 3 +- .../tc/oc/pgm/polls/types/PollCustom.java | 37 +++ .../java/tc/oc/pgm/polls/types/PollKick.java | 44 ++++ .../pgm/polls/{ => types}/PollMutation.java | 25 +- .../oc/pgm/polls/{ => types}/PollNextMap.java | 19 +- .../tokens/gui/MutationConfirmInterface.java | 15 +- 23 files changed, 545 insertions(+), 444 deletions(-) delete mode 100644 PGM/src/main/java/tc/oc/pgm/commands/PollCommands.java rename PGM/src/main/java/tc/oc/pgm/{pollablemaps/PollableMaps.java => polls/PollBlacklist.java} (53%) delete mode 100644 PGM/src/main/java/tc/oc/pgm/polls/PollCustom.java delete mode 100644 PGM/src/main/java/tc/oc/pgm/polls/PollKick.java create mode 100644 PGM/src/main/java/tc/oc/pgm/polls/PollManifest.java create mode 100644 PGM/src/main/java/tc/oc/pgm/polls/commands/PollCommands.java create mode 100644 PGM/src/main/java/tc/oc/pgm/polls/commands/PollSubCommands.java rename PGM/src/main/java/tc/oc/pgm/polls/{ => event}/PollEndEvent.java (85%) rename PGM/src/main/java/tc/oc/pgm/polls/{ => event}/PollEvent.java (85%) rename PGM/src/main/java/tc/oc/pgm/polls/{ => event}/PollStartEvent.java (87%) create mode 100644 PGM/src/main/java/tc/oc/pgm/polls/types/PollCustom.java create mode 100644 PGM/src/main/java/tc/oc/pgm/polls/types/PollKick.java rename PGM/src/main/java/tc/oc/pgm/polls/{ => types}/PollMutation.java (67%) rename PGM/src/main/java/tc/oc/pgm/polls/{ => types}/PollNextMap.java (63%) diff --git a/Commons/core/src/main/i18n/templates/pgm/PGMErrors.properties b/Commons/core/src/main/i18n/templates/pgm/PGMErrors.properties index b906a0ee4..8d2a0e2c2 100644 --- a/Commons/core/src/main/i18n/templates/pgm/PGMErrors.properties +++ b/Commons/core/src/main/i18n/templates/pgm/PGMErrors.properties @@ -135,4 +135,14 @@ rating.lowParticipation = Sorry, you haven't participated in this match enough t rating.whilePlaying = To rate the map while playing, type {0} rating.sameRating = You have already rated this map a {0}. -huddle.globalChatDisabled = Global chat is disabled during team huddle \ No newline at end of file +huddle.globalChatDisabled = Global chat is disabled during team huddle + +poll.vote.value.invalid = Accepted values: yes|no +poll.noPollRunning = There is currently no poll running! +poll.kick.exempt = You cannot poll kick this player! +poll.disabled = Polls are disabled on this server! +poll.map.alreadyset = A map has already been set! +poll.map.restarting = You cannot set a map because a restart is queued! +poll.map.notallowed = You are not allowed to set that map! +poll.map.toomanyplayers = There are too many players online to set that map! +poll.already.running = Another poll is already running! diff --git a/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties b/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties index c8d2578e5..8ac1fed1a 100644 --- a/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties +++ b/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties @@ -275,12 +275,12 @@ item.locked = This item cannot be removed from its slot stats.hotbar = {0} kills ({1} streak) {2} deaths {3} K/D -poll.disabled = Polls are disabled on this server! -poll.map.alreadyset = A map has already been set! -poll.map.restarting = You cannot set a map because a restart is queued! -poll.map.notallowed = You are not allowed to set that map! -poll.map.toomanyplayers = There are too many players online to set that map! +poll.vote.for = You have voted for the current poll +poll.vote.against = You have voted against the current poll poll.tutorialmessage = Use {0}/vote [yes|no] {1}to vote +poll.kick.success = {0} has been kicked! +poll.veto = Poll vetoed by {0} + announce.online = Announced server as online announce.offline = Announced server as offline diff --git a/PGM/src/main/java/tc/oc/pgm/PGM.java b/PGM/src/main/java/tc/oc/pgm/PGM.java index ff50133a0..207bfa01e 100644 --- a/PGM/src/main/java/tc/oc/pgm/PGM.java +++ b/PGM/src/main/java/tc/oc/pgm/PGM.java @@ -21,7 +21,6 @@ import tc.oc.pgm.antigrief.CraftingProtect; import tc.oc.pgm.channels.ChannelCommands; import tc.oc.pgm.commands.MapCommands; -import tc.oc.pgm.commands.PollCommands; import tc.oc.pgm.commands.RotationControlCommands; import tc.oc.pgm.commands.RotationEditCommands; import tc.oc.pgm.events.ConfigLoadEvent; @@ -39,9 +38,7 @@ import tc.oc.pgm.match.MatchManager; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.menu.gui.SettingMenuHelper; -import tc.oc.pgm.pollablemaps.PollableMaps; -import tc.oc.pgm.polls.PollListener; -import tc.oc.pgm.polls.PollManager; +import tc.oc.pgm.polls.PollBlacklist; import tc.oc.pgm.start.StartCommands; import tc.oc.pgm.tablist.MatchTabManager; import tc.oc.pgm.timelimit.TimeLimitCommands; @@ -89,18 +86,6 @@ public Logger getRootMapLogger() { return mapdevLogger; } - private PollManager pollManager; - - public static PollManager getPollManager() { - return pgm == null ? null : pgm.pollManager; - } - - private PollableMaps pollableMaps; - - public static PollableMaps getPollableMaps() { - return pgm == null ? null : pgm.pollableMaps; - } - public MapLibrary getMapLibrary() { return mapLibrary; } @@ -137,9 +122,6 @@ public void onEnable() { return; } - this.pollManager = new PollManager(this); - this.pollableMaps = new PollableMaps(); - this.registerListeners(); // cycle match in 0 ticks so it loads after other plugins are done @@ -196,7 +178,6 @@ public void reloadConfig() { private void setupCommands() { commands.register(MapCommands.class); commands.register(ChannelCommands.class); - commands.register(PollCommands.class); commands.register(RotationEditCommands.RotationEditParent.class); commands.register(RotationControlCommands.RotationControlParent.class); commands.register(TimeLimitCommands.class); @@ -207,7 +188,6 @@ private void setupCommands() { } private void registerListeners() { - this.registerEvents(new PollListener(this.pollManager, this.matchManager)); this.registerEvents(new FormattingListener()); this.registerEvents(new CraftingProtect()); this.registerEvents(new ObjectivesFireworkListener()); diff --git a/PGM/src/main/java/tc/oc/pgm/PGMManifest.java b/PGM/src/main/java/tc/oc/pgm/PGMManifest.java index beeb6b43d..4bd8227ee 100644 --- a/PGM/src/main/java/tc/oc/pgm/PGMManifest.java +++ b/PGM/src/main/java/tc/oc/pgm/PGMManifest.java @@ -12,7 +12,6 @@ import tc.oc.pgm.chat.MatchUsernameRenderer; import tc.oc.pgm.commands.AdminCommands; import tc.oc.pgm.commands.MatchCommands; -import tc.oc.pgm.commands.PollCommands; import tc.oc.pgm.debug.PGMLeakListener; import tc.oc.pgm.development.MapDevelopmentCommands; import tc.oc.pgm.development.MapErrorTracker; @@ -35,6 +34,7 @@ import tc.oc.pgm.match.MatchPlayerEventRouter; import tc.oc.pgm.module.MatchModulesManifest; import tc.oc.pgm.mutation.command.MutationCommands; +import tc.oc.pgm.polls.PollManifest; import tc.oc.pgm.restart.RestartListener; import tc.oc.pgm.rotation.DynamicRotationListener; import tc.oc.pgm.settings.Settings; @@ -63,6 +63,7 @@ protected void configure() { install(new MatchAnalyticsManifest()); install(new ListingManifest()); + install(new PollManifest()); bind(MatchManager.class); bind(MatchLoader.class); @@ -82,7 +83,6 @@ protected void configure() { final PluginFacetBinder facets = new PluginFacetBinder(binder()); facets.register(AdminCommands.class); - facets.register(PollCommands.class); facets.register(MatchNameInvalidator.class); facets.register(MapDevelopmentCommands.class); facets.register(MapErrorTracker.class); @@ -104,7 +104,6 @@ protected void configure() { facets.register(InterfaceListener.class); requestStaticInjection(State.class); - requestStaticInjection(PollCommands.class); requestStaticInjection(MatchFooterTabEntry.class); } } diff --git a/PGM/src/main/java/tc/oc/pgm/commands/PollCommands.java b/PGM/src/main/java/tc/oc/pgm/commands/PollCommands.java deleted file mode 100644 index 9fa2f4731..000000000 --- a/PGM/src/main/java/tc/oc/pgm/commands/PollCommands.java +++ /dev/null @@ -1,232 +0,0 @@ -package tc.oc.pgm.commands; - -import com.google.common.collect.Sets; -import com.sk89q.minecraft.util.commands.Command; -import com.sk89q.minecraft.util.commands.CommandContext; -import com.sk89q.minecraft.util.commands.CommandException; -import com.sk89q.minecraft.util.commands.CommandPermissions; -import com.sk89q.minecraft.util.commands.NestedCommand; -import net.md_5.bungee.api.chat.TranslatableComponent; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import tc.oc.commons.bukkit.tokens.TokenUtil; -import tc.oc.commons.core.commands.Commands; -import tc.oc.commons.core.formatting.StringUtils; -import tc.oc.commons.core.restart.RestartManager; -import tc.oc.pgm.Config; -import tc.oc.pgm.PGM; -import tc.oc.pgm.map.PGMMap; -import tc.oc.pgm.mutation.Mutation; -import tc.oc.pgm.mutation.MutationMatchModule; -import tc.oc.pgm.mutation.command.MutationCommands; -import tc.oc.pgm.polls.Poll; -import tc.oc.pgm.polls.PollCustom; -import tc.oc.pgm.polls.PollEndReason; -import tc.oc.pgm.polls.PollKick; -import tc.oc.pgm.polls.PollManager; -import tc.oc.pgm.polls.PollMutation; -import tc.oc.pgm.polls.PollNextMap; - -import javax.inject.Inject; - -import java.util.List; - -import static tc.oc.commons.bukkit.commands.CommandUtils.newCommandException; - -public class PollCommands implements Commands { - - @Inject - private static RestartManager restartManager; - - @Command( - aliases = {"poll"}, - desc = "Poll commands", - min = 1, - max = -1 - ) - @NestedCommand({PollSubCommands.class}) - public static void pollCommand() { - } - - @Command( - aliases = {"vote"}, - desc = "Vote in a running poll.", - usage = "[yes|no]", - min = 1, - max = 1 - ) - @CommandPermissions("poll.vote") - public static void vote(CommandContext args, CommandSender sender) throws CommandException { - Player voter = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); - Poll currentPoll = PGM.getPollManager().getPoll(); - if(currentPoll != null) { - if(args.getString(0).equalsIgnoreCase("yes")) { - currentPoll.voteFor(voter.getName()); - sender.sendMessage(ChatColor.GREEN + "You have voted for the current poll."); - } else if (args.getString(0).equalsIgnoreCase("no")) { - currentPoll.voteAgainst(voter.getName()); - sender.sendMessage(ChatColor.RED + "You have voted against the current poll."); - } else { - throw new CommandException("Accepted values: yes|no"); - } - } else { - throw new CommandException("There is currently no poll running."); - } - } - - @Command( - aliases = {"veto"}, - desc = "Veto the current poll.", - min = 0, - max = 0 - ) - @CommandPermissions("poll.veto") - public static void veto(CommandContext args, CommandSender sender) throws CommandException { - PollManager pollManager = PGM.getPollManager(); - if(pollManager.isPollRunning()) { - pollManager.endPoll(PollEndReason.Cancelled); - Bukkit.getServer().broadcastMessage(ChatColor.RED + "Poll vetoed by " + sender.getName()); - } else { - throw new CommandException("There is currently no poll running."); - } - } - - public static Poll getCurrentPoll() throws CommandException { - Poll poll = PGM.getPollManager().getPoll(); - if(poll == null) { - throw new CommandException("There is currently no poll running."); - } - return poll; - } - - public static class PollSubCommands { - @Command( - aliases = {"kick"}, - desc = "Start a poll to kick another player.", - usage = "[player]", - min = 1, - max = 1 - ) - @CommandPermissions("poll.kick") - public static void pollKick(CommandContext args, CommandSender sender) throws CommandException { - Player initiator = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); - Player player = tc.oc.commons.bukkit.commands.CommandUtils.findOnlinePlayer(args, sender, 0); - - if(player.hasPermission("pgm.poll.kick.exempt") && !initiator.hasPermission("pgm.poll.kick.override")) { - throw new CommandException(player.getName() + " may not be poll kicked."); - } else { - startPoll(new PollKick(PGM.getPollManager(), Bukkit.getServer(), initiator.getName(), player.getName())); - } - } - - @Command( - aliases = {"next"}, - desc = "Start a poll to change the next map.", - usage = "[map name]", - min = 1, - max = -1 - ) - @CommandPermissions("poll.next") - public static List pollNext(CommandContext args, CommandSender sender) throws CommandException { - final String mapName = args.argsLength() > 0 ? args.getJoinedStrings(0) : ""; - if(args.getSuggestionContext() != null) { - return CommandUtils.completeMapName(mapName); - } - - if (!Config.Poll.enabled()) { - throw newCommandException(sender, new TranslatableComponent("poll.disabled")); - } - - if (restartManager.isRestartRequested()) { - throw newCommandException(sender, new TranslatableComponent("poll.map.restarting")); - } - if (PGM.getMatchManager().hasMapSet()) { - throw newCommandException(sender, new TranslatableComponent("poll.map.alreadyset")); - } - if (sender instanceof Player) { - Player player = (Player) sender; - if (TokenUtil.getUser(player).maptokens() < 1) { - throw newCommandException(sender, new TranslatableComponent("tokens.map.fail")); - } - } - - Player initiator = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); - - PGMMap nextMap = CommandUtils.getMap(args.getJoinedStrings(0), sender); - - if (!PGM.getPollableMaps().isAllowed(nextMap) && !sender.hasPermission("poll.next.override")) { - throw newCommandException(sender, new TranslatableComponent("poll.map.notallowed")); - } - - if (PGM.get().getServer().getOnlinePlayers().size() * 4 / 5 > nextMap.getDocument().max_players() && !sender.hasPermission("poll.next.override")) { - throw newCommandException(sender, new TranslatableComponent("poll.map.toomanyplayers")); - } - - startPoll(new PollNextMap(PGM.getPollManager(), Bukkit.getServer(), sender, initiator.getName(), PGM.getMatchManager(), nextMap)); - return null; - } - - @Command( - aliases = {"mutation", "mt"}, - desc = "Start a poll to set a mutation", - usage = "[mutation name]", - min = 1, - max = -1 - ) - @CommandPermissions("poll.mutation") - public static void pollMutation(CommandContext args, CommandSender sender) throws CommandException { - - if (!Config.Poll.enabled()) { - throw newCommandException(sender, new TranslatableComponent("poll.disabled")); - } - - if (sender instanceof Player) { - Player player = (Player) sender; - if (TokenUtil.getUser(player).mutationtokens() < 1) { - throw newCommandException(sender, new TranslatableComponent("tokens.mutation.fail")); - } - } - - String mutationString = args.getString(0); - MutationMatchModule module = PGM.getMatchManager().getCurrentMatch(sender).getMatchModule(MutationMatchModule.class); - - Mutation mutation = StringUtils.bestFuzzyMatch(mutationString, Sets.newHashSet(Mutation.values()), 0.9); - if(mutation == null) { - throw newCommandException(sender, new TranslatableComponent("command.mutation.error.find", mutationString)); - } else if(MutationCommands.getInstance().getMutationQueue().mutations().contains(mutation)) { - throw newCommandException(sender, new TranslatableComponent(true ? "command.mutation.error.enabled" : "command.mutation.error.disabled", mutation.getComponent(net.md_5.bungee.api.ChatColor.RED))); - } else if (!mutation.isPollable() && !sender.hasPermission("poll.mutation.override")) { - throw newCommandException(sender, new TranslatableComponent("command.mutation.error.illegal", mutationString)); - } - - startPoll(new PollMutation(PGM.getPollManager(), Bukkit.getServer(), sender, mutation, module)); - } - - @Command( - aliases = {"custom"}, - desc = "Start a poll with the supplied text", - usage = "[text...]", - min = 1, - max = -1 - ) - @CommandPermissions("poll.custom") - public static void pollCustom(CommandContext args, CommandSender sender) throws CommandException { - String text = args.getJoinedStrings(0); - Player initiator = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); - - startPoll(new PollCustom(PGM.getPollManager(), Bukkit.getServer(), initiator.getName(), text)); - } - - public static void startPoll(Poll poll) throws CommandException { - PollManager pollManager = PGM.getPollManager(); - if(pollManager.isPollRunning()) { - throw new CommandException("Another poll is already running."); - } - pollManager.startPoll(poll); - Bukkit.getServer().broadcastMessage(Poll.boldAqua + poll.getInitiator() + Poll.normalize + " has started a poll " + poll.getDescriptionMessage()); - Bukkit.broadcastMessage(Poll.tutorialMessage()); - } - } -} diff --git a/PGM/src/main/java/tc/oc/pgm/match/MatchManager.java b/PGM/src/main/java/tc/oc/pgm/match/MatchManager.java index ff95d2f35..f8054f79b 100644 --- a/PGM/src/main/java/tc/oc/pgm/match/MatchManager.java +++ b/PGM/src/main/java/tc/oc/pgm/match/MatchManager.java @@ -23,13 +23,13 @@ import tc.oc.api.minecraft.MinecraftService; import tc.oc.api.util.Permissions; import tc.oc.commons.core.logging.Loggers; -import tc.oc.pgm.PGM; import tc.oc.pgm.development.MapErrorTracker; import tc.oc.pgm.events.SetNextMapEvent; import tc.oc.pgm.map.MapLibrary; import tc.oc.pgm.map.MapLoader; import tc.oc.pgm.map.MapNotFoundException; import tc.oc.pgm.map.PGMMap; +import tc.oc.pgm.polls.PollBlacklist; import tc.oc.pgm.rotation.FileRotationProviderFactory; import tc.oc.pgm.rotation.RotationManager; import tc.oc.pgm.rotation.RotationState; @@ -50,6 +50,7 @@ public class MatchManager implements MatchFinder { private final EventBus eventBus; private final MatchLoader matchLoader; private final MinecraftService minecraftService; + private final PollBlacklist pollBlacklist; private @Nullable RotationManager rotationManager; /** Custom set next map. */ @@ -67,7 +68,8 @@ public class MatchManager implements MatchFinder { FileRotationProviderFactory fileRotationProviderFactory, EventBus eventBus, MatchLoader matchLoader, - MinecraftService minecraftService) throws MapNotFoundException { + MinecraftService minecraftService, + PollBlacklist pollBlacklist) throws MapNotFoundException { this.pluginDataFolder = pluginDataFolder; this.mapErrorTracker = mapErrorTracker; @@ -79,6 +81,7 @@ public class MatchManager implements MatchFinder { this.eventBus = eventBus; this.matchLoader = matchLoader; this.minecraftService = minecraftService; + this.pollBlacklist = pollBlacklist; } @Override @@ -118,7 +121,7 @@ public boolean loadRotations() { public Set loadMapsAndRotations() throws MapNotFoundException { Set maps = loadNewMaps(); loadRotations(); - PGM.getPollableMaps().loadPollableMaps(); + pollBlacklist.loadPollBlacklist(); return maps; } diff --git a/PGM/src/main/java/tc/oc/pgm/polls/Poll.java b/PGM/src/main/java/tc/oc/pgm/polls/Poll.java index 5c827cb1f..687e99399 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/Poll.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/Poll.java @@ -1,31 +1,32 @@ package tc.oc.pgm.polls; +import com.google.inject.Inject; +import net.md_5.bungee.api.ChatColor; +import tc.oc.commons.core.chat.Audiences; + import java.util.HashMap; import java.util.Map; -import org.bukkit.ChatColor; -import org.bukkit.Server; - public abstract class Poll implements Runnable { - protected final Map votes = new HashMap(); - protected final long startTime = System.currentTimeMillis(); - protected final PollManager pollManager; - protected final Server server; - protected String initiator; - protected int timeLeftSeconds; public static String boldAqua = ChatColor.BOLD + "" + ChatColor.AQUA; public static String normalize = ChatColor.RESET + "" + ChatColor.DARK_AQUA; - public static String seperator = ChatColor.RESET + " | "; + public static String separator = ChatColor.RESET + " | "; - public Poll(PollManager pollManager, Server server, String initiator) { + protected final PollManager pollManager; + protected final String initiator; + protected final Audiences audiences; + + @Inject public Poll(PollManager pollManager, String initiator, Audiences audiences) { this.pollManager = pollManager; - this.server = server; this.initiator = initiator; + this.audiences = audiences; this.voteFor(initiator); - timeLeftSeconds = 60; } + protected final Map votes = new HashMap(); + protected int timeLeftSeconds = 60; + public String getInitiator() { return this.initiator; } @@ -50,9 +51,6 @@ private int getVotes(boolean filterValue) { return total; } - public long getStartTime() { - return this.startTime; - } public int getTimeLeftSeconds() { return timeLeftSeconds; @@ -73,8 +71,8 @@ public boolean isSuccessful() { public abstract String getDescriptionMessage(); public String getStatusMessage() { - String message = boldAqua + "[Poll] " + this.getTimeLeftSeconds() + normalize + " seconds left" + seperator; - message += getActionString() + seperator + formatForAgainst(); + String message = boldAqua + "[Poll] " + this.getTimeLeftSeconds() + normalize + " seconds left" + separator; + message += getActionString() + separator + formatForAgainst(); return message; } @@ -105,7 +103,7 @@ public void run() { if(timeLeftSeconds <= 0) { this.pollManager.endPoll(PollEndReason.Completed); } else if(timeLeftSeconds % 15 == 0 || (timeLeftSeconds < 15 && timeLeftSeconds % 5 == 0)) { - this.server.broadcastMessage(this.getStatusMessage()); + this.audiences.localServer().sendMessage(this.getStatusMessage()); } this.decrementTimeLeft(); } diff --git a/PGM/src/main/java/tc/oc/pgm/pollablemaps/PollableMaps.java b/PGM/src/main/java/tc/oc/pgm/polls/PollBlacklist.java similarity index 53% rename from PGM/src/main/java/tc/oc/pgm/pollablemaps/PollableMaps.java rename to PGM/src/main/java/tc/oc/pgm/polls/PollBlacklist.java index 77242d5d9..6d3eaeda3 100644 --- a/PGM/src/main/java/tc/oc/pgm/pollablemaps/PollableMaps.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/PollBlacklist.java @@ -1,9 +1,13 @@ -package tc.oc.pgm.pollablemaps; +package tc.oc.pgm.polls; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableList; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import tc.oc.commons.core.plugin.PluginFacet; import tc.oc.pgm.Config; import tc.oc.pgm.PGM; +import tc.oc.pgm.map.MapLibrary; import tc.oc.pgm.map.PGMMap; import java.io.IOException; @@ -13,27 +17,30 @@ import java.util.List; import java.util.Optional; -public class PollableMaps { +@Singleton +public class PollBlacklist implements PluginFacet { - private List maps; + private List blacklistedMaps = new ArrayList<>(); - public PollableMaps() { - maps = new ArrayList(); - loadPollableMaps(); + private final MapLibrary mapLibrary; + + @Inject PollBlacklist(MapLibrary mapLibrary) { + this.mapLibrary = mapLibrary; } - public List getMaps() { - return maps; + @Override + public void enable() { + loadPollBlacklist(); } - public void loadPollableMaps() { + public void loadPollBlacklist() { Path filepath = Config.Poll.getPollAbleMapPath(); if (filepath == null) return; List lines = null; try { lines = Files.readAllLines(filepath, Charsets.UTF_8); } catch (IOException e) { - PGM.get().getLogger().severe("Error in reading pollable maps from file!"); + PGM.get().getLogger().severe("Error in reading poll blacklist from file!"); } if (lines == null) return; ImmutableList.Builder maps = ImmutableList.builder(); @@ -43,18 +50,18 @@ public void loadPollableMaps() { continue; } - Optional map = PGM.get().getMapLibrary().getMapByNameOrId(line); + Optional map = mapLibrary.getMapByNameOrId(line); if(map.isPresent()) { maps.add(map.get()); } else { - PGM.get().getMapLibrary().getLogger().severe("Unknown map '" + line + mapLibrary.getLogger().severe("Unknown map '" + line + "' when parsing " + filepath.toString()); } } - this.maps = maps.build(); + this.blacklistedMaps = maps.build(); } - public boolean isAllowed(PGMMap map) { - return !maps.contains(map); + public boolean isBlacklisted(PGMMap map) { + return blacklistedMaps.contains(map); } } diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollCustom.java b/PGM/src/main/java/tc/oc/pgm/polls/PollCustom.java deleted file mode 100644 index 4b52999f6..000000000 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollCustom.java +++ /dev/null @@ -1,28 +0,0 @@ -package tc.oc.pgm.polls; - -import org.bukkit.Server; - -public class PollCustom extends Poll { - - private String text; - - public PollCustom(PollManager pollManager, Server server, String initiator, String text) { - super(pollManager, server, initiator); - this.text = text; - } - - @Override - public void executeAction() { - //I do nothing - } - - @Override - public String getActionString() { - return boldAqua + text.substring(0, 1).toUpperCase() + text.substring(1); - } - - @Override - public String getDescriptionMessage() { - return boldAqua + text; - } -} \ No newline at end of file diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollKick.java b/PGM/src/main/java/tc/oc/pgm/polls/PollKick.java deleted file mode 100644 index a58d4b9a4..000000000 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollKick.java +++ /dev/null @@ -1,31 +0,0 @@ -package tc.oc.pgm.polls; - -import org.bukkit.ChatColor; -import org.bukkit.Server; -import org.bukkit.entity.Player; - -public class PollKick extends Poll { - private final String player; - - public PollKick(PollManager pollManager, Server server, String initiator, String player) { - super(pollManager, server, initiator); - this.player = player; - } - - @Override - public void executeAction() { - Player player = this.server.getPlayerExact(this.player); - if(player != null) player.kickPlayer(ChatColor.DARK_RED + "You were poll-kicked."); - this.server.broadcastMessage(ChatColor.RED + this.player + ChatColor.YELLOW + " has been kicked."); - } - - @Override - public String getActionString() { - return normalize + "Kick: " + boldAqua + this.player; - } - - @Override - public String getDescriptionMessage() { - return "to kick " + boldAqua + this.player; - } -} diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollListener.java b/PGM/src/main/java/tc/oc/pgm/polls/PollListener.java index cbd0e029b..358c07187 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollListener.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/PollListener.java @@ -1,33 +1,34 @@ package tc.oc.pgm.polls; +import com.google.inject.Inject; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import tc.oc.pgm.match.Match; -import tc.oc.pgm.match.MatchManager; +import tc.oc.commons.core.chat.Audience; +import tc.oc.commons.core.chat.Audiences; +import tc.oc.commons.core.plugin.PluginFacet; +import tc.oc.pgm.polls.event.PollEndEvent; -public class PollListener implements Listener { - @SuppressWarnings("unused") - private final PollManager pollManager; - private final MatchManager mm; +public class PollListener implements PluginFacet, Listener { - public PollListener(PollManager pollManager, MatchManager mm) { - this.pollManager = pollManager; - this.mm = mm; + private final Audiences audiences; + + @Inject PollListener(Audiences audiences) { + this.audiences = audiences; } @EventHandler public void onPollEnd(PollEndEvent event) { if(event.getReason() == PollEndReason.Completed) { - Match match = this.mm.getCurrentMatch(); + Audience audience = audiences.localServer(); if(event.getPoll().isSuccessful()) { - match.sendMessage(Poll.normalize + "The poll " + event.getPoll().getDescriptionMessage() - + Poll.normalize + " has succeeded" + Poll.seperator); - match.sendMessage(event.getPoll().formatForAgainst()); + audience.sendMessage(Poll.normalize + "The poll " + event.getPoll().getDescriptionMessage() + + Poll.normalize + " has succeeded" + Poll.separator); + audience.sendMessage(event.getPoll().formatForAgainst()); event.getPoll().executeAction(); } else { - match.sendMessage(Poll.normalize + "The poll " + event.getPoll().getDescriptionMessage() - + Poll.normalize + " has failed" + Poll.seperator); - match.sendMessage(event.getPoll().formatForAgainst()); + audience.sendMessage(Poll.normalize + "The poll " + event.getPoll().getDescriptionMessage() + + Poll.normalize + " has failed" + Poll.separator); + audience.sendMessage(event.getPoll().formatForAgainst()); } } } diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollManager.java b/PGM/src/main/java/tc/oc/pgm/polls/PollManager.java index 0bd8a0873..71c118b8f 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollManager.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/PollManager.java @@ -1,58 +1,63 @@ package tc.oc.pgm.polls; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginManager; -import org.bukkit.scheduler.BukkitScheduler; - -public class PollManager { - private final Plugin parent; - private final BukkitScheduler scheduler; - private final PluginManager pm; - - private Poll poll = null; - private int pollTaskId = -1; - - public PollManager(Plugin parent) { - this.parent = parent; - this.scheduler = parent.getServer().getScheduler(); - this.pm = parent.getServer().getPluginManager(); +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.sk89q.minecraft.util.commands.CommandException; +import org.bukkit.Bukkit; +import org.bukkit.event.EventBus; +import tc.oc.commons.core.chat.Audiences; +import tc.oc.commons.core.commands.TranslatableCommandException; +import tc.oc.commons.core.plugin.PluginFacet; +import tc.oc.commons.core.scheduler.Scheduler; +import tc.oc.commons.core.scheduler.Task; +import tc.oc.pgm.polls.event.PollEndEvent; +import tc.oc.pgm.polls.event.PollStartEvent; + +import java.time.Duration; + +@Singleton +public class PollManager implements PluginFacet { + + private final Scheduler scheduler; + private final EventBus eventBus; + private final Audiences audiences; + + @Inject + PollManager(Scheduler scheduler, EventBus eventBus, Audiences audiences) { + this.scheduler = scheduler; + this.eventBus = eventBus; + this.audiences = audiences; } - /** - * Gets the current poll if there is one running. - * @return Current poll or null. - */ + private Poll currentPoll = null; + private Task task = null; + public Poll getPoll() { - return this.poll; + return currentPoll; } - /** - * Indicates whether or not a poll is currently running. - */ public boolean isPollRunning() { - return this.poll != null; + return this.currentPoll != null; } - /** - * Starts a new poll specified by the poll object. - */ - public void startPoll(Poll poll) { - if(!this.isPollRunning()) { - this.pollTaskId = this.scheduler.scheduleSyncRepeatingTask(this.parent, poll, 0, 5*20); - this.poll = poll; - this.pm.callEvent(new PollStartEvent(poll)); + public void startPoll(Poll poll) throws CommandException { + if(!isPollRunning()) { + task = scheduler.createRepeatingTask(Duration.ZERO, Duration.ofSeconds(5), poll); + currentPoll = poll; + eventBus.callEvent(new PollStartEvent(poll)); + audiences.localServer().sendMessage(Poll.boldAqua + poll.getInitiator() + Poll.normalize + " has started a poll " + poll.getDescriptionMessage()); + Bukkit.broadcastMessage(Poll.tutorialMessage()); + } else { + throw new TranslatableCommandException("poll.already.running"); } } - /** - * Ends the poll with a specified reason. - */ public void endPoll(PollEndReason reason) { if(this.isPollRunning()) { - this.pm.callEvent(new PollEndEvent(this.poll, reason)); - this.scheduler.cancelTask(this.pollTaskId); - this.pollTaskId = -1; - this.poll = null; + eventBus.callEvent(new PollEndEvent(this.currentPoll, reason)); + task.cancel(); + task = null; + currentPoll = null; } } } diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollManifest.java b/PGM/src/main/java/tc/oc/pgm/polls/PollManifest.java new file mode 100644 index 000000000..c86e2b2f2 --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/polls/PollManifest.java @@ -0,0 +1,29 @@ +package tc.oc.pgm.polls; + +import com.google.inject.assistedinject.FactoryModuleBuilder; +import tc.oc.commons.core.inject.HybridManifest; +import tc.oc.commons.core.plugin.PluginFacetBinder; +import tc.oc.pgm.polls.commands.PollCommands; +import tc.oc.pgm.polls.types.PollCustom; +import tc.oc.pgm.polls.types.PollKick; +import tc.oc.pgm.polls.types.PollMutation; +import tc.oc.pgm.polls.types.PollNextMap; + +public class PollManifest extends HybridManifest { + + @Override + protected void configure() { + + final FactoryModuleBuilder fmb = new FactoryModuleBuilder(); + install(fmb.build(PollCustom.Factory.class)); + install(fmb.build(PollKick.Factory.class)); + install(fmb.build(PollNextMap.Factory.class)); + install(fmb.build(PollMutation.Factory.class)); + + final PluginFacetBinder facets = new PluginFacetBinder(binder()); + facets.register(PollCommands.class); + facets.register(PollManager.class); + facets.register(PollListener.class); + facets.register(PollBlacklist.class); + } +} diff --git a/PGM/src/main/java/tc/oc/pgm/polls/commands/PollCommands.java b/PGM/src/main/java/tc/oc/pgm/polls/commands/PollCommands.java new file mode 100644 index 000000000..8e9b6ba31 --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/polls/commands/PollCommands.java @@ -0,0 +1,87 @@ +package tc.oc.pgm.polls.commands; + +import com.sk89q.minecraft.util.commands.Command; +import com.sk89q.minecraft.util.commands.CommandContext; +import com.sk89q.minecraft.util.commands.CommandException; +import com.sk89q.minecraft.util.commands.CommandPermissions; +import com.sk89q.minecraft.util.commands.NestedCommand; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import tc.oc.commons.bukkit.chat.PlayerComponent; +import tc.oc.commons.bukkit.nick.IdentityProvider; +import tc.oc.commons.core.chat.Audiences; +import tc.oc.commons.core.chat.Component; +import tc.oc.commons.core.commands.Commands; +import tc.oc.commons.core.commands.TranslatableCommandException; +import tc.oc.pgm.polls.Poll; +import tc.oc.pgm.polls.PollEndReason; +import tc.oc.pgm.polls.PollManager; + +import javax.inject.Inject; + +public class PollCommands implements Commands { + + private final PollManager pollManager; + private final IdentityProvider identityProvider; + private final Audiences audiences; + + @Inject PollCommands(PollManager pollManager, IdentityProvider identityProvider, Audiences audiences){ + this.pollManager = pollManager; + this.identityProvider = identityProvider; + this.audiences = audiences; + } + + @Command( + aliases = {"poll"}, + desc = "Poll commands", + min = 1, + max = -1 + ) + @NestedCommand({PollSubCommands.class}) + public void pollCommand() { + } + + @Command( + aliases = {"vote"}, + desc = "Vote in a running poll.", + usage = "[yes|no]", + min = 1, + max = 1 + ) + @CommandPermissions("poll.vote") + public void vote(CommandContext args, CommandSender sender) throws CommandException { + Player voter = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); + Poll currentPoll = pollManager.getPoll(); + if(currentPoll != null) { + if(args.getString(0).equalsIgnoreCase("yes")) { + currentPoll.voteFor(voter.getName()); + sender.sendMessage(new Component(ChatColor.GREEN).translate("poll.vote.for")); + } else if (args.getString(0).equalsIgnoreCase("no")) { + currentPoll.voteAgainst(voter.getName()); + sender.sendMessage(new Component(ChatColor.RED).translate("poll.vote.against")); + } else { + throw new TranslatableCommandException("poll.vote.value.invalid"); + } + } else { + throw new TranslatableCommandException("poll.noPollRunning"); + } + } + + @Command( + aliases = {"veto"}, + desc = "Veto the current poll.", + min = 0, + max = 0 + ) + @CommandPermissions("poll.veto") + public void veto(CommandContext args, CommandSender sender) throws CommandException { + if(pollManager.isPollRunning()) { + pollManager.endPoll(PollEndReason.Cancelled); + audiences.localServer().sendMessage(new Component(ChatColor.RED).translate("poll.veto", new PlayerComponent(identityProvider.currentIdentity(sender)))); + } else { + throw new TranslatableCommandException("poll.noPollRunning"); + } + } + +} diff --git a/PGM/src/main/java/tc/oc/pgm/polls/commands/PollSubCommands.java b/PGM/src/main/java/tc/oc/pgm/polls/commands/PollSubCommands.java new file mode 100644 index 000000000..06fe8188a --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/polls/commands/PollSubCommands.java @@ -0,0 +1,183 @@ +package tc.oc.pgm.polls.commands; + +import com.google.common.collect.Sets; +import com.sk89q.minecraft.util.commands.Command; +import com.sk89q.minecraft.util.commands.CommandContext; +import com.sk89q.minecraft.util.commands.CommandException; +import com.sk89q.minecraft.util.commands.CommandPermissions; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import tc.oc.commons.bukkit.tokens.TokenUtil; +import tc.oc.commons.core.commands.TranslatableCommandException; +import tc.oc.commons.core.formatting.StringUtils; +import tc.oc.commons.core.restart.RestartManager; +import tc.oc.pgm.Config; +import tc.oc.pgm.PGM; +import tc.oc.pgm.commands.CommandUtils; +import tc.oc.pgm.map.PGMMap; +import tc.oc.pgm.mutation.Mutation; +import tc.oc.pgm.mutation.MutationQueue; +import tc.oc.pgm.mutation.command.MutationCommands; +import tc.oc.pgm.polls.PollBlacklist; +import tc.oc.pgm.polls.types.PollCustom; +import tc.oc.pgm.polls.types.PollKick; +import tc.oc.pgm.polls.PollManager; +import tc.oc.pgm.polls.types.PollMutation; +import tc.oc.pgm.polls.types.PollNextMap; + +import javax.inject.Inject; +import java.util.Collection; +import java.util.List; + +public class PollSubCommands { + + private final RestartManager restartManager; + private final MutationQueue mutationQueue; + private final PollManager pollManager; + private final PollCustom.Factory pollCustomFactory; + private final PollNextMap.Factory pollMapFactory; + private final PollMutation.Factory pollMutationFactory; + private final PollKick.Factory pollKickFactory; + private final PollBlacklist pollBlacklist; + + @Inject + PollSubCommands(RestartManager restartManager, + MutationQueue mutationQueue, + PollManager pollManager, + PollCustom.Factory pollCustomFactory, + PollNextMap.Factory pollMapFactory, + PollMutation.Factory pollMutationFactory, + PollKick.Factory pollKickFactory, + PollBlacklist pollBlacklist) { + this.restartManager = restartManager; + this.mutationQueue = mutationQueue; + this.pollManager = pollManager; + this.pollCustomFactory = pollCustomFactory; + this.pollMapFactory = pollMapFactory; + this.pollMutationFactory = pollMutationFactory; + this.pollKickFactory = pollKickFactory; + this.pollBlacklist = pollBlacklist; + } + + + + @Command( + aliases = {"kick"}, + desc = "Start a poll to kick another player.", + usage = "[player]", + min = 1, + max = 1 + ) + @CommandPermissions("poll.kick") + public void pollKick(CommandContext args, CommandSender sender) throws CommandException { + Player initiator = tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender); + Player player = tc.oc.commons.bukkit.commands.CommandUtils.findOnlinePlayer(args, sender, 0); + + if(player.hasPermission("pgm.poll.kick.exempt") && !initiator.hasPermission("pgm.poll.kick.override")) { + throw new TranslatableCommandException("poll.kick.exempt"); + } else { + pollManager.startPoll(pollKickFactory.create(initiator.getName(), player)); + } + } + + @Command( + aliases = {"next"}, + desc = "Start a poll to change the next map.", + usage = "[map name]", + min = 1, + max = -1 + ) + @CommandPermissions("poll.next") + public List pollNext(CommandContext args, CommandSender sender) throws CommandException { + final String mapName = args.argsLength() > 0 ? args.getJoinedStrings(0) : ""; + if(args.getSuggestionContext() != null) { + return CommandUtils.completeMapName(mapName); + } + + if (!Config.Poll.enabled()) { + throw new TranslatableCommandException("poll.disabled"); + } + + if (restartManager.isRestartRequested()) { + throw new TranslatableCommandException("poll.map.restarting"); + } + if (PGM.getMatchManager().hasMapSet()) { + throw new TranslatableCommandException("poll.map.alreadyset"); + } + if (sender instanceof Player) { + Player player = (Player) sender; + if (TokenUtil.getUser(player).maptokens() < 1) { + throw new TranslatableCommandException("tokens.map.fail"); + } + } + + PGMMap nextMap = CommandUtils.getMap(args.getJoinedStrings(0), sender); + + if (pollBlacklist.isBlacklisted(nextMap) && !sender.hasPermission("poll.next.override")) { + throw new TranslatableCommandException("poll.map.notallowed"); + } + + if (PGM.get().getServer().getOnlinePlayers().size() * 4 / 5 > nextMap.getDocument().max_players() && !sender.hasPermission("poll.next.override")) { + throw new TranslatableCommandException("poll.map.toomanyplayers"); + } + + pollManager.startPoll(pollMapFactory.create(sender, nextMap)); + return null; + } + + @Command( + aliases = {"mutation", "mt"}, + desc = "Start a poll to set a mutation", + usage = "[mutation name]", + min = 1, + max = -1 + ) + @CommandPermissions("poll.mutation") + public List pollMutation(CommandContext args, CommandSender sender) throws CommandException { + + if (args.getSuggestionContext() != null) { + Collection availableMutations = Sets.newHashSet(Mutation.values()); + availableMutations.removeAll(mutationQueue.mutations()); + return StringUtils.complete(args.getSuggestionContext().getPrefix(), availableMutations.stream().map(mutation -> mutation.name().toLowerCase())); + } + + if (!Config.Poll.enabled()) { + throw new TranslatableCommandException("poll.disabled"); + } + + if (sender instanceof Player) { + Player player = (Player) sender; + if (TokenUtil.getUser(player).mutationtokens() < 1) { + throw new TranslatableCommandException("tokens.mutation.fail"); + } + } + + String mutationString = args.getString(0); + + Mutation mutation = StringUtils.bestFuzzyMatch(mutationString, Sets.newHashSet(Mutation.values()), 0.9); + if(mutation == null) { + throw new TranslatableCommandException("command.mutation.error.find", mutationString); + } else if(MutationCommands.getInstance().getMutationQueue().mutations().contains(mutation)) { + throw new TranslatableCommandException(true ? "command.mutation.error.enabled" : "command.mutation.error.disabled", mutation.getComponent(net.md_5.bungee.api.ChatColor.RED)); + } else if (!mutation.isPollable() && !sender.hasPermission("poll.mutation.override")) { + throw new TranslatableCommandException("command.mutation.error.illegal", mutationString); + } + + pollManager.startPoll(pollMutationFactory.create(sender, mutation)); + return null; + } + + @Command( + aliases = {"custom"}, + desc = "Start a poll with the supplied text", + usage = "[text...]", + min = 1, + max = -1 + ) + @CommandPermissions("poll.custom") + public void pollCustom(CommandContext args, CommandSender sender) throws CommandException { + String text = args.getJoinedStrings(0); + + pollManager.startPoll(pollCustomFactory.create(text, sender)); + } +} diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollEndEvent.java b/PGM/src/main/java/tc/oc/pgm/polls/event/PollEndEvent.java similarity index 85% rename from PGM/src/main/java/tc/oc/pgm/polls/PollEndEvent.java rename to PGM/src/main/java/tc/oc/pgm/polls/event/PollEndEvent.java index 190dd26d3..17e94e3c5 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollEndEvent.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/event/PollEndEvent.java @@ -1,6 +1,8 @@ -package tc.oc.pgm.polls; +package tc.oc.pgm.polls.event; import org.bukkit.event.HandlerList; +import tc.oc.pgm.polls.Poll; +import tc.oc.pgm.polls.PollEndReason; /** * Called when a poll ends. diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollEvent.java b/PGM/src/main/java/tc/oc/pgm/polls/event/PollEvent.java similarity index 85% rename from PGM/src/main/java/tc/oc/pgm/polls/PollEvent.java rename to PGM/src/main/java/tc/oc/pgm/polls/event/PollEvent.java index 9f4c8ad88..924651094 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollEvent.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/event/PollEvent.java @@ -1,6 +1,7 @@ -package tc.oc.pgm.polls; +package tc.oc.pgm.polls.event; import org.bukkit.event.Event; +import tc.oc.pgm.polls.Poll; /** * Represents an event related to a poll. diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollStartEvent.java b/PGM/src/main/java/tc/oc/pgm/polls/event/PollStartEvent.java similarity index 87% rename from PGM/src/main/java/tc/oc/pgm/polls/PollStartEvent.java rename to PGM/src/main/java/tc/oc/pgm/polls/event/PollStartEvent.java index edd0508f3..787f95ca8 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollStartEvent.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/event/PollStartEvent.java @@ -1,6 +1,7 @@ -package tc.oc.pgm.polls; +package tc.oc.pgm.polls.event; import org.bukkit.event.HandlerList; +import tc.oc.pgm.polls.Poll; /** * Called when a poll first starts. diff --git a/PGM/src/main/java/tc/oc/pgm/polls/types/PollCustom.java b/PGM/src/main/java/tc/oc/pgm/polls/types/PollCustom.java new file mode 100644 index 000000000..26850697c --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/polls/types/PollCustom.java @@ -0,0 +1,37 @@ +package tc.oc.pgm.polls.types; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import org.bukkit.command.CommandSender; +import tc.oc.commons.core.chat.Audiences; +import tc.oc.pgm.polls.Poll; +import tc.oc.pgm.polls.PollManager; + +public class PollCustom extends Poll { + + public interface Factory { + PollCustom create(String text, CommandSender initiator); + } + + private String text; + + @AssistedInject PollCustom(@Assisted String text, @Assisted CommandSender initiator, PollManager pollManager, Audiences audiences) { + super(pollManager, initiator.getName(), audiences); + this.text = text; + } + + @Override + public void executeAction() { + //I do nothing + } + + @Override + public String getActionString() { + return boldAqua + text.substring(0, 1).toUpperCase() + text.substring(1); + } + + @Override + public String getDescriptionMessage() { + return boldAqua + text; + } +} \ No newline at end of file diff --git a/PGM/src/main/java/tc/oc/pgm/polls/types/PollKick.java b/PGM/src/main/java/tc/oc/pgm/polls/types/PollKick.java new file mode 100644 index 000000000..ceae3dd6a --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/polls/types/PollKick.java @@ -0,0 +1,44 @@ +package tc.oc.pgm.polls.types; + +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.entity.Player; +import tc.oc.commons.bukkit.chat.PlayerComponent; +import tc.oc.commons.bukkit.nick.IdentityProvider; +import tc.oc.commons.core.chat.Audiences; +import tc.oc.commons.core.chat.Component; +import tc.oc.pgm.polls.Poll; +import tc.oc.pgm.polls.PollManager; + +public class PollKick extends Poll { + + public interface Factory { + PollKick create(String initiator, Player player); + } + + private final Player player; + private final IdentityProvider identityProvider; + + @AssistedInject PollKick(@Assisted String initiator, @Assisted Player player, PollManager pollManager, Audiences audiences, IdentityProvider identityProvider) { + super(pollManager, initiator, audiences); + this.player = player; + this.identityProvider = identityProvider; + } + + @Override + public void executeAction() { + if(player != null) player.kickPlayer(ChatColor.DARK_RED + "You were poll-kicked."); + audiences.localServer().sendMessage(new Component(ChatColor.DARK_AQUA).translate("poll.kick.success", new PlayerComponent(identityProvider.currentIdentity(player)))); + } + + @Override + public String getActionString() { + return normalize + "Kick: " + boldAqua + this.player; + } + + @Override + public String getDescriptionMessage() { + return "to kick " + boldAqua + this.player; + } +} diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollMutation.java b/PGM/src/main/java/tc/oc/pgm/polls/types/PollMutation.java similarity index 67% rename from PGM/src/main/java/tc/oc/pgm/polls/PollMutation.java rename to PGM/src/main/java/tc/oc/pgm/polls/types/PollMutation.java index 09a90129c..3b8c66a15 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollMutation.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/types/PollMutation.java @@ -1,30 +1,29 @@ -package tc.oc.pgm.polls; +package tc.oc.pgm.polls.types; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; import org.bukkit.Bukkit; -import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.api.docs.User; import tc.oc.commons.bukkit.tokens.TokenUtil; -import tc.oc.pgm.Config; +import tc.oc.commons.core.chat.Audiences; import tc.oc.pgm.mutation.Mutation; -import tc.oc.pgm.mutation.MutationMatchModule; +import tc.oc.pgm.polls.Poll; +import tc.oc.pgm.polls.PollManager; public class PollMutation extends Poll { + public interface Factory { + PollMutation create(CommandSender sender, Mutation mutation); + } + private Mutation mutation; - private CommandSender sender; - private MutationMatchModule module; - private String mutationName; private User user; - public PollMutation(PollManager pollManager, Server server, CommandSender sender, Mutation mutation, - MutationMatchModule module) { - super(pollManager, server, sender.getName()); + @AssistedInject PollMutation(@Assisted CommandSender sender, @Assisted Mutation mutation, PollManager pollManager, Audiences audiences) { + super(pollManager, sender.getName(), audiences); this.mutation = mutation; - this.sender = sender; - this.module = module; - this.mutationName = mutationName; if (sender instanceof Player) { user = TokenUtil.getUser((Player)sender); } diff --git a/PGM/src/main/java/tc/oc/pgm/polls/PollNextMap.java b/PGM/src/main/java/tc/oc/pgm/polls/types/PollNextMap.java similarity index 63% rename from PGM/src/main/java/tc/oc/pgm/polls/PollNextMap.java rename to PGM/src/main/java/tc/oc/pgm/polls/types/PollNextMap.java index cfa28c92a..e7d4287ec 100644 --- a/PGM/src/main/java/tc/oc/pgm/polls/PollNextMap.java +++ b/PGM/src/main/java/tc/oc/pgm/polls/types/PollNextMap.java @@ -1,24 +1,31 @@ -package tc.oc.pgm.polls; +package tc.oc.pgm.polls.types; -import org.bukkit.Server; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.api.docs.User; import tc.oc.commons.bukkit.tokens.TokenUtil; +import tc.oc.commons.core.chat.Audiences; import tc.oc.pgm.map.PGMMap; import tc.oc.pgm.match.MatchManager; +import tc.oc.pgm.polls.Poll; +import tc.oc.pgm.polls.PollManager; public class PollNextMap extends Poll { + + public interface Factory { + PollNextMap create(CommandSender sender, PGMMap nextMap); + } + private final MatchManager mm; private final PGMMap nextMap; - private CommandSender sender; private User user; - public PollNextMap(PollManager pollManager, Server server, CommandSender sender, String initiator, MatchManager mm, PGMMap nextMap) { - super(pollManager, server, initiator); + @AssistedInject PollNextMap(@Assisted CommandSender sender, @Assisted PGMMap nextMap, PollManager pollManager, Audiences audiences, MatchManager mm) { + super(pollManager, sender.getName(), audiences); this.mm = mm; this.nextMap = nextMap; - this.sender = sender; if (sender instanceof Player) { user = TokenUtil.getUser((Player)sender); } diff --git a/PGM/src/main/java/tc/oc/pgm/tokens/gui/MutationConfirmInterface.java b/PGM/src/main/java/tc/oc/pgm/tokens/gui/MutationConfirmInterface.java index 1d70ed3eb..f3fb09b17 100644 --- a/PGM/src/main/java/tc/oc/pgm/tokens/gui/MutationConfirmInterface.java +++ b/PGM/src/main/java/tc/oc/pgm/tokens/gui/MutationConfirmInterface.java @@ -1,19 +1,16 @@ package tc.oc.pgm.tokens.gui; +import com.google.inject.Inject; import com.sk89q.minecraft.util.commands.CommandException; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.commons.bukkit.gui.buttons.Button; import tc.oc.commons.bukkit.gui.interfaces.ChestInterface; import tc.oc.commons.bukkit.util.ItemCreator; -import tc.oc.pgm.PGM; -import tc.oc.pgm.commands.PollCommands; import tc.oc.pgm.mutation.Mutation; -import tc.oc.pgm.mutation.MutationMatchModule; -import tc.oc.pgm.polls.PollMutation; +import tc.oc.pgm.polls.PollManager; +import tc.oc.pgm.polls.types.PollMutation; import java.util.ArrayList; import java.util.List; @@ -21,6 +18,9 @@ public class MutationConfirmInterface extends ChestInterface { private Mutation mutation; + @Inject PollManager pollManager; + @Inject PollMutation.Factory pollMutationFactory; + public MutationConfirmInterface(Player player, Mutation mutation) { super(player, new ArrayList