mirror of
https://github.com/xHyroM/lighteco.git
synced 2024-12-22 12:31:05 +01:00
feat: vault, papi
This commit is contained in:
parent
eafed192d3
commit
4213601132
7 changed files with 155 additions and 17 deletions
|
@ -36,4 +36,22 @@ public interface User {
|
|||
* @param balance the balance
|
||||
*/
|
||||
void setBalance(@NonNull Currency currency, @NonNull BigDecimal balance);
|
||||
|
||||
/**
|
||||
* Add the specified amount to the balance of this user for the specified currency.
|
||||
*
|
||||
* @param currency the currency
|
||||
* @param amount the amount
|
||||
* @throws IllegalArgumentException if the amount is negative
|
||||
*/
|
||||
void deposit(@NonNull Currency currency, @NonNull BigDecimal amount) throws IllegalArgumentException;
|
||||
|
||||
/**
|
||||
* Subtract the specified amount from the balance of this user for the specified currency.
|
||||
*
|
||||
* @param currency the currency
|
||||
* @param amount the amount
|
||||
* @throws IllegalArgumentException if the amount is negative
|
||||
*/
|
||||
void withdraw(@NonNull Currency currency, @NonNull BigDecimal amount) throws IllegalArgumentException;
|
||||
}
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package dev.xhyrom.lighteco.bukkit.hooks;
|
||||
|
||||
import dev.xhyrom.lighteco.bukkit.BukkitLightEcoPlugin;
|
||||
import dev.xhyrom.lighteco.common.model.currency.Currency;
|
||||
import dev.xhyrom.lighteco.common.model.user.User;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
@ -28,6 +31,21 @@ public class PlaceholderAPIExpansion extends PlaceholderExpansion {
|
|||
|
||||
@Override
|
||||
public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) {
|
||||
String[] args = params.split("_");
|
||||
if (args.length < 2) return null;
|
||||
|
||||
String currencyIdentifier = args[0];
|
||||
String type = args[1];
|
||||
|
||||
Currency currency = this.plugin.getCurrencyManager().getIfLoaded(currencyIdentifier);
|
||||
if (currency == null) return null;
|
||||
|
||||
if (type.equalsIgnoreCase("balance")) {
|
||||
User user = this.plugin.getUserManager().loadUser(player.getUniqueId()).join();
|
||||
|
||||
return user.getBalance(currency).toPlainString();
|
||||
}
|
||||
|
||||
return "lighteco";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@ public class BukkitCommandManager extends AbstractCommandManager {
|
|||
|
||||
// Dont expose set, give, take directly - only through main command
|
||||
new CommandAPICommand(currency.getIdentifier())
|
||||
.withPermission("lighteco.currency." + currency.getIdentifier() + ".command")
|
||||
.withSubcommand(new SetCommand(this, currency, permissionBase).build())
|
||||
.withSubcommand(new GiveCommand(this, currency, permissionBase).build())
|
||||
.withSubcommand(new TakeCommand(this, currency, permissionBase).build())
|
||||
|
|
|
@ -42,4 +42,22 @@ public class ApiUser implements User {
|
|||
|
||||
this.handler.setBalance(internal, balance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deposit(@NonNull Currency currency, @NonNull BigDecimal amount) {
|
||||
dev.xhyrom.lighteco.common.model.currency.Currency internal = this.handler.getPlugin()
|
||||
.getCurrencyManager()
|
||||
.getIfLoaded(currency.getIdentifier());
|
||||
|
||||
this.handler.deposit(internal, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void withdraw(@NonNull Currency currency, @NonNull BigDecimal amount) {
|
||||
dev.xhyrom.lighteco.common.model.currency.Currency internal = this.handler.getPlugin()
|
||||
.getCurrencyManager()
|
||||
.getIfLoaded(currency.getIdentifier());
|
||||
|
||||
this.handler.withdraw(internal, amount);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -100,7 +100,16 @@ public abstract class AbstractCommandManager implements CommandManager {
|
|||
addToMustWait(sender.getUniqueId(), target.getUniqueId());
|
||||
amount = amount.setScale(currency.getProxy().fractionalDigits(), RoundingMode.DOWN);
|
||||
|
||||
target.setBalance(currency, amount);
|
||||
try {
|
||||
target.setBalance(currency, amount);
|
||||
} catch (IllegalArgumentException e) {
|
||||
sender.sendMessage(
|
||||
miniMessage.deserialize("<red>Cannot set negative money!")
|
||||
);
|
||||
|
||||
removeFromMustWait(target.getUniqueId(), sender.getUniqueId());
|
||||
return;
|
||||
}
|
||||
|
||||
sender.sendMessage(
|
||||
miniMessage.deserialize("<yellow>Set " + target.getUsername() + "'s balance to <gold>" + amount.toPlainString() + " <yellow>" + currency.getIdentifier())
|
||||
|
@ -115,7 +124,16 @@ public abstract class AbstractCommandManager implements CommandManager {
|
|||
addToMustWait(sender.getUniqueId(), target.getUniqueId());
|
||||
amount = amount.setScale(currency.getProxy().fractionalDigits(), RoundingMode.DOWN);
|
||||
|
||||
target.setBalance(currency, target.getBalance(currency).add(amount));
|
||||
try {
|
||||
target.deposit(currency, amount);
|
||||
} catch (IllegalArgumentException e) {
|
||||
sender.sendMessage(
|
||||
miniMessage.deserialize("<red>Cannot give negative money!")
|
||||
);
|
||||
|
||||
removeFromMustWait(target.getUniqueId(), sender.getUniqueId());
|
||||
return;
|
||||
}
|
||||
|
||||
sender.sendMessage(
|
||||
miniMessage.deserialize("<yellow>Gave " + target.getUsername() + " <gold>" + amount.toPlainString() + " <yellow>" + currency.getIdentifier())
|
||||
|
@ -130,7 +148,16 @@ public abstract class AbstractCommandManager implements CommandManager {
|
|||
addToMustWait(sender.getUniqueId(), target.getUniqueId());
|
||||
amount = amount.setScale(currency.getProxy().fractionalDigits(), RoundingMode.DOWN);
|
||||
|
||||
target.setBalance(currency, target.getBalance(currency).subtract(amount));
|
||||
try {
|
||||
target.withdraw(currency, amount);
|
||||
} catch (IllegalArgumentException e) {
|
||||
sender.sendMessage(
|
||||
miniMessage.deserialize("<red>Cannot take negative money!")
|
||||
);
|
||||
|
||||
removeFromMustWait(target.getUniqueId(), sender.getUniqueId());
|
||||
return;
|
||||
}
|
||||
|
||||
sender.sendMessage(
|
||||
miniMessage.deserialize("<yellow>Took <gold>" + amount.toPlainString() + " <yellow>" + currency.getIdentifier() + " from " + target.getUsername())
|
||||
|
@ -170,8 +197,8 @@ public abstract class AbstractCommandManager implements CommandManager {
|
|||
// subtract tax from amount
|
||||
BigDecimal taxedAmount = amount.subtract(tax);
|
||||
|
||||
target.setBalance(currency, target.getBalance(currency).add(taxedAmount));
|
||||
user.setBalance(currency, user.getBalance(currency).subtract(amount));
|
||||
target.deposit(currency, taxedAmount);
|
||||
user.withdraw(currency, amount);
|
||||
|
||||
// send message that will include original amount, taxed amount, tax rate - percentage amount and tax amount
|
||||
sender.sendMessage(
|
||||
|
|
|
@ -39,9 +39,34 @@ public class User {
|
|||
}
|
||||
|
||||
public void setBalance(@NonNull Currency currency, @NonNull BigDecimal balance) {
|
||||
if (balance.compareTo(BigDecimal.ZERO) < 0) {
|
||||
throw new IllegalArgumentException("Balance cannot be negative");
|
||||
}
|
||||
|
||||
balances.put(currency, balance);
|
||||
}
|
||||
|
||||
public void deposit(@NonNull Currency currency, @NonNull BigDecimal amount) throws IllegalArgumentException {
|
||||
if (amount.compareTo(BigDecimal.ZERO) < 0) {
|
||||
throw new IllegalArgumentException("Amount cannot be negative");
|
||||
}
|
||||
|
||||
setBalance(currency, getBalance(currency).add(amount));
|
||||
}
|
||||
|
||||
public void withdraw(@NonNull Currency currency, @NonNull BigDecimal amount) throws IllegalArgumentException {
|
||||
if (amount.compareTo(BigDecimal.ZERO) < 0) {
|
||||
throw new IllegalArgumentException("Amount cannot be negative");
|
||||
}
|
||||
|
||||
if (getBalance(currency).compareTo(amount) < 0) {
|
||||
// Withdraw all
|
||||
amount = getBalance(currency);
|
||||
}
|
||||
|
||||
setBalance(currency, getBalance(currency).subtract(amount));
|
||||
}
|
||||
|
||||
public void invalidateCaches() {
|
||||
balances.clear();
|
||||
}
|
||||
|
|
|
@ -7,10 +7,12 @@ import dev.xhyrom.lighteco.api.model.user.User;
|
|||
import net.milkbowl.vault.economy.AbstractEconomy;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class Vault extends AbstractEconomy {
|
||||
private final LightEco provider;
|
||||
|
@ -105,14 +107,39 @@ public class Vault extends AbstractEconomy {
|
|||
UUID uniqueId = Bukkit.getPlayerUniqueId(playerName);
|
||||
User user = provider.getUserManager().loadUser(uniqueId).join();
|
||||
|
||||
BigDecimal balance = user.getBalance(currency);
|
||||
BigDecimal newBalance = balance.subtract(BigDecimal.valueOf(amount));
|
||||
try {
|
||||
user.withdraw(currency, BigDecimal.valueOf(amount));
|
||||
} catch (IllegalArgumentException e) {
|
||||
return new EconomyResponse(
|
||||
amount,
|
||||
bigDecimalToDouble(user.getBalance(currency)),
|
||||
EconomyResponse.ResponseType.FAILURE,
|
||||
"Cannot withdraw negative funds"
|
||||
);
|
||||
}
|
||||
|
||||
user.setBalance(currency, newBalance);
|
||||
return saveUser(amount, user);
|
||||
}
|
||||
|
||||
provider.getUserManager().saveUser(user);
|
||||
@NotNull
|
||||
private EconomyResponse saveUser(double amount, User user) {
|
||||
try {
|
||||
provider.getUserManager().saveUser(user).get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
return new EconomyResponse(
|
||||
amount,
|
||||
bigDecimalToDouble(user.getBalance(currency)),
|
||||
EconomyResponse.ResponseType.FAILURE,
|
||||
"Cannot save user"
|
||||
);
|
||||
}
|
||||
|
||||
return new EconomyResponse(amount, bigDecimalToDouble(newBalance), EconomyResponse.ResponseType.SUCCESS, "");
|
||||
return new EconomyResponse(
|
||||
amount,
|
||||
bigDecimalToDouble(user.getBalance(currency)),
|
||||
EconomyResponse.ResponseType.SUCCESS,
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -125,14 +152,18 @@ public class Vault extends AbstractEconomy {
|
|||
UUID uniqueId = Bukkit.getPlayerUniqueId(playerName);
|
||||
User user = provider.getUserManager().loadUser(uniqueId).join();
|
||||
|
||||
BigDecimal balance = user.getBalance(currency);
|
||||
BigDecimal newBalance = balance.add(BigDecimal.valueOf(amount));
|
||||
try {
|
||||
user.deposit(currency, BigDecimal.valueOf(amount));
|
||||
} catch (IllegalArgumentException e) {
|
||||
return new EconomyResponse(
|
||||
amount,
|
||||
bigDecimalToDouble(user.getBalance(currency)),
|
||||
EconomyResponse.ResponseType.FAILURE,
|
||||
"Cannot deposit negative funds"
|
||||
);
|
||||
}
|
||||
|
||||
user.setBalance(currency, newBalance);
|
||||
|
||||
provider.getUserManager().saveUser(user);
|
||||
|
||||
return new EconomyResponse(amount, bigDecimalToDouble(newBalance), EconomyResponse.ResponseType.SUCCESS, "");
|
||||
return saveUser(amount, user);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue