Skip to content

Commit

Permalink
Fixed NPE when using certain sub commands of /ta (#3725)
Browse files Browse the repository at this point in the history
* 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;
  • Loading branch information
griffinht authored and TheFlagCourier committed Mar 2, 2020
1 parent 7ea80ce commit 71a2126
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 85 deletions.
33 changes: 33 additions & 0 deletions src/com/palmergames/bukkit/towny/command/BaseCommand.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -157,4 +159,35 @@ static List<String> 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<String> 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<String> getResidentsOfTownStartingWith(String town, String str) {
try {
return NameUtil.filterByStart(NameUtil.getNames(TownyUniverse.getInstance().getDataSource().getTown(town).getResidents()), str);
} catch (NotRegisteredException e) {
return Collections.emptyList();
}
}
}
20 changes: 14 additions & 6 deletions src/com/palmergames/bukkit/towny/command/NationCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public class NationCommand extends BaseCommand implements CommandExecutor {
"king"
));

static final List<String> nationSetTabCompletes = new ArrayList<>(Arrays.asList(
private static final List<String> nationSetTabCompletes = new ArrayList<>(Arrays.asList(
"king",
"capital",
"board",
Expand Down Expand Up @@ -292,7 +292,11 @@ public List<String> 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]);
}
Expand All @@ -315,7 +319,11 @@ public List<String> 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<String> nationNames = NameUtil.filterByStart(nationTabCompletes, args[0]);
Expand All @@ -333,17 +341,17 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
return Collections.emptyList();
}

static List<String> nationSetTabComplete(Player player, String[] args) {
static List<String> nationSetTabComplete(Nation nation, String[] args) {
if (args.length == 2) {
return NameUtil.filterByStart(nationSetTabCompletes, args[1]);
} else if (args.length == 3){
switch (args[1].toLowerCase()) {
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]);
}
}

Expand Down
56 changes: 28 additions & 28 deletions src/com/palmergames/bukkit/towny/command/TownCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public class TownCommand extends BaseCommand implements CommandExecutor, TabComp
"join",
"invite"
));
static final List<String> townSetTabCompletes = new ArrayList<>(Arrays.asList(
private static final List<String> townSetTabCompletes = new ArrayList<>(Arrays.asList(
"board",
"mayor",
"homeblock",
Expand Down Expand Up @@ -157,7 +157,7 @@ public class TownCommand extends BaseCommand implements CommandExecutor, TabComp
"list"
));

private static final List<String> townAddRemoveTabCompletes = new ArrayList<>(Arrays.asList(
static final List<String> townAddRemoveTabCompletes = new ArrayList<>(Arrays.asList(
"add",
"remove"
));
Expand Down Expand Up @@ -251,7 +251,22 @@ public List<String> 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:
Expand Down Expand Up @@ -287,10 +302,14 @@ public List<String> 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:
Expand Down Expand Up @@ -338,7 +357,7 @@ public List<String> 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)
Expand All @@ -351,13 +370,13 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
return Collections.emptyList();
}

static List<String> townSetTabComplete(Player player, String[] args) {
static List<String> 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":
Expand All @@ -366,31 +385,12 @@ static List<String> 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<String> 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) {
Expand Down
30 changes: 26 additions & 4 deletions src/com/palmergames/bukkit/towny/command/TownyAdminCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ public List<String> 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]);
Expand Down Expand Up @@ -316,11 +317,28 @@ public List<String> 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]);
Expand All @@ -342,7 +360,11 @@ public List<String> 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");
Expand Down
47 changes: 0 additions & 47 deletions src/com/palmergames/bukkit/towny/utils/NameUtil.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -50,49 +48,4 @@ public static List<String> filterByStart(List<String> 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<String> 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<String> 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<String> 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();
}
}
}

0 comments on commit 71a2126

Please sign in to comment.