Bonnes Pratiques de l’API Economy

L’API Economie essaie d’être assez abstraite pour donner une grande souplesse aux plugins d’économie dans leur mode de fonctionnement. Afin de donner le plus de contrôle possible aux plugins d’économie, ceux utilisant l’API Economy devraient suivre ces quelques directives lors de l’utilisation:

Retirer de l’argent

Les plugins ne devraient pas vérifier si un compte a assez d’argent avant d’essayer d’en retirer. Même si cela ne semble pas intuitif, cela permet de laisser les plugins d’économie gérer les soldes négatifs.

En vérifiant vous même si le compte a assez d’argent, vous empêchez (potentiellement) le plugin d’économie de gérer un solde négatif. Par exemple, un plugin d’économie pourrait autoriser des soldes négatifs aux administrateurs, ou aux joueurs avec une certaine permission. En effectuant le contrôle vous même, vous retirez cette possibilité aux plugins d’économie.

Ce code illustre ce qu’il ne faut pas faire:

import java.math.BigDecimal;

import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.service.economy.account.Account;

EconomyService service = ...;
Account account = ...;
BigDecimal requiredAmount = BigDecimal.valueOf(20);

// BAD: Don't perform this check
if (account.getBalance(service.getDefaultCurrency()).compareTo(requiredAmount) < 0) {
    // You don't have enough money!
} else {
    // The account has enough, let's withdraw some cash!
    account.withdraw(service.getDefaultCurrency(), requiredAmount,
        Cause.source(this).build());
}

Au lieu de cela, la meilleure chose à faire est de simplement retirer la somme d’argent dont vous avez besoin et de vérifier le ResultType du TransactionResult. Un plugin d’économie qui ne veut pas accepter de soldes négatifs doit simplement retourner ResultType#ACCOUNT_NO_FUNDS, ou ResultType#FAILED en ce cas.

Voici comment vous devez retirer de l’argent:

import org.spongepowered.api.service.economy.transaction.ResultType;
import org.spongepowered.api.service.economy.transaction.TransactionResult;

EconomyService service = ...
Account account = ...
BigDecimal requiredAmount = BigDecimal.valueOf(20);

TransactionResult result = account.withdraw(service.getDefaultCurrency(),
    requiredAmount, Cause.source(this).build());
if (result.getResult() == ResultType.SUCCESS)) {
    // Success!
} else if (result.getResult() == ResultType.FAILED || result.getResult() == ResultType.ACCOUNT_NO_FUNDS) {
    // Something went wrong!
} else {
    // Handle other conditions
}