Skip to content

Commit ba44058

Browse files
committed
commit missing file
1 parent 083cd48 commit ba44058

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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

Comments
 (0)