@@ -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