Adds a helper class for tab completion, and uses a TabExecutor for the give and give public commands

This commit is contained in:
Kristian Knarvik 2021-09-05 01:00:50 +02:00
parent a009430ba0
commit be1717182d
5 changed files with 119 additions and 77 deletions

View File

@ -19,7 +19,6 @@ import net.knarcraft.bookswithoutborders.command.CommandSetBookPrice;
import net.knarcraft.bookswithoutborders.command.CommandSetLore; import net.knarcraft.bookswithoutborders.command.CommandSetLore;
import net.knarcraft.bookswithoutborders.command.CommandSetTitle; import net.knarcraft.bookswithoutborders.command.CommandSetTitle;
import net.knarcraft.bookswithoutborders.command.CommandUnSign; import net.knarcraft.bookswithoutborders.command.CommandUnSign;
import net.knarcraft.bookswithoutborders.command.GiveTabCompleter;
import net.knarcraft.bookswithoutborders.listener.PlayerEventListener; import net.knarcraft.bookswithoutborders.listener.PlayerEventListener;
import net.knarcraft.bookswithoutborders.listener.SignEventListener; import net.knarcraft.bookswithoutborders.listener.SignEventListener;
import net.knarcraft.bookswithoutborders.state.BookDirectory; import net.knarcraft.bookswithoutborders.state.BookDirectory;
@ -32,6 +31,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.command.TabCompleter; import org.bukkit.command.TabCompleter;
import org.bukkit.command.TabExecutor;
import org.bukkit.configuration.Configuration; import org.bukkit.configuration.Configuration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.ItemFactory;
@ -263,7 +263,10 @@ public class BooksWithoutBorders extends JavaPlugin {
* Registers all commands used by this plugin * Registers all commands used by this plugin
*/ */
private void registerCommands() { private void registerCommands() {
registerCommand("giveBook", new CommandGive(), new GiveTabCompleter()); TabExecutor giveTabExecutor = new CommandGive();
registerCommand("giveBook", giveTabExecutor, giveTabExecutor);
TabExecutor givePublicTabExecutor = new CommandGivePublic();
registerCommand("givePublicBook", givePublicTabExecutor, givePublicTabExecutor);
registerCommand("decryptBook", new CommandDecrypt(), null); registerCommand("decryptBook", new CommandDecrypt(), null);
registerCommand("groupEncryptBook", new CommandGroupEncrypt(), null); registerCommand("groupEncryptBook", new CommandGroupEncrypt(), null);
registerCommand("deleteBook", new CommandDelete(), null); registerCommand("deleteBook", new CommandDelete(), null);
@ -281,7 +284,6 @@ public class BooksWithoutBorders extends JavaPlugin {
registerCommand("loadPublicBook", new CommandLoadPublic(), null); registerCommand("loadPublicBook", new CommandLoadPublic(), null);
registerCommand("booksWithoutBorders", new CommandBooksWithoutBorders(), null); registerCommand("booksWithoutBorders", new CommandBooksWithoutBorders(), null);
registerCommand("reload", new CommandReload(), null); registerCommand("reload", new CommandReload(), null);
registerCommand("givePublicBook", new CommandGivePublic(), null);
} }
/** /**

View File

@ -3,16 +3,21 @@ package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders; import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import net.knarcraft.bookswithoutborders.utility.FileHelper; import net.knarcraft.bookswithoutborders.utility.FileHelper;
import net.knarcraft.bookswithoutborders.utility.InputCleaningHelper; import net.knarcraft.bookswithoutborders.utility.InputCleaningHelper;
import net.knarcraft.bookswithoutborders.utility.TabCompletionHelper;
import org.bukkit.Server;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
/** /**
* Command executor for the give command * Command executor for the give command
*/ */
public class CommandGive implements CommandExecutor { public class CommandGive implements TabExecutor {
private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance(); private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
@ -98,4 +103,48 @@ public class CommandGive implements CommandExecutor {
} }
} }
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return doTabCompletion(sender, args, false);
}
/**
* Performs the actual tab completion
* @param sender <p>The sender of the command</p>
* @param args <p>The arguments given</p>
* @param listPublic <p>Whether to list public files or player files</p>
* @return <p>A list of available choices</p>
*/
protected List<String> doTabCompletion(CommandSender sender, String[] args, boolean listPublic) {
Server server = booksWithoutBorders.getServer();
int argumentCount = args.length;
if (argumentCount > 2) {
//Don't continue with autocompletion if the recipient is invalid
if (server.getPlayer(args[1]) == null) {
return new ArrayList<>();
}
}
if (argumentCount == 1) {
//Return list of books
return BooksWithoutBorders.getAvailableBooks(sender, listPublic);
} else if (argumentCount == 2) {
//Return online players
return null;
} else if (argumentCount == 3) {
//Number of copies
return TabCompletionHelper.getBooleansAndNumbers(1, 64);
} else if (argumentCount == 4) {
//Signed
try {
Integer.parseInt(args[2]);
return TabCompletionHelper.getBooleans();
} catch (NumberFormatException e) {
return new ArrayList<>();
}
}
return new ArrayList<>();
}
} }

View File

@ -1,17 +1,24 @@
package net.knarcraft.bookswithoutborders.command; package net.knarcraft.bookswithoutborders.command;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import java.util.List;
/** /**
* Command executor for the give public command * Command executor for the give public command
*/ */
public class CommandGivePublic extends CommandGive implements CommandExecutor { public class CommandGivePublic extends CommandGive implements TabExecutor {
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return giveBook(sender, args, true, "public"); return giveBook(sender, args, true, "public");
} }
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return doTabCompletion(sender, args, true);
}
} }

View File

@ -1,70 +0,0 @@
package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
/**
* Tab completer for the save command
*/
public class GiveTabCompleter implements TabCompleter {
private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
Server server = booksWithoutBorders.getServer();
List<String> playerNames = new ArrayList<>();
for (Player player : server.getOnlinePlayers()) {
playerNames.add(player.getName());
}
List<String> booleans = new ArrayList<>();
booleans.add("true");
booleans.add("false");
List<String> numbers = new ArrayList<>();
numbers.add("1");
numbers.add("2");
numbers.add("3");
numbers.add("4");
numbers.add("5");
List<String> boolAndNumbers = new ArrayList<>();
boolAndNumbers.addAll(booleans);
boolAndNumbers.addAll(numbers);
int argumentCount = args.length;
if (argumentCount > 2) {
//Don't continue with autocompletion if the recipient is invalid
if (server.getPlayer(args[1]) == null) {
return null;
}
}
if (argumentCount == 1) {
//Return list of books
return BooksWithoutBorders.getAvailableBooks(sender, false);
} else if (argumentCount == 2) {
//Return online players
return playerNames;
} else if (argumentCount == 3) {
//Number of copies
return boolAndNumbers;
} else if (argumentCount == 4) {
//Signed
try {
Integer.parseInt(args[2]);
return booleans;
} catch (NumberFormatException e) {
return null;
}
}
return null;
}
}

View File

@ -0,0 +1,54 @@
package net.knarcraft.bookswithoutborders.utility;
import java.util.ArrayList;
import java.util.List;
/**
* Helper class for getting string lists required for auto-completion
*/
public class TabCompletionHelper {
/**
* Gets a list of booleans
*
* @return <p>A list of booleans</p>
*/
public static List<String> getBooleans() {
List<String> booleans = new ArrayList<>();
booleans.add("true");
booleans.add("false");
return booleans;
}
/**
* Gets a list of numbers in increasing order
*
* @param start <p>The start number</p>
* @param end <p>The end number</p>
* @return <p>A list of numbers</p>
*/
public static List<String> getNumbers(int start, int end) {
List<String> numbers = new ArrayList<>();
for (int i = start; i <= end; i++) {
numbers.add(String.valueOf(i));
}
return numbers;
}
/**
* Gets a list of booleans and numbers
*
* @param start <p>The start number</p>
* @param end <p>The end number</p>
* @return <p>A list of booleans and numbers</p>
*/
public static List<String> getBooleansAndNumbers(int start, int end) {
List<String> booleansAndNumbers = new ArrayList<>();
List<String> booleans = getBooleans();
List<String> numbers = getNumbers(start, end);
booleansAndNumbers.addAll(booleans);
booleansAndNumbers.addAll(numbers);
return booleansAndNumbers;
}
}