Mejores Practicas de la API Economy
Economy API trata de ser lo más abstracto posible para darle a los plugins económicos cierta flexibilidad en su operación. Con el fin de darles el mayor control posible a los plugins económicos, los plugins que consumen Economy API deberían seguir ciertos lineamientos cuando trabajan con la aplicación:
Retirando dinero
Los plugins no deberían confirmar si una cuenta posee fondos antes de intentar hacer el débito. Mientras esto puede sonar ilógico, le permite a los plugins económicos controlar completamente la manera en la que manejan los balances negativos.
Al verificar por ti mismo si la cuenta tiene suficiente dinero, evitas que el complemento económico (potencialmente) permita un saldo negativo. Por ejemplo, un complemento de economía podría querer permitir saldos negativos a administradores o jugadores con cierto permiso. Al realizar el control por ti mismo, quitas este poder del complemento económico.
Este código ilustra que no hacer:
import java.math.BigDecimal;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.service.economy.account.Account;
PluginContainer plugin = ...;
EconomyService service = ...;
Account account = ...;
BigDecimal requiredAmount = BigDecimal.valueOf(20);
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();
// BAD: Don't perform this check
if (account.getBalance(service.defaultCurrency()).compareTo(requiredAmount) < 0) {
// You don't have enough money!
} else {
// The account has enough, let's withdraw some cash!
account.withdraw(service.defaultCurrency(), requiredAmount, Cause.of(eventContext, plugin));
}
En lugar de esto, lo mejor que puedes hacer es simplemente retirar la cantidad que necesitas y verificar el ResultType de lo devuelto TransactionResult. Un complemento de economía que no quiere permitir saldos negativos simplemente devolverá ResultType#ACCOUNT_NO_FUNDS, o ResultType#FAILED en este caso.
Aquí esta como deberías retirar dinero:
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.service.economy.transaction.ResultType;
import org.spongepowered.api.service.economy.transaction.TransactionResult;
PluginContainer plugin = ...;
EconomyService service = ...;
Account account = ...;
BigDecimal requiredAmount = BigDecimal.valueOf(20);
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();
TransactionResult result = account.withdraw(service.getDefaultCurrency(), requiredAmount,
Cause.of(eventContext, plugin));
if (result.result() == ResultType.SUCCESS) {
// Success!
} else if (result.result() == ResultType.FAILED || result.result() == ResultType.ACCOUNT_NO_FUNDS) {
// Something went wrong!
} else {
// Handle other conditions
}