Skip to content

Commit 05c564d

Browse files
committed
Refactor extend command to do econ checks first
1 parent 79914ca commit 05c564d

2 files changed

Lines changed: 76 additions & 49 deletions

File tree

realty-common/src/main/java/io/github/md5sha256/realty/database/RealtyLogicImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,25 @@ record NoExtensionsRemaining() implements RenewLeaseholdResult {}
714714
record UpdateFailed() implements RenewLeaseholdResult {}
715715
}
716716

717+
public @NotNull RenewLeaseholdResult previewRenewLeasehold(@NotNull String worldGuardRegionId,
718+
@NotNull UUID worldId) {
719+
try (SqlSessionWrapper wrapper = database.openSession()) {
720+
LeaseholdContractMapper leaseholdMapper = wrapper.leaseholdContractMapper();
721+
LeaseholdContractEntity lease = leaseholdMapper.selectByRegion(worldGuardRegionId, worldId);
722+
if (lease == null) {
723+
return new RenewLeaseholdResult.NoLeaseholdContract();
724+
}
725+
if (lease.maxExtensions() != null && lease.currentMaxExtensions() >= lease.maxExtensions()) {
726+
return new RenewLeaseholdResult.NoExtensionsRemaining();
727+
}
728+
long totalSeconds = lease.durationSeconds();
729+
long remainingSeconds = lease.endDate() == null ? 0
730+
: Math.max(0, java.time.Duration.between(java.time.LocalDateTime.now(), lease.endDate()).getSeconds());
731+
double refund = totalSeconds > 0 ? lease.price() * remainingSeconds / totalSeconds : 0;
732+
return new RenewLeaseholdResult.Success(lease.price(), refund, lease.landlordId());
733+
}
734+
}
735+
717736
public @NotNull RenewLeaseholdResult renewLeasehold(@NotNull String worldGuardRegionId,
718737
@NotNull UUID worldId,
719738
@NotNull UUID tenantId) {

realty-paper/src/main/java/io/github/md5sha256/realty/command/ExtendCommand.java

Lines changed: 57 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -60,64 +60,72 @@ private void execute(@NotNull CommandContext<CommandSourceStack> ctx) {
6060
String regionId = region.region().getId();
6161
CompletableFuture.supplyAsync(() -> {
6262
try {
63-
RealtyLogicImpl.RenewLeaseholdResult result = logic.renewLeasehold(
64-
regionId, region.world().getUID(), sender.getUniqueId());
65-
return switch (result) {
66-
case RealtyLogicImpl.RenewLeaseholdResult.Success success -> {
67-
Map<String, String> placeholders = logic.getRegionPlaceholders(regionId, region.world().getUID());
68-
yield Map.entry(success, placeholders);
69-
}
70-
case RealtyLogicImpl.RenewLeaseholdResult.NoLeaseholdContract ignored -> {
71-
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_NO_LEASEHOLD_CONTRACT,
72-
Placeholder.unparsed("region", regionId)));
73-
yield null;
74-
}
75-
case RealtyLogicImpl.RenewLeaseholdResult.NoExtensionsRemaining ignored -> {
76-
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_NO_EXTENSIONS,
77-
Placeholder.unparsed("region", regionId)));
78-
yield null;
79-
}
80-
case RealtyLogicImpl.RenewLeaseholdResult.UpdateFailed ignored -> {
81-
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_UPDATE_FAILED,
82-
Placeholder.unparsed("region", regionId)));
83-
yield null;
84-
}
85-
};
63+
return logic.previewRenewLeasehold(regionId, region.world().getUID());
8664
} catch (Exception ex) {
8765
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_ERROR,
8866
Placeholder.unparsed("error", ex.getMessage())));
8967
return null;
9068
}
91-
}, executorState.dbExec()).thenAcceptAsync(entry -> {
92-
if (entry == null) {
69+
}, executorState.dbExec()).thenAcceptAsync(preview -> {
70+
if (preview == null) {
9371
return;
9472
}
95-
RealtyLogicImpl.RenewLeaseholdResult.Success success = entry.getKey();
96-
Map<String, String> placeholders = entry.getValue();
97-
double price = success.price();
98-
double refund = success.refund();
99-
double cost = Math.max(0, price - refund);
100-
double balance = economy.getBalance(sender);
101-
if (balance < cost) {
102-
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_INSUFFICIENT_FUNDS,
103-
Placeholder.unparsed("balance", CurrencyFormatter.format(balance)),
104-
Placeholder.unparsed("price", CurrencyFormatter.format(cost))));
105-
return;
106-
}
107-
if (cost > 0) {
108-
EconomyResponse response = economy.withdrawPlayer(sender, cost);
109-
if (!response.transactionSuccess()) {
110-
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_PAYMENT_FAILED,
111-
Placeholder.unparsed("error", response.errorMessage)));
112-
return;
73+
switch (preview) {
74+
case RealtyLogicImpl.RenewLeaseholdResult.NoLeaseholdContract ignored ->
75+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_NO_LEASEHOLD_CONTRACT,
76+
Placeholder.unparsed("region", regionId)));
77+
case RealtyLogicImpl.RenewLeaseholdResult.NoExtensionsRemaining ignored ->
78+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_NO_EXTENSIONS,
79+
Placeholder.unparsed("region", regionId)));
80+
case RealtyLogicImpl.RenewLeaseholdResult.UpdateFailed ignored ->
81+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_UPDATE_FAILED,
82+
Placeholder.unparsed("region", regionId)));
83+
case RealtyLogicImpl.RenewLeaseholdResult.Success success -> {
84+
double cost = Math.max(0, success.price() - success.refund());
85+
double balance = economy.getBalance(sender);
86+
if (balance < cost) {
87+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_INSUFFICIENT_FUNDS,
88+
Placeholder.unparsed("balance", CurrencyFormatter.format(balance)),
89+
Placeholder.unparsed("price", CurrencyFormatter.format(cost))));
90+
return;
91+
}
92+
if (cost > 0) {
93+
EconomyResponse response = economy.withdrawPlayer(sender, cost);
94+
if (!response.transactionSuccess()) {
95+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_PAYMENT_FAILED,
96+
Placeholder.unparsed("error", response.errorMessage)));
97+
return;
98+
}
99+
OfflinePlayer landlord = Bukkit.getOfflinePlayer(success.landlordId());
100+
economy.depositPlayer(landlord, cost);
101+
}
102+
CompletableFuture.supplyAsync(() -> {
103+
try {
104+
RealtyLogicImpl.RenewLeaseholdResult result = logic.renewLeasehold(
105+
regionId, region.world().getUID(), sender.getUniqueId());
106+
if (result instanceof RealtyLogicImpl.RenewLeaseholdResult.Success) {
107+
return logic.getRegionPlaceholders(regionId, region.world().getUID());
108+
}
109+
return null;
110+
} catch (Exception ex) {
111+
return null;
112+
}
113+
}, executorState.dbExec()).thenAcceptAsync(placeholders -> {
114+
if (placeholders == null) {
115+
if (cost > 0) {
116+
economy.depositPlayer(sender, cost);
117+
}
118+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_UPDATE_FAILED,
119+
Placeholder.unparsed("region", regionId)));
120+
return;
121+
}
122+
signTextApplicator.updateLoadedSigns(region.world(), regionId, RegionState.LEASED, placeholders);
123+
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_SUCCESS,
124+
Placeholder.unparsed("region", regionId),
125+
Placeholder.unparsed("price", CurrencyFormatter.format(cost))));
126+
}, executorState.mainThreadExec());
113127
}
114-
OfflinePlayer landlord = Bukkit.getOfflinePlayer(success.landlordId());
115-
economy.depositPlayer(landlord, cost);
116128
}
117-
signTextApplicator.updateLoadedSigns(region.world(), regionId, RegionState.LEASED, placeholders);
118-
sender.sendMessage(messages.messageFor(MessageKeys.EXTEND_SUCCESS,
119-
Placeholder.unparsed("region", regionId),
120-
Placeholder.unparsed("price", CurrencyFormatter.format(cost))));
121129
}, executorState.mainThreadExec());
122130
}
123131

0 commit comments

Comments
 (0)