From 54bea41d05bf8b6e22119ccf94fe9e95ec906e61 Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Thu, 13 Feb 2014 13:40:23 -0600 Subject: [PATCH] Further work on #3, lots of logic work figured out. The clear command uses the confirmation method now, just need to test it. --- .../com/graywolf336/jail/JailManager.java | 82 +++++++++++++++++++ .../graywolf336/jail/command/JailHandler.java | 12 +-- .../command/subcommands/JailClearCommand.java | 32 ++------ .../subcommands/JailConfirmCommand.java | 52 ++++++++++++ .../graywolf336/jail/enums/LangString.java | 13 ++- src/main/resources/en.yml | 5 ++ 6 files changed, 163 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/graywolf336/jail/command/subcommands/JailConfirmCommand.java diff --git a/src/main/java/com/graywolf336/jail/JailManager.java b/src/main/java/com/graywolf336/jail/JailManager.java index 25bdeff..8e85c27 100644 --- a/src/main/java/com/graywolf336/jail/JailManager.java +++ b/src/main/java/com/graywolf336/jail/JailManager.java @@ -7,9 +7,12 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import com.graywolf336.jail.beans.ConfirmPlayer; import com.graywolf336.jail.beans.CreationPlayer; import com.graywolf336.jail.beans.Jail; import com.graywolf336.jail.beans.Prisoner; +import com.graywolf336.jail.enums.Confirmation; +import com.graywolf336.jail.enums.LangString; import com.graywolf336.jail.steps.CellCreationSteps; import com.graywolf336.jail.steps.JailCreationSteps; @@ -35,6 +38,7 @@ public class JailManager { private HashMap jails; private HashMap jailCreators; private HashMap cellCreators; + private HashMap confirms; private JailCreationSteps jcs; private CellCreationSteps ccs; @@ -43,6 +47,7 @@ public class JailManager { this.jails = new HashMap(); this.jailCreators = new HashMap(); this.cellCreators = new HashMap(); + this.confirms = new HashMap(); this.jcs = new JailCreationSteps(); this.ccs = new CellCreationSteps(); } @@ -213,6 +218,51 @@ public class JailManager { } } + /** + * Clears a {@link Jail} of all its prisoners if the jail is provided, otherwise it releases all the prisoners in all the jails. + * + * @param jail The name of the jail to release the prisoners in, null if wanting to clear all. + * @return The resulting message to be sent to the caller of this method. + */ + public String clearJailOfPrisoners(String jail) { + //If they don't pass in a jail name, clear all the jails + if(jail != null) { + Jail j = getJail(jail); + + if(j != null) { + for(Prisoner p : j.getAllPrisoners()) { + getPlugin().getPrisonerManager().releasePrisoner(getPlugin().getServer().getPlayerExact(p.getName()), p); + } + + return getPlugin().getJailIO().getLanguageString(LangString.PRISONERSCLEARED, j.getName()); + }else { + return getPlugin().getJailIO().getLanguageString(LangString.NOJAIL, jail); + } + }else { + return clearAllJailsOfAllPrisoners(); + } + } + + /** + * Clears all the {@link Jail jails} of prisoners by releasing them. + * + * @return The resulting message to be sent to the caller of this method. + */ + public String clearAllJailsOfAllPrisoners() { + //No name of a jail has been passed, so release all of the prisoners in all the jails + if(getJails().size() == 0) { + return getPlugin().getJailIO().getLanguageString(LangString.NOJAILS); + }else { + for(Jail j : getJails()) { + for(Prisoner p : j.getAllPrisoners()) { + getPlugin().getPrisonerManager().releasePrisoner(getPlugin().getServer().getPlayerExact(p.getName()), p); + } + } + + return getPlugin().getJailIO().getLanguageString(LangString.PRISONERSCLEARED, getPlugin().getJailIO().getLanguageString(LangString.ALLJAILS)); + } + } + /** * Returns whether or not the player is creating a jail or a cell. * @@ -342,4 +392,36 @@ public class JailManager { public CellCreationSteps getCellCreationSteps() { return this.ccs; } + + /** Adds something to the confirming list. */ + public void addConfirming(String name, ConfirmPlayer confirmer) { + this.confirms.put(name, confirmer); + } + + /** Removes a name from the confirming list. */ + public void removeConfirming(String name) { + this.confirms.remove(name); + } + + /** Checks if the given name is confirming something. */ + public boolean isConfirming(String name) { + if(this.confirmingHasExpired(name)) this.removeConfirming(name); + + return this.confirms.containsKey(name); + } + + /** Returns true if the confirmation has expired, false if it is still valid. */ + public boolean confirmingHasExpired(String name) { + return this.confirms.get(name).getExpiryTime() <= (System.currentTimeMillis() + 5000L); + } + + /** Returns the original arguments for what we are confirming. */ + public String[] getOriginalArgs(String name) { + return this.confirms.get(name).getArguments(); + } + + /** Returns what the given name is confirming. */ + public Confirmation getWhatIsConfirming(String name) { + return this.confirms.get(name).getConfirming(); + } } diff --git a/src/main/java/com/graywolf336/jail/command/JailHandler.java b/src/main/java/com/graywolf336/jail/command/JailHandler.java index 59fb9d6..cb5cafc 100644 --- a/src/main/java/com/graywolf336/jail/command/JailHandler.java +++ b/src/main/java/com/graywolf336/jail/command/JailHandler.java @@ -23,7 +23,6 @@ import com.graywolf336.jail.command.subcommands.JailListCellsCommand; import com.graywolf336.jail.command.subcommands.JailListCommand; import com.graywolf336.jail.command.subcommands.JailMuteCommand; import com.graywolf336.jail.command.subcommands.JailReloadCommand; -import com.graywolf336.jail.command.subcommands.JailRemoveCellCommand; import com.graywolf336.jail.command.subcommands.JailStatusCommand; import com.graywolf336.jail.command.subcommands.JailStopCommand; import com.graywolf336.jail.command.subcommands.JailTeleInCommand; @@ -94,10 +93,12 @@ public class JailHandler { CommandInfo i = c.getClass().getAnnotation(CommandInfo.class); // First, let's check if the sender has permission for the command. - if(!sender.hasPermission(i.permission())) { - jailmanager.getPlugin().debug("Sender has no permission."); - sender.sendMessage(jailmanager.getPlugin().getJailIO().getLanguageString(LangString.NOPERMISSION)); - return true; + if(!i.permission().isEmpty()) { + if(!sender.hasPermission(i.permission())) { + jailmanager.getPlugin().debug("Sender has no permission."); + sender.sendMessage(jailmanager.getPlugin().getJailIO().getLanguageString(LangString.NOPERMISSION)); + return true; + } } // Next, let's check if we need a player and then if the sender is actually a player @@ -179,7 +180,6 @@ public class JailHandler { load(JailListCommand.class); load(JailMuteCommand.class); load(JailReloadCommand.class); - load(JailRemoveCellCommand.class); load(JailStatusCommand.class); load(JailStopCommand.class); load(JailTeleInCommand.class); diff --git a/src/main/java/com/graywolf336/jail/command/subcommands/JailClearCommand.java b/src/main/java/com/graywolf336/jail/command/subcommands/JailClearCommand.java index 97d2a56..3e185c3 100644 --- a/src/main/java/com/graywolf336/jail/command/subcommands/JailClearCommand.java +++ b/src/main/java/com/graywolf336/jail/command/subcommands/JailClearCommand.java @@ -3,10 +3,10 @@ package com.graywolf336.jail.command.subcommands; import org.bukkit.command.CommandSender; import com.graywolf336.jail.JailManager; -import com.graywolf336.jail.beans.Jail; -import com.graywolf336.jail.beans.Prisoner; +import com.graywolf336.jail.beans.ConfirmPlayer; import com.graywolf336.jail.command.Command; import com.graywolf336.jail.command.CommandInfo; +import com.graywolf336.jail.enums.Confirmation; import com.graywolf336.jail.enums.LangString; @CommandInfo( @@ -21,31 +21,11 @@ public class JailClearCommand implements Command { // If Jail is specified unjails all the prisoners from that Jail (new feature) otherwise it unjails all the prisoners from all the jails public boolean execute(JailManager jm, CommandSender sender, String... args) { - if(args.length == 2) { - Jail j = jm.getJail(args[1]); - - if(j != null) { - for(Prisoner p : j.getAllPrisoners()) { - jm.getPlugin().getPrisonerManager().releasePrisoner(jm.getPlugin().getServer().getPlayerExact(p.getName()), p); - } - - sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.PRISONERSCLEARED, j.getName())); - }else { - sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.NOJAIL, args[1])); - } + if(jm.isConfirming(sender.getName())) { + sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.ALREADY)); }else { - if(jm.getJails().size() == 0) { - sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.NOJAILS)); - }else { - for(Jail j : jm.getJails()) { - for(Prisoner p : j.getAllPrisoners()) { - jm.getPlugin().getPrisonerManager().releasePrisoner(jm.getPlugin().getServer().getPlayerExact(p.getName()), p); - } - } - - sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.PRISONERSCLEARED, - jm.getPlugin().getJailIO().getLanguageString(LangString.ALLJAILS))); - } + jm.addConfirming(sender.getName(), new ConfirmPlayer(sender.getName(), args, Confirmation.CLEAR)); + sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.START)); } return true; diff --git a/src/main/java/com/graywolf336/jail/command/subcommands/JailConfirmCommand.java b/src/main/java/com/graywolf336/jail/command/subcommands/JailConfirmCommand.java new file mode 100644 index 0000000..bbc5cb8 --- /dev/null +++ b/src/main/java/com/graywolf336/jail/command/subcommands/JailConfirmCommand.java @@ -0,0 +1,52 @@ +package com.graywolf336.jail.command.subcommands; + +import org.bukkit.command.CommandSender; + +import com.graywolf336.jail.JailManager; +import com.graywolf336.jail.command.Command; +import com.graywolf336.jail.command.CommandInfo; +import com.graywolf336.jail.enums.LangString; + +@CommandInfo( + maxArgs = 0, + minimumArgs = 0, + needsPlayer = false, + pattern = "confirm|con", + permission = "", + usage = "/jail confirm" + ) +public class JailConfirmCommand implements Command{ + + public boolean execute(JailManager jm, CommandSender sender, String... args) { + //Check if the sender is actually confirming something. + if(jm.isConfirming(sender.getName())) { + if(jm.confirmingHasExpired(sender.getName())) { + //Their confirmation time frame has closed + sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.EXPIRED)); + }else { + switch(jm.getWhatIsConfirming(sender.getName())) { + case CLEAR: + //Copy the original arguments for easy access + String[] cArgs = jm.getOriginalArgs(sender.getName()); + //Clear a jail if the args length is two, else send null + String msg = jm.clearJailOfPrisoners(cArgs.length == 2 ? cArgs[1] : null); + //Send the message we got back + sender.sendMessage(msg); + //Remove them from confirming so they can't do it again + jm.removeConfirming(sender.getName()); + break; + default: + sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.NOTHING)); + jm.removeConfirming(sender.getName()); + break; + } + } + }else { + //They aren't confirming anything right now. + sender.sendMessage(jm.getPlugin().getJailIO().getLanguageString(LangString.NOTHING)); + } + + return true; + } + +} diff --git a/src/main/java/com/graywolf336/jail/enums/LangString.java b/src/main/java/com/graywolf336/jail/enums/LangString.java index 5b9b427..5092b08 100644 --- a/src/main/java/com/graywolf336/jail/enums/LangString.java +++ b/src/main/java/com/graywolf336/jail/enums/LangString.java @@ -145,7 +145,18 @@ public enum LangString { /** The simple word transferring to be put in other parts. */ TRANSFERRING ("general"), /** The message sent whenever someone does a command we don't know. */ - UNKNOWNCOMMAND ("general"); + UNKNOWNCOMMAND ("general"), + + //Confirming action messages. + + /** The message sent when the sender is already confirming something. */ + ALREADY ("confirm"), + /** The message sent when their confirmation has expired. */ + EXPIRED ("confirm"), + /** The message sent to the sender when they tried to confirm something but don't have anything to confirm. */ + NOTHING ("confirm"), + /** The message sent to the sender when they type something and need to confirm it. */ + START ("confirm"); private String section, name; diff --git a/src/main/resources/en.yml b/src/main/resources/en.yml index 147806a..d1a1ae3 100644 --- a/src/main/resources/en.yml +++ b/src/main/resources/en.yml @@ -7,6 +7,11 @@ language: interactionblocks: 'interacting with a block' interactionitems: 'interacting with an item' moving: 'trying to escape' + confirm: + already: "&cYou are already confirming something else, please type '&b/jail confirm&c' to confirm it." + expired: '&cYour confirmation expired already, retype what you are trying to confirm.' + nothing: '&cYou are not confirming anything.' + start: "&cPlease type '&b/jail confirm&c' to confirm we should continue." general: alljails: 'all the jails' cellremovalunsuccessful: '&cThe removal of cell %0% from jail %1% was unsuccessful because there is a prisoner in there still. Release or transfer before trying to remove the cell again.'