Skip to content

Commit

Permalink
Add tab completing and command restrictions.
Browse files Browse the repository at this point in the history
  • Loading branch information
LlmDl committed Feb 19, 2025
1 parent 4246963 commit 66554c6
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,9 @@ else if (args.length == 3)
case 4:
switch (args[1].toLowerCase(Locale.ROOT)) {
case "add":
return NameUtil.filterByStart(TownyPerms.getNationRanks(), args[3]);
if (nation == null)
return Collections.emptyList();
return NameUtil.filterByStart(TownyPerms.getNationRanks(nation), args[3]);
case "remove": {
Resident rankHaver = TownyUniverse.getInstance().getResident(args[2]);
if (rankHaver != null)
Expand Down Expand Up @@ -737,30 +739,38 @@ public void nationRank(Player player, String[] split) throws TownyException {
*/
checkPermOrThrowWithMessage(player, PermissionNodes.TOWNY_COMMAND_NATION_RANK.getNode(rank.toLowerCase(Locale.ROOT)), Translatable.of("msg_no_permission_to_give_rank"));

Translatable nationWord = Translatable.of("nation_sing");
if (split[0].equalsIgnoreCase("add")) {
if (target.hasNationRank(rank)) // Must already have this rank
throw new TownyException(Translatable.of("msg_resident_already_has_rank", target.getName(), Translatable.of("nation_sing")));
throw new TownyException(Translatable.of("msg_resident_already_has_rank", target.getName(), nationWord));

if (TownyPerms.ranksWithNationLevelRequirementPresent()) {
int rankLevelReq = TownyPerms.getRankNationLevelReq(rank);
int levelNumber = target.getNationOrNull().getLevelNumber();
if (rankLevelReq > levelNumber)
throw new TownyException(Translatable.of("msg_town_or_nation_level_not_high_enough_for_this_rank", nationWord, rank, nationWord, levelNumber, rankLevelReq));
}

BukkitTools.ifCancelledThenThrow(new NationRankAddEvent(nation, rank, target));

target.addNationRank(rank);
TownyMessaging.sendMsg(player, Translatable.of("msg_you_have_given_rank", Translatable.of("nation_sing"), rank, target.getName()));
TownyMessaging.sendMsg(player, Translatable.of("msg_you_have_given_rank", nationWord, rank, target.getName()));
if (target.isOnline()) {
TownyMessaging.sendMsg(target.getPlayer(), Translatable.of("msg_you_have_been_given_rank", Translatable.of("nation_sing"), rank));
TownyMessaging.sendMsg(target.getPlayer(), Translatable.of("msg_you_have_been_given_rank", nationWord, rank));
plugin.deleteCache(TownyAPI.getInstance().getPlayer(target));
}
}

if (split[0].equalsIgnoreCase("remove")) {
if (!target.hasNationRank(rank)) // Doesn't have this rank
throw new TownyException(Translatable.of("msg_resident_doesnt_have_rank", target.getName(), Translatable.of("nation_sing")));
throw new TownyException(Translatable.of("msg_resident_doesnt_have_rank", target.getName(), nationWord));

BukkitTools.ifCancelledThenThrow(new NationRankRemoveEvent(nation, rank, target));

target.removeNationRank(rank);
TownyMessaging.sendMsg(player, Translatable.of("msg_you_have_taken_rank_from", Translatable.of("nation_sing"), rank, target.getName()));
TownyMessaging.sendMsg(player, Translatable.of("msg_you_have_taken_rank_from", nationWord, rank, target.getName()));
if (target.isOnline()) {
TownyMessaging.sendMsg(target.getPlayer(), Translatable.of("msg_you_have_had_rank_taken", Translatable.of("nation_sing"), rank));
TownyMessaging.sendMsg(target.getPlayer(), Translatable.of("msg_you_have_had_rank_taken", nationWord, rank));
plugin.deleteCache(TownyAPI.getInstance().getPlayer(target));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,9 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
case 4:
switch (args[1].toLowerCase(Locale.ROOT)) {
case "add":
return NameUtil.filterByStart(TownyPerms.getTownRanks(), args[3]);
if (town == null)
return Collections.emptyList();
return NameUtil.filterByStart(TownyPerms.getTownRanks(town), args[3]);
case "remove": {
Resident res = TownyUniverse.getInstance().getResident(args[2]);
if (res != null)
Expand Down Expand Up @@ -1805,6 +1807,13 @@ private void rankAdd(Player player, Resident target, String rank) throws TownyEx
if (target.hasTownRank(rank))
throw new TownyException(Translatable.of("msg_resident_already_has_rank", target.getName(), townWord));

if (TownyPerms.ranksWithTownLevelRequirementPresent()) {
int rankLevelReq = TownyPerms.getRankTownLevelReq(rank);
int levelNumber = target.getTownOrNull().getLevelNumber();
if (rankLevelReq > levelNumber)
throw new TownyException(Translatable.of("msg_town_or_nation_level_not_high_enough_for_this_rank", townWord, rank, townWord, levelNumber, rankLevelReq));
}

BukkitTools.ifCancelledThenThrow(new TownAddResidentRankEvent(target, rank, target.getTownOrNull()));

target.addTownRank(rank);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,7 @@ public boolean hasTownRank(String rank) {
}

public List<String> getTownRanks() {
if (!townRanks.isEmpty() && hasTown()) {
if (TownyPerms.ranksWithTownLevelRequirementPresent() && !townRanks.isEmpty() && hasTown()) {
ArrayList<String> out = new ArrayList<>();
for (String rank : new ArrayList<>(townRanks)) {
int requiredTownLevelForRank = TownyPerms.getRankTownLevelReq(rank);
Expand Down Expand Up @@ -663,7 +663,7 @@ public boolean hasNationRank(String rank) {
}

public List<String> getNationRanks() {
if (!nationRanks.isEmpty() && hasNation()) {
if (TownyPerms.ranksWithNationLevelRequirementPresent() && !nationRanks.isEmpty() && hasNation()) {
ArrayList<String> out = new ArrayList<>();
for (String rank : new ArrayList<>(nationRanks)) {
int requiredNationLevelForRank = TownyPerms.getRankTownLevelReq(rank);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.logging.Level;
import java.util.stream.Collectors;

/**
* @author ElgarL
Expand All @@ -60,6 +61,8 @@ public class TownyPerms {
private static final String RANKPREFIX_PREFIX = "towny.rankprefix.";
private static final String RANK_TOWN_LEVEL_REQUIREMENT_PREFIX = "towny.town_level_requirement.";
private static final String RANK_NATION_LEVEL_REQUIREMENT_PREFIX = "towny.nation_level_requirement.";
private static boolean ranksWithTownLevelRequirementPresent = false;
private static boolean ranksWithNationLevelRequirementPresent = false;

public static void initialize(Towny plugin) {
TownyPerms.plugin = plugin;
Expand Down Expand Up @@ -102,9 +105,10 @@ public static void loadPerms(@NotNull Path permsYMLPath) {
* Only do this once as we are really only interested in Towny perms.
*/
collectPermissions();


checkForLevelRequirementPerms();
}

/**
* Check that all the vital groups Towny relies on are present in the townyperms.yml.
* @throws TownyInitException - Thrown when a vital group is missing.
Expand Down Expand Up @@ -387,6 +391,12 @@ public static List<String> getTownRanks() {
return new ArrayList<String>(((MemorySection) perms.get("towns.ranks")).getKeys(false));
}

public static List<String> getTownRanks(Town town) {
if (!ranksWithTownLevelRequirementPresent())
return getTownRanks();
return getTownRanks().stream().filter(rank -> getRankTownLevelReq(rank) <= town.getLevelNumber()).collect(Collectors.toList());
}

/**
* Default permissions everyone in a town gets
*
Expand Down Expand Up @@ -435,6 +445,12 @@ public static List<String> getNationRanks() {
return new ArrayList<String>(((MemorySection) perms.get("nations.ranks")).getKeys(false));
}

public static List<String> getNationRanks(Nation nation) {
if (!ranksWithNationLevelRequirementPresent())
return getNationRanks();
return getNationRanks().stream().filter(rank -> getRankNationLevelReq(rank) <= nation.getLevelNumber()).collect(Collectors.toList());
}

/**
* Default permissions everyone in a nation gets
*
Expand Down Expand Up @@ -587,6 +603,12 @@ private static int getNodePriority(String node, int length) {
* TownLevel & NationLevel Rank Requirements
*/


private static void checkForLevelRequirementPerms() {
ranksWithNationLevelRequirementPresent = getNationRanks().stream().anyMatch(rank -> getNationRankPermissions(rank).stream().anyMatch(node -> node.startsWith(RANK_NATION_LEVEL_REQUIREMENT_PREFIX)));
ranksWithTownLevelRequirementPresent = getTownRanks().stream().anyMatch(rank -> getTownRankPermissions(rank).stream().anyMatch(node -> node.startsWith(RANK_TOWN_LEVEL_REQUIREMENT_PREFIX)));
}

public static int getRankTownLevelReq(String rank) {
for (String node : getTownRankPermissions(rank))
if (node.startsWith(RANK_TOWN_LEVEL_REQUIREMENT_PREFIX))
Expand All @@ -602,21 +624,11 @@ public static int getRankNationLevelReq(String rank) {
}

public static boolean ranksWithTownLevelRequirementPresent() {
for (String rank : getTownRanks()) {
for (String node : getTownRankPermissions(rank))
if (node.startsWith(RANK_TOWN_LEVEL_REQUIREMENT_PREFIX))
return true;
}
return false;
return ranksWithTownLevelRequirementPresent;
}

public static boolean ranksWithNationLevelRequirementPresent() {
for (String rank : getNationRanks()) {
for (String node : getNationRankPermissions(rank))
if (node.startsWith(RANK_NATION_LEVEL_REQUIREMENT_PREFIX))
return true;
}
return false;
return ranksWithNationLevelRequirementPresent;
}

/*
Expand Down
1 change: 1 addition & 0 deletions Towny/src/main/resources/lang/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,7 @@ msg_you_have_been_given_rank: 'You have been granted the %s rank of %s.'
msg_you_have_given_rank: 'You have granted the %s rank of %s to %s.'
msg_resident_not_your_town: 'That resident isn''t a member of a town!'
msg_resident_already_has_rank: '%s already holds this %s rank.'
msg_town_or_nation_level_not_high_enough_for_this_rank: "Your %s level is not high enough to assign the %s rank. Your %s's Level: %s/%s required."
msg_you_have_had_rank_taken: 'You have been demoted from the %s rank of %s.'
msg_you_have_taken_rank_from: 'You have removed the %s rank of %s from %s.'
msg_resident_doesnt_have_rank: '%s doesn''t hold this %s rank.'
Expand Down

0 comments on commit 66554c6

Please sign in to comment.