Started a refactoring for the commands

This commit is contained in:
Poslovitch 2017-07-30 19:57:49 +02:00
parent 17c7099cbb
commit 158c7b3465
5 changed files with 222 additions and 214 deletions

View File

@ -1,19 +1,12 @@
package us.tastybento.bskyblock; package us.tastybento.bskyblock;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Locale;
import java.util.UUID;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import us.tastybento.bskyblock.commands.AdminCommand;
import us.tastybento.bskyblock.commands.IslandCommand; import us.tastybento.bskyblock.commands.IslandCommand;
import us.tastybento.bskyblock.config.BSBLocale; import us.tastybento.bskyblock.config.BSBLocale;
import us.tastybento.bskyblock.config.PluginConfig; import us.tastybento.bskyblock.config.PluginConfig;
@ -33,6 +26,13 @@ import us.tastybento.bskyblock.schematics.SchematicsMgr;
import us.tastybento.bskyblock.util.FileLister; import us.tastybento.bskyblock.util.FileLister;
import us.tastybento.bskyblock.util.VaultHelper; import us.tastybento.bskyblock.util.VaultHelper;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Locale;
import java.util.UUID;
/** /**
* Main BSkyBlock class - provides an island minigame in the sky * Main BSkyBlock class - provides an island minigame in the sky
* @author Tastybento * @author Tastybento
@ -107,11 +107,12 @@ public class BSkyBlock extends JavaPlugin{
}; };
schematicsManager = new SchematicsMgr(plugin); schematicsManager = new SchematicsMgr(plugin);
getCommand("island").setExecutor(new IslandCommand(plugin));
Settings.defaultLanguage = "en-US"; Settings.defaultLanguage = "en-US";
loadLocales(); loadLocales();
new IslandCommand(BSkyBlock.this);
new AdminCommand(BSkyBlock.this);
// Register Listeners // Register Listeners
registerListeners(); registerListeners();
/* /*

View File

@ -1,17 +1,20 @@
package us.tastybento.bskyblock.commands; package us.tastybento.bskyblock.commands;
import java.util.List;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.config.Settings;
import java.util.List;
public class AdminCommand extends BSBCommand{ public class AdminCommand extends BSBCommand{
BSkyBlock plugin; BSkyBlock plugin;
public AdminCommand(BSkyBlock plugin) { public AdminCommand(BSkyBlock plugin) {
super(plugin, true); super(plugin, Settings.ADMINCOMMAND, true);
plugin.getCommand(Settings.ADMINCOMMAND).setExecutor(this);
plugin.getCommand(Settings.ADMINCOMMAND).setTabCompleter(this);
this.plugin = plugin;
} }
@Override @Override
@ -20,24 +23,24 @@ public class AdminCommand extends BSBCommand{
registerArgument(new String[] {"delete"}, new CommandArgumentHandler() { registerArgument(new String[] {"delete"}, new CommandArgumentHandler() {
@Override @Override
public boolean canExecute(CommandSender sender, String label, String[] args) { public boolean canExecute(CommandSender sender, String[] args) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return true; return true;
} }
@Override @Override
public void onExecute(CommandSender sender, String label, String[] args) { public void onExecute(CommandSender sender, String[] args) {
} }
@Override @Override
public List<String> onTabComplete(CommandSender sender, String label, String[] args) { public List<String> onTabComplete(CommandSender sender, String[] args) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public String[] getHelp(CommandSender sender, String label){ public String[] getHelp(CommandSender sender){
return new String[] {null, plugin.getLocale(sender).get("help.admin.delete")}; return new String[] {null, plugin.getLocale(sender).get("help.admin.delete")};
} }
}); });
@ -45,13 +48,13 @@ public class AdminCommand extends BSBCommand{
} }
@Override @Override
public boolean canExecute(CommandSender sender, String label) { public boolean canExecute(CommandSender sender) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return true; return true;
} }
@Override @Override
public void onExecuteDefault(CommandSender sender, String label, String[] args) { public void onExecuteDefault(CommandSender sender, String[] args) {
} }

View File

@ -1,54 +1,58 @@
package us.tastybento.bskyblock.commands; package us.tastybento.bskyblock.commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter; import org.bukkit.command.TabCompleter;
import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.BSkyBlock;
import java.util.*;
import java.util.Map.Entry;
/** /**
* Abstract class that handles commands and tabs. It makes the commands code modular * Abstract class that handles commands and tab completion.
* and allow addons to add their own arguments. *
* It makes the commands code modular and allow addons to add their own arguments or even remove/edit existing ones.
* *
* @author Poslovitch * @author Poslovitch
*/ */
public abstract class BSBCommand implements CommandExecutor, TabCompleter{ public abstract class BSBCommand implements CommandExecutor, TabCompleter{
private Map<String, CommandArgumentHandler> arguments; private Map<String, CommandArgumentHandler> arguments;
private boolean help;
protected BSBCommand(BSkyBlock plugin, boolean help){ private String command;
/** Whether the command has an help list. */
private boolean help = true;
/** Max subcommands per help page. */
private static final int MAX_PER_PAGE = 7; // 10 seems to be the maximum acceptable, 7 is a good number.
protected BSBCommand(BSkyBlock plugin, String command, boolean help){
this.command = command;
arguments = new HashMap<String, CommandArgumentHandler>(); arguments = new HashMap<String, CommandArgumentHandler>();
this.help = help; this.help = help;
// Register a help argument if needed // Register the help argument if needed
if(help){ if(help) {
registerArgument(new String[] {"help", "?"}, new CommandArgumentHandler() { registerArgument(new String[] {"help", "?"}, new CommandArgumentHandler() {
@Override @Override
public boolean canExecute(CommandSender sender, String label, String[] args) { public boolean canExecute(CommandSender sender, String[] args) {
return true; // If the player can execute the command, he can receive help return true; // If the player can execute the command, he can receive help
} }
@Override @Override
public void onExecute(CommandSender sender, String label, String[] args) { public void onExecute(CommandSender sender, String[] args) {
// TODO send help sender.sendMessage(plugin.getLocale(sender).get("commands." + command + ".help-header"));
} }
@Override @Override
public List<String> onTabComplete(CommandSender sender, String label, String[] args) { public List<String> onTabComplete(CommandSender sender, String[] args) {
return null; // Doesn't have options for tab-completion return null; // Doesn't have options for tab-completion
} }
@Override @Override
public String[] getHelp(CommandSender sender, String label) { public String[] getHelp(CommandSender sender) {
return null; // Obviously, don't send any help message. return null; // Obviously, don't send any help message.
} }
@ -60,39 +64,40 @@ public abstract class BSBCommand implements CommandExecutor, TabCompleter{
} }
/** /**
* Setup the command arguments * Registers the command-specific arguments.
*
* This method is called when BSBCommand has been successfully constructed.
*/ */
public abstract void setup(); public abstract void setup();
/** /**
* Check if the sender can use the command * Asks if the sender can use the command
*
* @param sender * @param sender
* @param label
* @return if the sender can use the command * @return if the sender can use the command
*/ */
public abstract boolean canExecute(CommandSender sender, String label); public abstract boolean canExecute(CommandSender sender);
/** /**
* This code is executed when no arguments is specified for the command * This code is executed when no arguments is specified for the command
* @param sender * @param sender
* @param label
* @param args * @param args
*/ */
public abstract void onExecuteDefault(CommandSender sender, String label, String[] args); public abstract void onExecuteDefault(CommandSender sender, String[] args);
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args){ public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
if(this.canExecute(sender, label)){ if(this.canExecute(sender)){
if(args.length >= 1){ if(args.length >= 1){
if(arguments.containsKey(args[0]) && arguments.get(args[0]).canExecute(sender, label, args)){ if(arguments.containsKey(args[0]) && arguments.get(args[0]).canExecute(sender, args)){
arguments.get(args[0]).onExecute(sender, label, args); arguments.get(args[0]).onExecute(sender, args);
} else if(help) { } else if(help) {
arguments.get("?").onExecute(sender, label, args); arguments.get("?").onExecute(sender, args);
} else { } else {
this.onExecuteDefault(sender, label, args); this.onExecuteDefault(sender, args);
} }
} else { } else {
this.onExecuteDefault(sender, label, args); this.onExecuteDefault(sender, args);
} }
} }
return true; return true;
@ -101,60 +106,59 @@ public abstract class BSBCommand implements CommandExecutor, TabCompleter{
@Override @Override
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args){ public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args){
List<String> options = new ArrayList<String>(); List<String> options = new ArrayList<String>();
if(this.canExecute(sender, label)){ if(this.canExecute(sender)){
if(args.length <= 1){ if(args.length <= 1){
// Go through every argument, check if player can use it and if so, add it in tab options // Go through every argument, check if player can use it and if so, add it in tab options
for(Entry<String, CommandArgumentHandler> entry : arguments.entrySet()){ for(Entry<String, CommandArgumentHandler> entry : arguments.entrySet()){
if(entry.getValue().canExecute(sender, label, args)){ if(entry.getValue().canExecute(sender, args)){
options.add(entry.getKey()); options.add(entry.getKey());
} }
} }
} else { } else {
// If player can execute the argument, get its tab-completer options // If player can execute the argument, get its tab-completer options
if(getArgumentHandler(args[0]) != null && getArgumentHandler(args[0]).canExecute(sender, label, args) if(getArgumentHandler(args[0]) != null && getArgumentHandler(args[0]).canExecute(sender, args)
&& getArgumentHandler(args[0]).onTabComplete(sender, label, args) != null){ && getArgumentHandler(args[0]).onTabComplete(sender, args) != null){
options.addAll(getArgumentHandler(args[0]).onTabComplete(sender, label, args)); options.addAll(getArgumentHandler(args[0]).onTabComplete(sender, args));
} }
} }
} }
return options; return options;
} }
/**
* Defines the behavior of an argument and its aliases.
*/
public abstract class CommandArgumentHandler{ public abstract class CommandArgumentHandler{
/** /**
* Check if the sender can use the argument * Check if the sender can use the argument
* @param sender * @param sender
* @param label
* @param args * @param args
* @return if the sender can use the argument * @return if the sender can use the argument
*/ */
public abstract boolean canExecute(CommandSender sender, String label, String[] args); public abstract boolean canExecute(CommandSender sender, String[] args);
/** /**
* Code to execute for this argument * Code to execute for this argument
* @param sender * @param sender
* @param label
* @param args * @param args
*/ */
public abstract void onExecute(CommandSender sender, String label, String[] args); public abstract void onExecute(CommandSender sender, String[] args);
/** /**
* Request a list of tab-completion options with the argument * Request a list of tab-completion options with the argument
* @param sender * @param sender
* @param label
* @param args * @param args
* @return the list of options * @return the list of options
*/ */
public abstract List<String> onTabComplete(CommandSender sender, String label, String[] args); public abstract List<String> onTabComplete(CommandSender sender, String[] args);
/** /**
* Get help information * Get help information
* <code>new String[] {arguments, description};</code> * <code>new String[] {arguments, description};</code>
* @param sender * @param sender
* @param label
* @return the help information * @return the help information
*/ */
public abstract String[] getHelp(CommandSender sender, String label); public abstract String[] getHelp(CommandSender sender);
} }
public void registerArgument(String[] args, CommandArgumentHandler handler){ public void registerArgument(String[] args, CommandArgumentHandler handler){

View File

@ -1,5 +1,8 @@
package us.tastybento.bskyblock.config; package us.tastybento.bskyblock.config;
import org.bukkit.ChatColor;
import us.tastybento.bskyblock.BSkyBlock;
import java.io.File; import java.io.File;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
@ -7,10 +10,6 @@ import java.net.URLClassLoader;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import org.bukkit.ChatColor;
import us.tastybento.bskyblock.BSkyBlock;
public class BSBLocale { public class BSBLocale {
final static String LOCALE_FOLDER = "locales"; final static String LOCALE_FOLDER = "locales";