From 71a21261a7584d1675f5a795e1fd64f96d2207a4 Mon Sep 17 00:00:00 2001 From: stzups <55036602+stzups@users.noreply.github.com> Date: Fri, 28 Feb 2020 19:25:45 -0500 Subject: [PATCH] Fixed NPE when using certain sub commands of /ta (#3725) * Fixed NPE when using certain sub commands of /ta - Moved command specific methods out of NameUtil - TownyAdmin finds tab completions by arguments, not null player value - Fixed scopes and functions of TownCommand and NationCommand * add missing break; --- .../bukkit/towny/command/BaseCommand.java | 33 +++++++++++ .../bukkit/towny/command/NationCommand.java | 20 +++++-- .../bukkit/towny/command/TownCommand.java | 56 +++++++++---------- .../towny/command/TownyAdminCommand.java | 30 ++++++++-- .../bukkit/towny/utils/NameUtil.java | 47 ---------------- 5 files changed, 101 insertions(+), 85 deletions(-) diff --git a/src/com/palmergames/bukkit/towny/command/BaseCommand.java b/src/com/palmergames/bukkit/towny/command/BaseCommand.java index 9ec1f879ee..c1b42f6e3b 100644 --- a/src/com/palmergames/bukkit/towny/command/BaseCommand.java +++ b/src/com/palmergames/bukkit/towny/command/BaseCommand.java @@ -1,10 +1,12 @@ package com.palmergames.bukkit.towny.command; import com.palmergames.bukkit.towny.TownyUniverse; +import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; import com.palmergames.bukkit.towny.utils.NameUtil; 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.Arrays; @@ -157,4 +159,35 @@ static List toggleTabCompletes(String[] args) { return Collections.emptyList(); } + + /** + * Returns the names a player's town's residents that start with a string + * + * @param player the player to get the town's residents of + * @param str the string to check if the town's residents start with + * @return the resident names that match str + */ + public static List getTownResidentNamesOfPlayerStartingWith(Player player, String str){ + try { + return NameUtil.filterByStart(NameUtil.getNames(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown().getResidents()), str); + } catch (NotRegisteredException e) { + return Collections.emptyList(); + } + } + + /** + * Returns the names a town's residents that start with a string + * + * @param town the town to get the residents of + * @param str the string to check if the town's residents start with + * @return the resident names that match str + */ + + public static List getResidentsOfTownStartingWith(String town, String str) { + try { + return NameUtil.filterByStart(NameUtil.getNames(TownyUniverse.getInstance().getDataSource().getTown(town).getResidents()), str); + } catch (NotRegisteredException e) { + return Collections.emptyList(); + } + } } diff --git a/src/com/palmergames/bukkit/towny/command/NationCommand.java b/src/com/palmergames/bukkit/towny/command/NationCommand.java index 4ed45ac16d..cdd0975dff 100644 --- a/src/com/palmergames/bukkit/towny/command/NationCommand.java +++ b/src/com/palmergames/bukkit/towny/command/NationCommand.java @@ -101,7 +101,7 @@ public class NationCommand extends BaseCommand implements CommandExecutor { "king" )); - static final List nationSetTabCompletes = new ArrayList<>(Arrays.asList( + private static final List nationSetTabCompletes = new ArrayList<>(Arrays.asList( "king", "capital", "board", @@ -292,7 +292,11 @@ public List onTabComplete(CommandSender sender, Command command, String case "add": case "remove": if (args.length == 3) { - return NameUtil.getNationResidentNamesOfPlayerStartingWith(player, args[2]); + try { + return NameUtil.filterByStart(NameUtil.getNames(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown().getNation().getResidents()), args[1]); + } catch (NotRegisteredException e) { + return Collections.emptyList(); + } } else if (args.length == 4) { return NameUtil.filterByStart(TownyPerms.getNationRanks(), args[3]); } @@ -315,7 +319,11 @@ public List onTabComplete(CommandSender sender, Command command, String } break; case "set": - return nationSetTabComplete(player, args); + try { + return nationSetTabComplete(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown().getNation(), args); + } catch (NotRegisteredException e) { + return Collections.emptyList(); + } default: if (args.length == 1) { List nationNames = NameUtil.filterByStart(nationTabCompletes, args[0]); @@ -333,7 +341,7 @@ public List onTabComplete(CommandSender sender, Command command, String return Collections.emptyList(); } - static List nationSetTabComplete(Player player, String[] args) { + static List nationSetTabComplete(Nation nation, String[] args) { if (args.length == 2) { return NameUtil.filterByStart(nationSetTabCompletes, args[1]); } else if (args.length == 3){ @@ -341,9 +349,9 @@ static List nationSetTabComplete(Player player, String[] args) { case "king": case "title": case "surname": - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[2]); + return NameUtil.filterByStart(NameUtil.getNames(nation.getResidents()), args[2]); case "capital": - return NameUtil.getTownNamesOfPlayerNationStartingWith(player, args[2]); + return NameUtil.filterByStart(NameUtil.getNames(nation.getTowns()), args[2]); } } diff --git a/src/com/palmergames/bukkit/towny/command/TownCommand.java b/src/com/palmergames/bukkit/towny/command/TownCommand.java index 10c8faf6e2..818f986173 100644 --- a/src/com/palmergames/bukkit/towny/command/TownCommand.java +++ b/src/com/palmergames/bukkit/towny/command/TownCommand.java @@ -118,7 +118,7 @@ public class TownCommand extends BaseCommand implements CommandExecutor, TabComp "join", "invite" )); - static final List townSetTabCompletes = new ArrayList<>(Arrays.asList( + private static final List townSetTabCompletes = new ArrayList<>(Arrays.asList( "board", "mayor", "homeblock", @@ -157,7 +157,7 @@ public class TownCommand extends BaseCommand implements CommandExecutor, TabComp "list" )); - private static final List townAddRemoveTabCompletes = new ArrayList<>(Arrays.asList( + static final List townAddRemoveTabCompletes = new ArrayList<>(Arrays.asList( "add", "remove" )); @@ -251,7 +251,22 @@ public List onTabComplete(CommandSender sender, Command command, String return getTownyStartingWith(args[1], "t"); break; case "rank": - return townRankTabComplete(player, args); + switch (args.length) { + case 2: + return NameUtil.filterByStart(townAddRemoveTabCompletes, args[1]); + case 3: + return getTownResidentNamesOfPlayerStartingWith(player, args[2]); + case 4: + switch (args[1].toLowerCase()) { + case "add": + return NameUtil.filterByStart(TownyPerms.getTownRanks(), args[3]); + case "remove": + try { + return NameUtil.filterByStart(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTownRanks(), args[3]); + } catch (TownyException ignored) {} + } + } + break; case "outlaw": switch (args.length) { case 2: @@ -287,10 +302,14 @@ public List onTabComplete(CommandSender sender, Command command, String break; case "kick": if (args.length == 2) - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[1]); + return getTownResidentNamesOfPlayerStartingWith(player, args[1]); break; case "set": - return townSetTabComplete(player, args); + try { + return townSetTabComplete(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown(), args); + } catch (TownyException e) { + return Collections.emptyList(); + } case "invite": switch (args.length) { case 2: @@ -338,7 +357,7 @@ public List onTabComplete(CommandSender sender, Command command, String case 2: return NameUtil.filterByStart(townToggleTabCompletes, args[1]); case 4: - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[3]); + return getTownResidentNamesOfPlayerStartingWith(player, args[3]); } default: if (args.length == 1) @@ -351,13 +370,13 @@ public List onTabComplete(CommandSender sender, Command command, String return Collections.emptyList(); } - static List townSetTabComplete(Player player, String[] args) { + static List townSetTabComplete(Town town, String[] args) { if (args.length == 2) { return NameUtil.filterByStart(townSetTabCompletes, args[1]); } else if (args.length > 2) { switch (args[1].toLowerCase()) { case "mayor": - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[2]); + return NameUtil.filterByStart(NameUtil.getNames(town.getResidents()), args[2]); case "perm": return permTabComplete(StringMgmt.remArgs(args, 2)); case "tag": @@ -366,31 +385,12 @@ static List townSetTabComplete(Player player, String[] args) { case "title": case "surname": if (args.length == 3) - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[2]); + return NameUtil.filterByStart(NameUtil.getNames(town.getResidents()), args[2]); } } return Collections.emptyList(); } - - static List townRankTabComplete(Player player, String[] args) { - switch (args.length) { - case 2: - return NameUtil.filterByStart(townAddRemoveTabCompletes, args[1]); - case 3: - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[2]); - case 4: - switch (args[1].toLowerCase()) { - case "add": - return NameUtil.filterByStart(TownyPerms.getTownRanks(), args[3]); - case "remove": - try { - return NameUtil.filterByStart(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTownRanks(), args[3]); - } catch (TownyException ignored) {} - } - } - return Collections.emptyList(); - } @Override public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { diff --git a/src/com/palmergames/bukkit/towny/command/TownyAdminCommand.java b/src/com/palmergames/bukkit/towny/command/TownyAdminCommand.java index 2ce8ec9c2b..f1aba6e0ec 100644 --- a/src/com/palmergames/bukkit/towny/command/TownyAdminCommand.java +++ b/src/com/palmergames/bukkit/towny/command/TownyAdminCommand.java @@ -254,6 +254,7 @@ public List onTabComplete(CommandSender sender, Command command, String return NameUtil.filterByStart(adminSetCompletes, args[1]); } } + break; case "plot": if (args.length == 2) { return NameUtil.filterByStart(adminPlotTabCompletes, args[1]); @@ -316,11 +317,28 @@ public List onTabComplete(CommandSender sender, Command command, String return null; case "kick": if (args.length == 4) - return NameUtil.getTownResidentNamesOfPlayerStartingWith(player, args[3]); + return getResidentsOfTownStartingWith(args[1], args[3]); case "rank": - return TownCommand.townRankTabComplete(player, StringMgmt.remArgs(args, 2)); + switch (args.length) { + case 4: + return NameUtil.filterByStart(TownCommand.townAddRemoveTabCompletes, args[3]); + case 5: + return getResidentsOfTownStartingWith(args[1], args[4]); + case 6: + switch (args[3].toLowerCase()) { + case "add": + return NameUtil.filterByStart(TownyPerms.getTownRanks(), args[5]); + case "remove": + try { + return NameUtil.filterByStart(TownyUniverse.getInstance().getDataSource().getResident(args[4]).getTownRanks(), args[5]); + } catch (NotRegisteredException ignored) {} + } + } + break; case "set": - return TownCommand.townSetTabComplete(player, StringMgmt.remArgs(args, 2)); + try { + return TownCommand.townSetTabComplete(TownyUniverse.getInstance().getDataSource().getTown(args[1]), StringMgmt.remArgs(args, 2)); + } catch (NotRegisteredException ignored) {} case "toggle": if (args.length == 4) return NameUtil.filterByStart(TownCommand.townToggleTabCompletes, args[3]); @@ -342,7 +360,11 @@ public List onTabComplete(CommandSender sender, Command command, String if (args.length == 4) return NameUtil.filterByStart(NationCommand.nationToggleTabCompletes, args[3]); case "set": - return NationCommand.nationSetTabComplete(player, StringMgmt.remArgs(args, 2)); + try { + return NationCommand.nationSetTabComplete(TownyUniverse.getInstance().getDataSource().getNation(args[1]), StringMgmt.remArgs(args, 2)); + } catch (NotRegisteredException e) { + return Collections.emptyList(); + } case "merge": if (args.length == 4) return getTownyStartingWith(args[3], "n"); diff --git a/src/com/palmergames/bukkit/towny/utils/NameUtil.java b/src/com/palmergames/bukkit/towny/utils/NameUtil.java index e55444c799..2648b72b8a 100644 --- a/src/com/palmergames/bukkit/towny/utils/NameUtil.java +++ b/src/com/palmergames/bukkit/towny/utils/NameUtil.java @@ -1,8 +1,6 @@ package com.palmergames.bukkit.towny.utils; -import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.object.Nameable; -import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Collection; @@ -50,49 +48,4 @@ public static List filterByStart(List list, String startingWith) } return list.stream().filter(name -> name.toLowerCase().startsWith(startingWith.toLowerCase())).collect(Collectors.toList()); } - - /** - * Returns the names a player's town's residents that start with a string - * - * @param player the player to get the town's residents of - * @param str the string to check if the town's residents start with - * @return the resident names that match str - */ - public static List getTownResidentNamesOfPlayerStartingWith(Player player, String str){ - try { - return filterByStart(getNames(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown().getResidents()), str); - } catch (Exception e) { - return Collections.emptyList(); - } - } - - /** - * Returns the names a player's nation's residents that start with a string - * - * @param player the player to get the nation's residents of - * @param str the string to check if the nation's residents start with - * @return the resident names that match str - */ - public static List getNationResidentNamesOfPlayerStartingWith(Player player, String str) { - try { - return filterByStart(getNames(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown().getNation().getResidents()), str); - } catch (Exception e) { - return Collections.emptyList(); - } - } - - /** - * Returns the names of towns of a player that start with a string - * - * @param player the player to get the towns of - * @param str the string to check if the town names start with - * @return the town names that match str - */ - public static List getTownNamesOfPlayerNationStartingWith(Player player, String str) { - try { - return filterByStart(getNames(TownyUniverse.getInstance().getDataSource().getResident(player.getName()).getTown().getNation().getTowns()), str); - } catch (Exception e) { - return Collections.emptyList(); - } - } }