Skip to content

Commit 205a7b7

Browse files
committed
Refactored to use Currency for balance operations
Replaced direct balance manipulation methods with `Currency`-based equivalents for consistency and multi-currency support. Deprecated older methods and introduced `WrappedCurrency` for compatibility with Vault's economy API. Updated placeholders and wrapper classes accordingly.
1 parent d978e3f commit 205a7b7

File tree

9 files changed

+203
-82
lines changed

9 files changed

+203
-82
lines changed

plugin/src/main/java/net/thenextlvl/service/placeholder/economy/ServiceBankPlaceholderStore.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package net.thenextlvl.service.placeholder.economy;
22

3+
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
34
import net.thenextlvl.service.ServicePlugin;
45
import net.thenextlvl.service.api.economy.bank.Bank;
56
import net.thenextlvl.service.api.economy.bank.BankController;
67
import net.thenextlvl.service.placeholder.api.PlaceholderStore;
78
import org.jspecify.annotations.NullMarked;
89

910
import java.math.BigDecimal;
11+
import java.util.Locale;
1012
import java.util.stream.Collectors;
1113

1214
@NullMarked
@@ -24,12 +26,17 @@ protected void registerResolvers() {
2426

2527
// %serviceio_bank_balance%
2628
registerResolver("bank_balance", (provider, player, matcher) -> {
27-
return provider.getBank(player).map(Bank::getBalance).orElse(BigDecimal.ZERO).toPlainString();
29+
return provider.getBank(player)
30+
.map(bank -> bank.getBalance(provider.getDefaultCurrency()))
31+
.orElse(BigDecimal.ZERO).toPlainString();
2832
});
2933

3034
// %serviceio_bank_balance_formatted%
3135
registerResolver("bank_balance_formatted", (provider, player, matcher) -> {
32-
return provider.format(provider.getBank(player).map(Bank::getBalance).orElse(BigDecimal.ZERO));
36+
var format = provider.getDefaultCurrency().format(provider.getBank(player)
37+
.map(bank -> bank.getBalance(provider.getDefaultCurrency()))
38+
.orElse(BigDecimal.ZERO), Locale.US);
39+
return PlainTextComponentSerializer.plainText().serialize(format);
3340
});
3441

3542
// %serviceio_bank_<world>%
@@ -43,14 +50,20 @@ protected void registerResolvers() {
4350
registerResolver("bank_%s_balance", (provider, player, matcher) -> {
4451
var world = plugin.getServer().getWorld(matcher.group(1));
4552
if (world == null) return null;
46-
return provider.getBank(player, world).map(Bank::getBalance).orElse(BigDecimal.ZERO).toPlainString();
53+
return provider.getBank(player, world)
54+
.map(bank -> bank.getBalance(provider.getDefaultCurrency()))
55+
.orElse(BigDecimal.ZERO)
56+
.toPlainString();
4757
});
4858

4959
// %serviceio_bank_<world>_balance_formatted%
5060
registerResolver("bank_%s_balance_formatted", (provider, player, matcher) -> {
5161
var world = plugin.getServer().getWorld(matcher.group(1));
5262
if (world == null) return null;
53-
return provider.format(provider.getBank(player, world).map(Bank::getBalance).orElse(BigDecimal.ZERO));
63+
var format = provider.getDefaultCurrency().format(provider.getBank(player, world)
64+
.map(bank -> bank.getBalance(provider.getDefaultCurrency()))
65+
.orElse(BigDecimal.ZERO), Locale.US);
66+
return PlainTextComponentSerializer.plainText().serialize(format);
5467
});
5568

5669
// %serviceio_banks%
Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package net.thenextlvl.service.placeholder.economy;
22

3+
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
34
import net.thenextlvl.service.ServicePlugin;
4-
import net.thenextlvl.service.api.economy.Account;
55
import net.thenextlvl.service.api.economy.EconomyController;
66
import net.thenextlvl.service.placeholder.api.PlaceholderStore;
77
import org.jspecify.annotations.NullMarked;
88

99
import java.math.BigDecimal;
10+
import java.util.Locale;
1011

1112
@NullMarked
1213
public class ServiceEconomyPlaceholderStore extends PlaceholderStore<EconomyController> {
@@ -18,26 +19,38 @@ public ServiceEconomyPlaceholderStore(ServicePlugin plugin) {
1819
protected void registerResolvers() {
1920
// %serviceio_balance%
2021
registerResolver("balance", (provider, player, matcher) -> {
21-
return provider.getAccount(player).map(Account::getBalance).orElse(BigDecimal.ZERO).toPlainString();
22+
return provider.getAccount(player)
23+
.map(account -> account.getBalance(provider.getDefaultCurrency()))
24+
.orElse(BigDecimal.ZERO)
25+
.toPlainString();
2226
});
2327

2428
// %serviceio_balance_<world>%
2529
registerResolver("balance_%s", (provider, player, matcher) -> {
2630
var world = plugin.getServer().getWorld(matcher.group(1));
2731
if (world == null) return null;
28-
return provider.getAccount(player, world).map(Account::getBalance).orElse(BigDecimal.ZERO).toPlainString();
32+
return provider.getAccount(player, world)
33+
.map(account -> account.getBalance(provider.getDefaultCurrency()))
34+
.orElse(BigDecimal.ZERO)
35+
.toPlainString();
2936
});
3037

3138
// %serviceio_balance_formatted%
3239
registerResolver("balance_formatted", (provider, player, matcher) -> {
33-
return provider.format(provider.getAccount(player).map(Account::getBalance).orElse(BigDecimal.ZERO));
40+
var format = provider.getDefaultCurrency().format(provider.getAccount(player)
41+
.map(account -> account.getBalance(provider.getDefaultCurrency()))
42+
.orElse(BigDecimal.ZERO), Locale.US);
43+
return PlainTextComponentSerializer.plainText().serialize(format);
3444
});
3545

3646
// %serviceio_balance_formatted_<world>%
3747
registerResolver("balance_formatted_%s", (provider, player, matcher) -> {
3848
var world = plugin.getServer().getWorld(matcher.group(1));
3949
if (world == null) return null;
40-
return provider.format(provider.getAccount(player, world).map(Account::getBalance).orElse(BigDecimal.ZERO));
50+
var format = provider.getDefaultCurrency().format(provider.getAccount(player, world)
51+
.map(account -> account.getBalance(provider.getDefaultCurrency()))
52+
.orElse(BigDecimal.ZERO), Locale.US);
53+
return PlainTextComponentSerializer.plainText().serialize(format);
4154
});
4255
}
4356
}

plugin/src/main/java/net/thenextlvl/service/wrapper/VaultEconomyServiceWrapper.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.thenextlvl.service.wrapper;
22

3+
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
34
import net.milkbowl.vault.economy.Economy;
45
import net.milkbowl.vault.economy.EconomyResponse;
56
import net.thenextlvl.service.api.economy.Account;
@@ -52,22 +53,25 @@ public boolean hasBankSupport() {
5253

5354
@Override
5455
public int fractionalDigits() {
55-
return economyController.fractionalDigits();
56+
return economyController.getDefaultCurrency().getFractionalDigits();
5657
}
5758

5859
@Override
5960
public String format(double amount) {
60-
return economyController.format(amount);
61+
var format = economyController.getDefaultCurrency().format(amount, Locale.US);
62+
return PlainTextComponentSerializer.plainText().serialize(format);
6163
}
6264

6365
@Override
6466
public String currencyNamePlural() {
65-
return economyController.getCurrencyNamePlural(Locale.US);
67+
var name = economyController.getDefaultCurrency().getDisplayNamePlural(Locale.US);
68+
return PlainTextComponentSerializer.plainText().serialize(name);
6669
}
6770

6871
@Override
6972
public String currencyNameSingular() {
70-
return economyController.getCurrencyNameSingular(Locale.US);
73+
var name = economyController.getDefaultCurrency().getDisplayNameSingular(Locale.US);
74+
return PlainTextComponentSerializer.plainText().serialize(name);
7175
}
7276

7377
@Override
@@ -110,7 +114,7 @@ public double getBalance(@Nullable String playerName, @Nullable String worldName
110114
@Override
111115
public double getBalance(@Nullable OfflinePlayer player, @Nullable String worldName) {
112116
return getAccount(player, worldName)
113-
.map(Account::getBalance)
117+
.map(account -> account.getBalance(economyController.getDefaultCurrency()))
114118
.map(Number::doubleValue)
115119
.orElse(0.0);
116120
}
@@ -154,8 +158,8 @@ public EconomyResponse withdrawPlayer(@Nullable String playerName, @Nullable Str
154158
@Override
155159
public EconomyResponse withdrawPlayer(@Nullable OfflinePlayer player, @Nullable String worldName, double amount) {
156160
return getAccount(player, worldName).map(account -> {
157-
var balance = account.getBalance();
158-
var withdraw = account.withdraw(amount);
161+
var balance = account.getBalance(economyController.getDefaultCurrency());
162+
var withdraw = account.withdraw(amount, economyController.getDefaultCurrency());
159163
var responseType = amount != 0 && balance.equals(withdraw) ? FAILURE : SUCCESS;
160164
return new EconomyResponse(amount, withdraw.doubleValue(), responseType, null);
161165
}).orElseGet(() -> new EconomyResponse(amount, 0, FAILURE, null));
@@ -180,8 +184,8 @@ public EconomyResponse depositPlayer(@Nullable String name, @Nullable String wor
180184
@Override
181185
public EconomyResponse depositPlayer(@Nullable OfflinePlayer player, @Nullable String worldName, double amount) {
182186
return getAccount(player, worldName).map(account -> {
183-
var balance = account.getBalance();
184-
var deposit = account.deposit(amount);
187+
var balance = account.getBalance(economyController.getDefaultCurrency());
188+
var deposit = account.deposit(amount, economyController.getDefaultCurrency());
185189
var responseType = amount != 0 && balance.equals(deposit) ? FAILURE : SUCCESS;
186190
return new EconomyResponse(amount, deposit.doubleValue(), responseType, null);
187191
}).orElseGet(() -> new EconomyResponse(amount, 0, FAILURE, null));
@@ -211,7 +215,8 @@ public EconomyResponse deleteBank(String name) {
211215
public EconomyResponse bankBalance(String name) {
212216
try {
213217
var bank = bankController().tryGetBank(name).join();
214-
return new EconomyResponse(0, bank.getBalance().doubleValue(), SUCCESS, null);
218+
var balance = bank.getBalance(economyController.getDefaultCurrency());
219+
return new EconomyResponse(0, balance.doubleValue(), SUCCESS, null);
215220
} catch (Exception e) {
216221
return new EconomyResponse(0, 0, FAILURE, e.getMessage());
217222
}
@@ -221,7 +226,7 @@ public EconomyResponse bankBalance(String name) {
221226
public EconomyResponse bankHas(String name, double amount) {
222227
try {
223228
var bank = bankController().tryGetBank(name).join();
224-
var balance = bank.getBalance().doubleValue();
229+
var balance = bank.getBalance(economyController.getDefaultCurrency()).doubleValue();
225230
var response = balance >= amount ? SUCCESS : FAILURE;
226231
return new EconomyResponse(amount, balance, response, null);
227232
} catch (Exception e) {
@@ -233,7 +238,7 @@ public EconomyResponse bankHas(String name, double amount) {
233238
public EconomyResponse bankWithdraw(String name, double amount) {
234239
try {
235240
var bank = bankController().tryGetBank(name).join();
236-
var balance = bank.withdraw(amount).doubleValue();
241+
var balance = bank.withdraw(amount, economyController.getDefaultCurrency()).doubleValue();
237242
var response = balance >= amount ? SUCCESS : FAILURE;
238243
return new EconomyResponse(amount, balance, response, null);
239244
} catch (Exception e) {
@@ -245,7 +250,7 @@ public EconomyResponse bankWithdraw(String name, double amount) {
245250
public EconomyResponse bankDeposit(String name, double amount) {
246251
try {
247252
var bank = bankController().tryGetBank(name).join();
248-
var balance = bank.deposit(amount).doubleValue();
253+
var balance = bank.deposit(amount, economyController.getDefaultCurrency()).doubleValue();
249254
var response = balance >= amount ? SUCCESS : FAILURE;
250255
return new EconomyResponse(amount, balance, response, null);
251256
} catch (Exception e) {
@@ -264,7 +269,8 @@ public EconomyResponse isBankOwner(String name, @Nullable OfflinePlayer player)
264269
try {
265270
var bank = bankController().tryGetBank(name).join();
266271
var response = player != null && bank.getOwner().equals(player.getUniqueId()) ? SUCCESS : FAILURE;
267-
return new EconomyResponse(0, bank.getBalance().doubleValue(), response, null);
272+
var balance = bank.getBalance(economyController.getDefaultCurrency());
273+
return new EconomyResponse(0, balance.doubleValue(), response, null);
268274
} catch (Exception e) {
269275
return new EconomyResponse(0, 0, FAILURE, e.getMessage());
270276
}
@@ -281,7 +287,8 @@ public EconomyResponse isBankMember(String name, @Nullable OfflinePlayer player)
281287
try {
282288
var bank = bankController().tryGetBank(name).join();
283289
var response = player != null && bank.isMember(player.getUniqueId()) ? SUCCESS : FAILURE;
284-
return new EconomyResponse(0, bank.getBalance().doubleValue(), response, null);
290+
var balance = bank.getBalance(economyController.getDefaultCurrency());
291+
return new EconomyResponse(0, balance.doubleValue(), response, null);
285292
} catch (Exception e) {
286293
return new EconomyResponse(0, 0, FAILURE, e.getMessage());
287294
}

plugin/src/main/java/net/thenextlvl/service/wrapper/service/BankServiceWrapper.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import net.milkbowl.vault.economy.EconomyResponse;
55
import net.thenextlvl.service.api.economy.bank.Bank;
66
import net.thenextlvl.service.api.economy.bank.BankController;
7-
import net.thenextlvl.service.wrapper.Wrapper;
87
import net.thenextlvl.service.wrapper.service.model.WrappedBank;
98
import org.bukkit.OfflinePlayer;
109
import org.bukkit.World;
@@ -22,20 +21,17 @@
2221
public class BankServiceWrapper implements BankController, Wrapper {
2322
private final Economy economy;
2423
private final Plugin provider;
24+
private final Currency currency;
2525

2626
public BankServiceWrapper(Economy economy, Plugin provider) {
27+
this.currency = new WrappedCurrency(economy);
2728
this.economy = economy;
2829
this.provider = provider;
2930
}
3031

3132
@Override
32-
public String format(Number amount) {
33-
return economy.format(amount.doubleValue());
34-
}
35-
36-
@Override
37-
public int fractionalDigits() {
38-
return economy.fractionalDigits();
33+
public Currency getDefaultCurrency() {
34+
return currency;
3935
}
4036

4137
@Override
@@ -103,7 +99,7 @@ public CompletableFuture<Boolean> deleteBank(UUID uuid, World world) {
10399
@Override
104100
public @Unmodifiable Set<Bank> getBanks() {
105101
return economy.getBanks().stream()
106-
.map(bank -> new WrappedBank(bank, null, economy, provider))
102+
.map(bank -> new WrappedBank(bank, null, economy, plugin))
107103
.collect(Collectors.toUnmodifiableSet());
108104
}
109105

@@ -114,7 +110,7 @@ public CompletableFuture<Boolean> deleteBank(UUID uuid, World world) {
114110

115111
@Override
116112
public Optional<Bank> getBank(String name) {
117-
return Optional.of(new WrappedBank(name, null, economy, provider));
113+
return Optional.of(new WrappedBank(this, name, null, economy, provider));
118114
}
119115

120116
@Override

plugin/src/main/java/net/thenextlvl/service/wrapper/service/EconomyServiceWrapper.java

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import net.milkbowl.vault.economy.Economy;
44
import net.thenextlvl.service.api.economy.Account;
5+
import net.thenextlvl.service.api.economy.currency.Currency;
56
import net.thenextlvl.service.api.economy.EconomyController;
67
import net.thenextlvl.service.wrapper.Wrapper;
78
import net.thenextlvl.service.wrapper.service.model.WrappedAccount;
@@ -12,7 +13,6 @@
1213
import org.jspecify.annotations.NullMarked;
1314

1415
import java.util.Arrays;
15-
import java.util.Locale;
1616
import java.util.Optional;
1717
import java.util.Set;
1818
import java.util.UUID;
@@ -21,34 +21,16 @@
2121

2222
@NullMarked
2323
public class EconomyServiceWrapper implements EconomyController, Wrapper {
24+
private final Currency currency;
2425
private final Economy economy;
2526
private final Plugin provider;
2627

2728
public EconomyServiceWrapper(Economy economy, Plugin provider) {
29+
this.currency = new WrappedCurrency(economy);
2830
this.economy = economy;
2931
this.provider = provider;
3032
}
3133

32-
@Override
33-
public String format(Number amount) {
34-
return economy.format(amount.doubleValue());
35-
}
36-
37-
@Override
38-
public String getCurrencyNamePlural(Locale locale) {
39-
return economy.currencyNamePlural();
40-
}
41-
42-
@Override
43-
public String getCurrencyNameSingular(Locale locale) {
44-
return economy.currencyNameSingular();
45-
}
46-
47-
@Override
48-
public String getCurrencySymbol() {
49-
return "";
50-
}
51-
5234
@Override
5335
public CompletableFuture<@Unmodifiable Set<Account>> loadAccounts() {
5436
return CompletableFuture.completedFuture(getAccounts());
@@ -58,20 +40,20 @@ public String getCurrencySymbol() {
5840
public @Unmodifiable Set<Account> getAccounts() {
5941
return Arrays.stream(provider.getServer().getOfflinePlayers())
6042
.filter(economy::hasAccount)
61-
.map(player -> new WrappedAccount(null, economy, player))
43+
.map(player -> new WrappedAccount(this, null, economy, player))
6244
.collect(Collectors.toUnmodifiableSet());
6345
}
6446

6547
@Override
6648
public Optional<Account> getAccount(OfflinePlayer player) {
6749
if (!economy.hasAccount(player)) return Optional.empty();
68-
return Optional.of(new WrappedAccount(null, economy, player));
50+
return Optional.of(new WrappedAccount(this, null, economy, player));
6951
}
7052

7153
@Override
7254
public Optional<Account> getAccount(OfflinePlayer player, World world) {
7355
if (!economy.hasAccount(player, world.getName())) return Optional.empty();
74-
return Optional.of(new WrappedAccount(world, economy, player));
56+
return Optional.of(new WrappedAccount(this, world, economy, player));
7557
}
7658

7759
@Override
@@ -137,8 +119,8 @@ public CompletableFuture<Boolean> deleteAccount(UUID uuid, World world) {
137119
}
138120

139121
@Override
140-
public int fractionalDigits() {
141-
return economy.fractionalDigits();
122+
public Currency getDefaultCurrency() {
123+
return currency;
142124
}
143125

144126
@Override

0 commit comments

Comments
 (0)