|
| 1 | +package io.github.md5sha256.realty.command; |
| 2 | + |
| 3 | +import io.github.md5sha256.realty.api.RealtyPaperApi; |
| 4 | +import io.github.md5sha256.realty.api.WorldGuardRegion; |
| 5 | +import io.github.md5sha256.realty.command.util.AuthorityParser; |
| 6 | +import io.github.md5sha256.realty.command.util.WorldGuardRegionResolver; |
| 7 | +import io.github.md5sha256.realty.localisation.MessageContainer; |
| 8 | +import io.github.md5sha256.realty.localisation.MessageKeys; |
| 9 | +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; |
| 10 | +import org.bukkit.Bukkit; |
| 11 | +import org.bukkit.OfflinePlayer; |
| 12 | +import org.bukkit.command.CommandSender; |
| 13 | +import org.bukkit.entity.Player; |
| 14 | +import org.incendo.cloud.Command; |
| 15 | +import org.incendo.cloud.context.CommandContext; |
| 16 | +import org.incendo.cloud.paper.util.sender.Source; |
| 17 | +import org.jetbrains.annotations.NotNull; |
| 18 | + |
| 19 | +import java.util.UUID; |
| 20 | + |
| 21 | +/** |
| 22 | + * Handles {@code /realty transfer <titleholder> [region]}. |
| 23 | + * |
| 24 | + * <p>Transfers freehold ownership to the given player and clears the listed price. |
| 25 | + * Equivalent to {@code /realty set titleholder} followed by clearing the price atomically.</p> |
| 26 | + * |
| 27 | + * <p>Permission: {@code realty.command.transfer} (or {@code realty.command.transfer.others} |
| 28 | + * to transfer regions you don't own).</p> |
| 29 | + */ |
| 30 | +public record TransferCommand( |
| 31 | + @NotNull RealtyPaperApi api, |
| 32 | + @NotNull MessageContainer messages |
| 33 | +) implements CustomCommandBean.Single { |
| 34 | + |
| 35 | + private static @NotNull String resolveName(@NotNull UUID uuid) { |
| 36 | + OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); |
| 37 | + String name = player.getName(); |
| 38 | + return name != null ? name : uuid.toString(); |
| 39 | + } |
| 40 | + |
| 41 | + @Override |
| 42 | + public @NotNull Command<? extends Source> command(@NotNull Command.Builder<Source> builder) { |
| 43 | + return builder |
| 44 | + .literal("transfer") |
| 45 | + .permission("realty.command.transfer") |
| 46 | + .required("titleholder", AuthorityParser.authority()) |
| 47 | + .optional("region", WorldGuardRegionResolver.worldGuardRegionResolver()) |
| 48 | + .handler(this::execute) |
| 49 | + .build(); |
| 50 | + } |
| 51 | + |
| 52 | + private void execute(@NotNull CommandContext<Source> ctx) { |
| 53 | + CommandSender sender = ctx.sender().source(); |
| 54 | + UUID titleHolderId = ctx.get("titleholder"); |
| 55 | + WorldGuardRegion region = ctx.<WorldGuardRegion>optional("region") |
| 56 | + .orElseGet(() -> sender instanceof Player player |
| 57 | + ? WorldGuardRegionResolver.resolveAtLocation(player.getLocation()) : null); |
| 58 | + if (region == null) { |
| 59 | + sender.sendMessage(messages.messageFor(MessageKeys.ERROR_NO_REGION)); |
| 60 | + return; |
| 61 | + } |
| 62 | + String regionId = region.region().getId(); |
| 63 | + if (sender instanceof Player player |
| 64 | + && !sender.hasPermission("realty.command.transfer.others") |
| 65 | + && !region.region().getOwners().contains(player.getUniqueId())) { |
| 66 | + sender.sendMessage(messages.messageFor(MessageKeys.TRANSFER_NO_PERMISSION)); |
| 67 | + return; |
| 68 | + } |
| 69 | + api.transferTitleHolder(region, titleHolderId).thenAccept(result -> { |
| 70 | + switch (result) { |
| 71 | + case RealtyPaperApi.SetTitleHolderResult.Success success -> |
| 72 | + sender.sendMessage(messages.messageFor(MessageKeys.TRANSFER_SUCCESS, |
| 73 | + Placeholder.unparsed("titleholder", resolveName(titleHolderId)), |
| 74 | + Placeholder.unparsed("region", success.regionId()))); |
| 75 | + case RealtyPaperApi.SetTitleHolderResult.NoFreeholdContract noContract -> |
| 76 | + sender.sendMessage(messages.messageFor(MessageKeys.TRANSFER_NO_FREEHOLD_CONTRACT, |
| 77 | + Placeholder.unparsed("region", noContract.regionId()))); |
| 78 | + case RealtyPaperApi.SetTitleHolderResult.UpdateFailed updateFailed -> |
| 79 | + sender.sendMessage(messages.messageFor(MessageKeys.TRANSFER_UPDATE_FAILED, |
| 80 | + Placeholder.unparsed("region", updateFailed.regionId()))); |
| 81 | + case RealtyPaperApi.SetTitleHolderResult.Error error -> |
| 82 | + sender.sendMessage(messages.messageFor(MessageKeys.TRANSFER_ERROR, |
| 83 | + Placeholder.unparsed("error", error.message()))); |
| 84 | + } |
| 85 | + }); |
| 86 | + } |
| 87 | +} |
0 commit comments