Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TrustTown command #6276

Merged
merged 7 commits into from
Nov 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions resources/lang/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1835,5 +1835,5 @@ msg_town_plots_type_line: '<dark_green>%s: <green>%s <gray>/ <aqua>%s <gray>/ <y
#Part of the /town plots output.
msg_town_plots_type_line_revenue: ' <gray>/ <dark_green>%s'



#Message giving confirmation warning for trusttown
confirmation_msg_trusttown_consequences: 'You are about to give full plot permissions to an entire town. This means that the mayor of the town will be able to decide who gets permission to build and break in your town, by adding residents. If this town is open, then anyone can join and gain full access to your town. Are you sure you wish to trust all residents (including future residents,) from this town?'
2 changes: 2 additions & 0 deletions resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ permissions:
towny.command.town.merge: true
towny.command.town.unjail: true
towny.command.town.trust: true
towny.command.town.trusttown: true

towny.command.town.list:
description: Users are able to use the default method of sorting the town list.
Expand Down Expand Up @@ -678,6 +679,7 @@ permissions:
towny.command.townyadmin.town.spawn.*: true
towny.command.townyadmin.town.toggle: true
towny.command.townyadmin.town.trust: true
towny.command.townyadmin.town.trusttown: true
towny.command.townyadmin.town.unruin: true
towny.command.townyadmin.town.withdraw: true

Expand Down
10 changes: 10 additions & 0 deletions src/com/palmergames/bukkit/towny/command/HelpMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -880,6 +880,16 @@ protected MenuBuilder load() {
}
},

TOWN_TRUSTTOWN_HELP {
@Override
protected MenuBuilder load() {
return new MenuBuilder("town trusttown")
.add("add [town]", "")
.add("remove [town]", "")
.add("list", "");
}
},

PLOT_GROUP_TRUST_HELP {
@Override
protected MenuBuilder load() {
Expand Down
93 changes: 93 additions & 0 deletions src/com/palmergames/bukkit/towny/command/TownCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
import com.palmergames.bukkit.towny.event.town.toggle.TownTogglePVPEvent;
import com.palmergames.bukkit.towny.event.town.toggle.TownTogglePublicEvent;
import com.palmergames.bukkit.towny.event.town.toggle.TownToggleTaxPercentEvent;
import com.palmergames.bukkit.towny.event.town.TownTrustTownAddEvent;
import com.palmergames.bukkit.towny.event.town.TownTrustTownRemoveEvent;
import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException;
import com.palmergames.bukkit.towny.exceptions.InvalidNameException;
import com.palmergames.bukkit.towny.exceptions.NoPermissionException;
Expand Down Expand Up @@ -79,6 +81,7 @@
import com.palmergames.bukkit.towny.object.jail.Jail;
import com.palmergames.bukkit.towny.object.jail.JailReason;
import com.palmergames.bukkit.towny.object.jail.UnJailReason;
import com.palmergames.bukkit.towny.object.TownyObject;
import com.palmergames.bukkit.towny.permissions.PermissionNodes;
import com.palmergames.bukkit.towny.permissions.TownyPermissionSource;
import com.palmergames.bukkit.towny.permissions.TownyPerms;
Expand Down Expand Up @@ -183,6 +186,7 @@ public class TownCommand extends BaseCommand implements CommandExecutor {
"jail",
"unjail",
"trust",
"trusttown",
"allylist",
"enemylist",
"baltop"
Expand Down Expand Up @@ -498,6 +502,23 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
default:
return Collections.emptyList();
}
case "trusttown":
switch (args.length) {
case 2:
return NameUtil.filterByStart(Arrays.asList("add", "remove", "list"), args[1]);
case 3:
if (args[1].equalsIgnoreCase("add")) {
List<String> townsList = getTownyStartingWith(args[2], "t");
townsList.removeAll(getTrustedTownsFromResident(player));
return townsList;
LlmDl marked this conversation as resolved.
Show resolved Hide resolved
}
if (args[1].equalsIgnoreCase("remove")) {
return NameUtil.filterByStart(getTrustedTownsFromResident(player), args[2]);
}
return Collections.emptyList();
default:
return Collections.emptyList();
}
default:
if (args.length == 1)
return filterByStartOrGetTownyStartingWith(TownyCommandAddonAPI.getTabCompletes(CommandType.TOWN, townTabCompletes), args[0], "t");
Expand Down Expand Up @@ -802,6 +823,10 @@ private void parseTownCommand(final Player player, String[] split) throws TownyE
catchRuinedTown(player);
parseTownTrustCommand(player, StringMgmt.remFirstArg(split), null);
break;
case "trusttown":
catchRuinedTown(player);
parseTownTrustTownCommand(player, StringMgmt.remFirstArg(split), null);
break;
case "baltop":
catchRuinedTown(player);
town = split.length > 1 ? getTownOrThrow(split[1]) : getTownFromPlayerOrThrow(player);
Expand Down Expand Up @@ -4148,6 +4173,74 @@ public static void parseTownTrustCommand(CommandSender sender, String[] args, @N
town.save();
}

public static void parseTownTrustTownCommand(CommandSender sender, String[] args, @Nullable Town town) throws TownyException {

if (args.length < 1
|| args.length < 2 && ("add".equalsIgnoreCase(args[0]) || "remove".equalsIgnoreCase(args[0]))
|| args.length == 1 && !"list".equalsIgnoreCase(args[0])) {
HelpMenu.TOWN_TRUSTTOWN_HELP.send(sender);
return;
}

if (town == null && sender instanceof Player player) {
town = getTownFromPlayerOrThrow(player);
}
if ("list".equalsIgnoreCase(args[0])) {
TownyMessaging.sendMessage(sender, TownyFormatter.getFormattedTownyObjects(Translatable.of("status_trustedlist").forLocale(sender), new ArrayList<>(town.getTrustedTowns())));
return;
}

checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWN_TRUSTTOWN.getNode());

Town trustTown = getTownOrThrow(args[1]);

if (args[0].equalsIgnoreCase("add")) {
LlmDl marked this conversation as resolved.
Show resolved Hide resolved
if (town.hasTrustedTown(trustTown)) {
TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_already_trusted", trustTown.getName(), Translatable.of("town_sing")));
return;
}
else if (town == trustTown) {
TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_already_trusted", trustTown.getName(), Translatable.of("town_sing")));
return;
}
BukkitTools.ifCancelledThenThrow(new TownTrustTownAddEvent(sender, trustTown, town));
@Nullable Town finalTown = town;
Confirmation.runOnAccept(()-> {
trustTown.getResidents().forEach(res -> plugin.deleteCache(res));

TownyMessaging.sendMsg(sender, Translatable.of("msg_trusted_added", trustTown.getName(), Translatable.of("town_sing")));
finalTown.addTrustedTown(trustTown);
})
.setTitle(Translatable.of("confirmation_msg_trusttown_consequences"))
.sendTo(sender);
} else if (args[0].equalsIgnoreCase("remove")) {
LlmDl marked this conversation as resolved.
Show resolved Hide resolved
if (!town.hasTrustedTown(trustTown)) {
TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_not_trusted", trustTown.getName(), Translatable.of("town_sing")));
return;
}
BukkitTools.ifCancelledThenThrow(new TownTrustTownRemoveEvent(sender, trustTown, town));
town.removeTrustedTown(trustTown);
trustTown.getResidents().forEach(res -> plugin.deleteCache(res));
TownyMessaging.sendMsg(sender, Translatable.of("msg_trusted_removed", trustTown.getName(), Translatable.of("town_sing")));
} else {
TownyMessaging.sendErrorMsg(sender, Translatable.of("msg_err_invalid_property", args[0]));
return;
}

town.save();
}

public static List<String> getTrustedTownsFromResident(Player player){
Resident res = TownyUniverse.getInstance().getResident(player.getUniqueId());

if (res != null && res.hasTown()) {
return res.getTownOrNull().getTrustedTowns().stream().map(TownyObject::getName)
.collect(Collectors.toList());
}

return Collections.emptyList();
}

private static int homeBlockDistance(Town town1, Town town2) {
try {
return (int) Math.sqrt((Math.abs(town1.getHomeBlock().getX() - town2.getHomeBlock().getX())^2) + (Math.abs(town1.getHomeBlock().getZ() - town2.getHomeBlock().getZ())^2));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ public class TownyAdminCommand extends BaseCommand implements CommandExecutor {
"invite",
"unruin",
"trust",
"trusttown",
"checkoutposts",
"settownlevel",
"giveboughtblocks",
Expand Down Expand Up @@ -1478,6 +1479,9 @@ public void parseAdminTownCommand(String[] split) throws TownyException {
} else if (split[1].equalsIgnoreCase("trust")) {
checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_TOWN_TRUST.getNode());
TownCommand.parseTownTrustCommand(sender, StringMgmt.remArgs(split, 2), town);
} else if (split[1].equalsIgnoreCase("trusttown")) {
checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_TOWN_TRUSTTOWN.getNode());
TownCommand.parseTownTrustTownCommand(sender, StringMgmt.remArgs(split, 2), town);
} else if (split[1].equalsIgnoreCase("merge")) {
checkPermOrThrow(sender, PermissionNodes.TOWNY_COMMAND_TOWNYADMIN_TOWN_MERGE.getNode());
TownCommand.parseTownMergeCommand(sender, StringMgmt.remArgs(split, 2), town, true);
Expand Down
1 change: 1 addition & 0 deletions src/com/palmergames/bukkit/towny/db/SQL_Schema.java
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ private static List<String> getTownColumns() {
columns.add("`primaryJail` VARCHAR(36) DEFAULT NULL");
columns.add("`movedHomeBlockAt` BIGINT NOT NULL");
columns.add("`trustedResidents` mediumtext DEFAULT NULL");
columns.add("`trustedTowns` mediumtext NOT NULL");
columns.add("`nationZoneOverride` int(11) DEFAULT 0");
columns.add("`nationZoneEnabled` bool NOT NULL DEFAULT '1'");
columns.add("`allies` mediumtext NOT NULL");
Expand Down
9 changes: 9 additions & 0 deletions src/com/palmergames/bukkit/towny/db/TownyFlatFileSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,14 @@ else if (universe.getReplacementNameMap().containsKey(line))
town.addTrustedResident(resident);
}

line = keys.get("trustedTowns");
if (line != null && !line.isEmpty()) {
List<UUID> uuids = Arrays.stream(line.split(","))
.map(UUID::fromString)
.collect(Collectors.toList());
town.loadTrustedTowns(TownyAPI.getInstance().getTowns(uuids));
}

line = keys.get("mapColorHexCode");
if (line != null) {
try {
Expand Down Expand Up @@ -2026,6 +2034,7 @@ public boolean saveTown(Town town) {
list.add("primaryJail=" + town.getPrimaryJail().getUUID());

list.add("trustedResidents=" + StringMgmt.join(toUUIDList(town.getTrustedResidents()), ","));
list.add("trustedTowns=" + StringMgmt.join(town.getTrustedTownsUUIDS(), ","));

list.add("mapColorHexCode=" + town.getMapColorHexCode());
list.add("nationZoneOverride=" + town.getNationZoneOverride());
Expand Down
10 changes: 10 additions & 0 deletions src/com/palmergames/bukkit/towny/db/TownySQLSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -1169,6 +1169,15 @@ private boolean loadTown(ResultSet rs) {
town.addTrustedResident(resident);
}

line = rs.getString("trustedTowns");
if (line != null && !line.isEmpty()) {
search = (line.contains("#")) ? "#" : ",";
List<UUID> uuids = Arrays.stream(line.split(search))
.map(UUID::fromString)
.collect(Collectors.toList());
town.loadTrustedTowns(TownyAPI.getInstance().getTowns(uuids));
}

line = rs.getString("mapColorHexCode");
if (line != null)
town.setMapColorHexCode(line);
Expand Down Expand Up @@ -2219,6 +2228,7 @@ public synchronized boolean saveTown(Town town) {
twn_hm.put("primaryJail", town.getPrimaryJail().getUUID());

twn_hm.put("trustedResidents", StringMgmt.join(toUUIDList(town.getTrustedResidents()), "#"));
twn_hm.put("trustedTowns", StringMgmt.join(town.getTrustedTownsUUIDS(), "#"));

twn_hm.put("allies", StringMgmt.join(town.getAlliesUUIDs(), "#"));

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.palmergames.bukkit.towny.event.town;

import com.palmergames.bukkit.towny.event.CancellableTownyEvent;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.Translation;
import org.bukkit.command.CommandSender;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

public class TownTrustTownAddEvent extends CancellableTownyEvent {
LlmDl marked this conversation as resolved.
Show resolved Hide resolved
private final Town town;
private final Town trustTown;
private final CommandSender sender;
private static final HandlerList handlers = new HandlerList();

public TownTrustTownAddEvent(CommandSender sender, Town trustTown, Town town) {
this.town = town;
this.trustTown = trustTown;
this.sender = sender;
setCancelMessage(Translation.of("msg_err_command_disable"));
}

@NotNull
@Override
public HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}

/**
* @return The town where the town is being added as trusted.
*/
public Town getTown() {
return town;
}

/**
* @return The town that is being added as trusted.
*/
public Town getTrustedTown() {
return trustTown;
}

@NotNull
public CommandSender getSender() {
return sender;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.palmergames.bukkit.towny.event.town;

import com.palmergames.bukkit.towny.event.CancellableTownyEvent;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.Translation;
import org.bukkit.command.CommandSender;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

public class TownTrustTownRemoveEvent extends CancellableTownyEvent {
LlmDl marked this conversation as resolved.
Show resolved Hide resolved
private final Town town;
private final Town trustTown;
private final CommandSender sender;
private static final HandlerList handlers = new HandlerList();

public TownTrustTownRemoveEvent(CommandSender sender, Town trustTown, Town town) {
this.town = town;
this.trustTown = trustTown;
this.sender = sender;
setCancelMessage(Translation.of("msg_err_command_disable"));
}
@NotNull
@Override
public HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}

/**
* @return The town where the town is being removed as trusted.
*/
public Town getTown() {
return town;
}

/**
* @return The town that is being removed as trusted.
*/
public Town getTrustedTown() {
return trustTown;
}

public @NotNull CommandSender getSender() {
return sender;
}
}
Loading