diff --git a/AreaShop/src/main/java/me/wiefferink/areashop/commands/CommandAreaShop.java b/AreaShop/src/main/java/me/wiefferink/areashop/commands/CommandAreaShop.java index c40b48e..fa4e4c4 100644 --- a/AreaShop/src/main/java/me/wiefferink/areashop/commands/CommandAreaShop.java +++ b/AreaShop/src/main/java/me/wiefferink/areashop/commands/CommandAreaShop.java @@ -1,10 +1,14 @@ package me.wiefferink.areashop.commands; +import javafx.util.Pair; import me.wiefferink.areashop.AreaShop; +import me.wiefferink.interactivemessenger.processing.Message; +import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,7 +19,11 @@ public abstract class CommandAreaShop { AreaShop plugin = AreaShop.getInstance(); - private Map confirmed; + private Map> lastUsed; + + public CommandAreaShop() { + lastUsed = new HashMap<>(); + } /** * Check if this Command instance can execute the given command and arguments. @@ -24,10 +32,7 @@ public abstract class CommandAreaShop { * @return true if it can execute the command, false otherwise */ public boolean canExecute(Command command, String[] args) { - String commandString = command.getName(); - for(String argument : args) { - commandString += " " + argument; - } + String commandString = command.getName() + " " + StringUtils.join(args, " "); if(commandString.length() > getCommandStart().length()) { return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase() + " "); } @@ -65,5 +70,24 @@ public abstract class CommandAreaShop { */ public abstract void execute(CommandSender sender, String[] args); + /** + * Confirm a command. + * @param sender To confirm it for, or send a message to confirm + * @param args Command args + * @param message Message to send when confirmation is required + * @return true if confirmed, false if confirmation is required + */ + public boolean confirm(CommandSender sender, String[] args, Message message) { + String command = "/" + getCommandStart() + " " + StringUtils.join(args, " ", 1, args.length); + long now = System.currentTimeMillis(); + Pair last = lastUsed.get(sender.getName()); + if(last != null && last.getKey().equalsIgnoreCase(command) && last.getValue() > (now - 1000 * 60)) { + return true; + } + + message.prefix().append(Message.fromKey("confirm-yes").replacements(command)).send(sender); + lastUsed.put(sender.getName(), new Pair<>(command, now)); + return false; + } } diff --git a/AreaShop/src/main/java/me/wiefferink/areashop/commands/ImportCommand.java b/AreaShop/src/main/java/me/wiefferink/areashop/commands/ImportCommand.java index 7323ae4..92a59b4 100644 --- a/AreaShop/src/main/java/me/wiefferink/areashop/commands/ImportCommand.java +++ b/AreaShop/src/main/java/me/wiefferink/areashop/commands/ImportCommand.java @@ -1,5 +1,6 @@ package me.wiefferink.areashop.commands; +import me.wiefferink.interactivemessenger.processing.Message; import org.bukkit.command.CommandSender; import java.util.ArrayList; @@ -49,6 +50,10 @@ public class ImportCommand extends CommandAreaShop { return; } + if(!confirm(sender, args, Message.fromKey("import-confirm"))) { + return; + } + ImportJob importJob = new ImportJob(sender); } diff --git a/AreaShop/src/main/resources/lang/EN.yml b/AreaShop/src/main/resources/lang/EN.yml index 7808095..7521193 100644 --- a/AreaShop/src/main/resources/lang/EN.yml +++ b/AreaShop/src/main/resources/lang/EN.yml @@ -47,6 +47,8 @@ landlord: total-maximum: "You can't rent and buy more than %0% region(s) in total (you already have %1% in group '%2%')." +confirm-yes: " [gray]Click to %lang:command|Confirm|%0%|%[gray], or repeat the command." + general-notReady: "AreaShop has not fully loaded yet, please wait." general-noWorld: "You cannot do that, the world of %lang:region% is currently unavailable (world '%world%')." general-noRegion: "You cannot do that, the WorldGuard region is currently unavailable (region %lang:region%)." @@ -545,6 +547,7 @@ import-help: "/as import RegionForSale" import-wrongSource: "Specify from where you want to import data, options: RegionForSale." import-noPluginFolder: "Could not find the %0% folder, are you sure you are importing from the correct source?" import-noWorldsFolder: "There is no 'plugins/RegionForSale/worlds' folder, therefore nothing could be imported." +import-confirm: "Are you sure you want to import all regions from RegionForSale?" import-start: "Starting import of RegionForSale data:" import-doWorld: "[darkgreen][bold]► World %0%:" import-noBukkitWorld: "[red]Could not find world in Bukkit."