Almost finish tab completion, #77 (see details)

The only commands left to enable tab completion on are:
- jail
- jail transfer
This commit is contained in:
graywolf336 2015-06-02 12:32:34 -05:00
parent 019deea43a
commit cfb62eed13
23 changed files with 262 additions and 98 deletions

View File

@ -208,8 +208,7 @@ public class JailMain extends JavaPlugin {
if(commandLabel.equalsIgnoreCase("jail") || commandLabel.equalsIgnoreCase("j")) {
return jh.parseTabComplete(jm, sender, args);
}else {
//cmdHand.handleCommand(jm, sender, command.getName().toLowerCase(), args);
//unjail,etc
return cmdHand.parseTabComplete(jm, sender, command.getName().toLowerCase(), args);
}
}catch(Exception e) {
return Collections.emptyList();

View File

@ -11,6 +11,7 @@ import java.util.UUID;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.beans.CachePrisoner;
import com.graywolf336.jail.beans.Cell;
@ -84,12 +85,26 @@ public class JailManager {
return toReturn;
}
/** Returns a List of the jail names. */
public List<String> getJailNamesAsList() {
/**
* Gets a list of Jail names that start with the provided prefix.
*
* <p>
*
* If the provided prefix is empty, then we add all of the jails.
*
* @param prefix The start of the jails to get
* @return List of jails that matched the prefix
*/
public List<String> getJailsByPrefix(String prefix) {
List<String> results = new ArrayList<String>();
for(Jail j : this.jails.values())
results.add(j.getName());
for(Jail j : this.jails.values()) {
if(!prefix.isEmpty() && StringUtil.startsWithIgnoreCase(j.getName(), prefix)) {
results.add(j.getName());
}else {
results.add(j.getName());
}
}
Collections.sort(results);

View File

@ -92,10 +92,17 @@ public class Util {
return false;
}
public static String getStringFromArray(String separator, String... list) {
/**
* Gets a single string from an array of strings, separated by the separator.
*
* @param separator The item to separate the items
* @param array The array of strings to combine
* @return the resulting combined string
*/
public static String getStringFromArray(String separator, String... array) {
StringBuilder result = new StringBuilder();
for(String s : list) {
for(String s : array) {
if(result.length() != 0) result.append(separator);
result.append(s);
}
@ -103,6 +110,13 @@ public class Util {
return result.toString();
}
/**
* Gets a single string from a list of strings, separated by the separator.
*
* @param separator The item to separate the items
* @param list The list of strings to combine
* @return the resulting combined string
*/
public static String getStringFromList(String separator, List<String> list) {
StringBuilder result = new StringBuilder();

View File

@ -1,6 +1,7 @@
package com.graywolf336.jail.command;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
@ -18,7 +19,7 @@ import com.graywolf336.jail.command.commands.UnJailForceCommand;
import com.graywolf336.jail.enums.Lang;
/**
* Where all the commands are registered at and handled, processed, at.
* Where all the commands are registered, handled, and processed.
*
* @author graywolf336
* @since 3.0.0
@ -34,6 +35,28 @@ public class CommandHandler {
plugin.debug("Loaded " + commands.size() + " commands.");
}
public List<String> parseTabComplete(JailManager jm, CommandSender sender, String commandLine, String[] args) throws Exception {
List<Command> matches = getMatches(commandLine);
if(matches.size() == 0 || matches.size() > 1) return Collections.emptyList();
else {
CommandInfo i = matches.get(0).getClass().getAnnotation(CommandInfo.class);
//Sender provided too many arguments which means there
//is nothing to tab complete
if(i.maxArgs() != -1 && i.maxArgs() < args.length) return Collections.emptyList();
//Don't return anything if a player is required and they're not a player
if(i.needsPlayer() && !(sender instanceof Player)) return Collections.emptyList();
//Don't return anything if they don't have permission
if(!sender.hasPermission(i.permission())) return Collections.emptyList();
//Let the command handle the rest of it
return matches.get(0).provideTabCompletions(jm, sender, args);
}
}
/**
* Handles the given command and checks that the command is in valid form.

View File

@ -40,6 +40,14 @@ import com.graywolf336.jail.command.subcommands.JailVersionCommand;
import com.graywolf336.jail.command.subcommands.JailVoteCommand;
import com.graywolf336.jail.enums.Lang;
/**
* Where all the <strong>jail</strong> commands are registered, handled, and processed at.
*
* @author graywolf336
* @since 3.0.0
* @version 1.1.0
*
*/
public class JailHandler {
private LinkedHashMap<String, Command> commands;
@ -51,7 +59,7 @@ public class JailHandler {
}
public List<String> parseTabComplete(JailManager jm, CommandSender sender, String[] args) throws Exception {
if(args[0].equalsIgnoreCase("") || args.length == 1) {
if(args[0].isEmpty() || args.length == 1) {
List<String> results = new ArrayList<String>();
String arg0 = args[0].toLowerCase();
boolean hasJailPermission = false;
@ -70,7 +78,7 @@ public class JailHandler {
//If the sender has permission to the command
//and the first argument (sub command) is empty OR
//the first argument matches the command or starts with the string
if(sender.hasPermission(i.permission()) && (arg0.equalsIgnoreCase("") || (arg0.toLowerCase().matches(i.pattern()) || i.pattern().startsWith(arg0)))) {
if(sender.hasPermission(i.permission()) && (arg0.isEmpty() || (arg0.toLowerCase().matches(i.pattern()) || i.pattern().startsWith(arg0)))) {
results.add(i.pattern().split("\\|")[0]);
}
}
@ -79,12 +87,10 @@ public class JailHandler {
Collections.sort(results);
//Don't send out all the players if they don't have jail permission
if(hasJailPermission) {
for(Player p : jm.getPlugin().getServer().getOnlinePlayers()) {
if(arg0.equalsIgnoreCase("") || StringUtil.startsWithIgnoreCase(p.getName(), arg0))
if(hasJailPermission)
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(arg0.isEmpty() || StringUtil.startsWithIgnoreCase(p.getName(), arg0))
results.add(p.getName());
}
}
return results;
}else {
@ -93,16 +99,16 @@ public class JailHandler {
for(Command c : commands.values()) {
CommandInfo i = c.getClass().getAnnotation(CommandInfo.class);
//Sender provided too many arguments which means there
//is nothing to tab complete
if(i.maxArgs() != -1 && i.maxArgs() < args.length - 1) continue;
//Skip if the command requires a player and the sender isn't a player
if(i.needsPlayer() && !(sender instanceof Player)) continue;
//If the sender doesn't have permission, we won't send them further
if(!sender.hasPermission(i.permission())) continue;
//Sender provided too many arguments which means there
//is nothing to tab complete
if(i.maxArgs() != -1 && i.maxArgs() < args.length - 1) continue;
if(arg0.toLowerCase().matches(i.pattern())) {
return c.provideTabCompletions(jm, sender, args);
}

View File

@ -1,10 +1,12 @@
package com.graywolf336.jail.command.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.command.Command;
@ -43,7 +45,16 @@ public class HandCuffCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
List<String> results = new ArrayList<String>();
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(!jm.getPlugin().getHandCuffManager().isHandCuffed(p.getUniqueId())) //don't send someone who is already handcuffed
if(!p.hasPermission("jail.cantbehandcuffed")) //don't send someone who can't be handcuffed
if(args[0].isEmpty() || StringUtil.startsWithIgnoreCase(p.getName(), args[0]))
results.add(p.getName());
Collections.sort(results);
return results;
}
}

View File

@ -1,10 +1,12 @@
package com.graywolf336.jail.command.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.command.Command;
@ -37,7 +39,15 @@ public class UnHandCuffCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
List<String> results = new ArrayList<String>();
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(jm.getPlugin().getHandCuffManager().isHandCuffed(p.getUniqueId())) //don't send someone who isn't already handcuffed
if(args[0].isEmpty() || StringUtil.startsWithIgnoreCase(p.getName(), args[0]))
results.add(p.getName());
Collections.sort(results);
return results;
}
}

View File

@ -1,11 +1,13 @@
package com.graywolf336.jail.command.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Jail;
@ -65,7 +67,14 @@ public class UnJailCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
List<String> results = new ArrayList<String>();
for(Prisoner p : jm.getAllPrisoners().values())
if(args[0].isEmpty() || StringUtil.startsWithIgnoreCase(p.getLastKnownName(), args[0]))
results.add(p.getLastKnownName());
Collections.sort(results);
return results;
}
}

View File

@ -1,12 +1,15 @@
package com.graywolf336.jail.command.commands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Prisoner;
import com.graywolf336.jail.command.Command;
import com.graywolf336.jail.command.CommandInfo;
import com.graywolf336.jail.enums.Lang;
@ -39,7 +42,14 @@ public class UnJailForceCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
List<String> results = new ArrayList<String>();
for(Prisoner p : jm.getAllPrisoners().values())
if(args[0].isEmpty() || StringUtil.startsWithIgnoreCase(p.getLastKnownName(), args[0]))
results.add(p.getLastKnownName());
Collections.sort(results);
return results;
}
}

View File

@ -6,6 +6,7 @@ import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
@ -54,6 +55,11 @@ public class JailCheckCommand implements Command{
Collections.sort(results);
if(args.length == 1)
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(!results.contains(p.getName()))
results.add(p.getName());
return results;
}
}

View File

@ -1,13 +1,11 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Jail;
@ -72,18 +70,6 @@ public class JailCreateCellCommand implements Command {
//We shouldn't provide when they want a cell name
if(args.length >= 3) return Collections.emptyList();
List<String> results = new ArrayList<String>();
for(Jail j : jm.getJails()) {
if(args.length == 2 && StringUtil.startsWithIgnoreCase(j.getName(), args[1])) {
results.add(j.getName());
}else {
results.add(j.getName());
}
}
Collections.sort(results);
return results;
return jm.getJailsByPrefix(args.length == 2 ? args[1] : "");
}
}

View File

@ -41,19 +41,17 @@ public class JailDeleteCellCommand implements Command {
switch(args.length) {
case 1:
results.addAll(jm.getJailNamesAsList());
results.addAll(jm.getJailsByPrefix(""));
break;
case 2:
for(Jail j : jm.getJails())
if(StringUtil.startsWithIgnoreCase(j.getName(), args[1]))
results.add(j.getName());
results = jm.getJailsByPrefix(args[1]);
break;
case 3:
if(jm.isValidJail(args[1])) {
Jail j = jm.getJail(args[1]);
for(Cell c : j.getCells())
if(StringUtil.startsWithIgnoreCase(c.getName(), args[2]))
if(args[2].isEmpty() || StringUtil.startsWithIgnoreCase(c.getName(), args[2]))
results.add(c.getName());
}
break;

View File

@ -1,6 +1,5 @@
package com.graywolf336.jail.command.subcommands;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
@ -33,7 +32,6 @@ public class JailDeleteCellsCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
return jm.getJailsByPrefix(args.length == 2 ? args[1] : "");
}
}

View File

@ -1,6 +1,5 @@
package com.graywolf336.jail.command.subcommands;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
@ -33,7 +32,6 @@ public class JailDeleteCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
return jm.getJailsByPrefix(args.length == 2 ? args[1] : "");
}
}

View File

@ -1,12 +1,9 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Cell;
@ -58,18 +55,6 @@ public class JailListCellsCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
List<String> results = new ArrayList<String>();
for(Jail j : jm.getJails()) {
if(args.length == 2 && StringUtil.startsWithIgnoreCase(j.getName(), args[1])) {
results.add(j.getName());
}else {
results.add(j.getName());
}
}
Collections.sort(results);
return results;
return jm.getJailsByPrefix(args.length == 2 ? args[1] : "");
}
}

View File

@ -1,13 +1,10 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Jail;
@ -67,18 +64,6 @@ public class JailListCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
List<String> results = new ArrayList<String>();
for(Jail j : jm.getJails()) {
if(args.length == 2 && StringUtil.startsWithIgnoreCase(j.getName(), args[1])) {
results.add(j.getName());
}else {
results.add(j.getName());
}
}
Collections.sort(results);
return results;
return jm.getJailsByPrefix(args.length == 2 ? args[1] : "");
}
}

View File

@ -1,5 +1,6 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
@ -7,6 +8,7 @@ import java.util.concurrent.TimeUnit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Prisoner;
@ -210,7 +212,24 @@ public class JailPayCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
if(jm.getPlugin().getConfig().getBoolean(Settings.JAILPAYENABLED.getPath())) {
switch(args.length) {
case 3:
List<String> results = new ArrayList<String>();
for(Prisoner p : jm.getAllPrisoners().values())
if(!p.isOfflinePending()) //Don't list if they're offline pending
if(p.getRemainingTime() != -1) //Don't list if they're jailed forever
if(StringUtil.startsWithIgnoreCase(p.getLastKnownName(), args[2]))
results.add(p.getLastKnownName());
Collections.sort(results);
return results;
default:
break;
}
}
return Collections.emptyList();
}
}

View File

@ -45,7 +45,7 @@ public class JailRecordCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
//We won't be implementing tab complete on this for now (unless requested)
return Collections.emptyList();
}
}

View File

@ -1,10 +1,12 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Jail;
@ -56,7 +58,21 @@ public class JailTeleInCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
switch(args.length) {
case 2:
return jm.getJailsByPrefix(args[1]);
case 3:
List<String> results = new ArrayList<String>();
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(args[2].isEmpty() || StringUtil.startsWithIgnoreCase(p.getName(), args[2]))
results.add(p.getName());
Collections.sort(results);
return results;
default:
return Collections.emptyList();
}
}
}

View File

@ -1,10 +1,12 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Jail;
@ -56,7 +58,21 @@ public class JailTeleOutCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
switch(args.length) {
case 2:
return jm.getJailsByPrefix(args[1]);
case 3:
List<String> results = new ArrayList<String>();
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(args[2].isEmpty() || StringUtil.startsWithIgnoreCase(p.getName(), args[2]))
results.add(p.getName());
Collections.sort(results);
return results;
default:
return Collections.emptyList();
}
}
}

View File

@ -1,9 +1,11 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.Util;
@ -57,7 +59,25 @@ public class JailTimeCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
List<String> results = new ArrayList<String>();
switch(args.length) {
case 2:
for(String s : new String[] { "add", "remove", "set", "show" })
if(args[1].isEmpty() || StringUtil.startsWithIgnoreCase(s, args[1]))
results.add(s);
break;
case 3:
for(Prisoner p : jm.getAllPrisoners().values())
if(StringUtil.startsWithIgnoreCase(p.getLastKnownName(), args[2]))
results.add(p.getLastKnownName());
break;
default:
break;
}
Collections.sort(results);
return results;
}
}

View File

@ -1,10 +1,12 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.beans.Jail;
@ -57,7 +59,21 @@ public class JailTransferAllCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
switch(args.length) {
case 2:
return jm.getJailsByPrefix(args[1]);
case 3:
List<String> results = new ArrayList<String>();
for(Jail j : jm.getJails())
if(!j.getName().equalsIgnoreCase(args[1]) && (args[2].isEmpty() || StringUtil.startsWithIgnoreCase(j.getName(), args[2])))
results.add(j.getName());
Collections.sort(results);
return results;
default:
return Collections.emptyList();
}
}
}

View File

@ -1,10 +1,12 @@
package com.graywolf336.jail.command.subcommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import com.graywolf336.jail.JailManager;
import com.graywolf336.jail.JailVoteManager;
@ -102,7 +104,29 @@ public class JailVoteCommand implements Command {
}
public List<String> provideTabCompletions(JailManager jm, CommandSender sender, String... args) throws Exception {
//TODO implement
return Collections.emptyList();
if(jm.getPlugin().getConfig().getBoolean(Settings.JAILVOTEENABLED.getPath()) && jm.getPlugin().getJailVoteManager() != null && !jm.getJails().isEmpty()) {
List<String> results = new ArrayList<String>();
switch(args.length) {
case 2:
for(Player p : jm.getPlugin().getServer().getOnlinePlayers())
if(args[1].isEmpty() || StringUtil.startsWithIgnoreCase(p.getName(), args[1]))
results.add(p.getName());
break;
case 3:
for(String s : new String[] { "yes", "no" })
if(args[2].isEmpty() || StringUtil.startsWithIgnoreCase(s, args[2]))
results.add(s);
break;
default:
break;
}
Collections.sort(results);
return results;
}else {
return Collections.emptyList();
}
}
}