経済 API ベストプラクティス

経済 API は経済プラグインに柔軟性を与えられるよう抽象化された状態を保とうとしています。経済プラグインに最大限のコントロールを与えるため、経済 API を利用するプラグインはいくつかのガイドラインに従うべきです:

Withdrawing money

プラグインは引き出す前に口座に十分な資金があるかチェックしては いけません 。逆説的に聞こえるでしょうが、こうすることでマイナスの残高をどう扱うかを完全に経済プラグインに委ねることができます。

自前で資金が足りているかチェックすることで、(潜在的に) 経済プラグインによるマイナス残高の許可を妨げることになります。例えば、ある経済プラグインが管理者とある権限を持つプレイヤーにマイナス残高を認めているとします。しかし、自前でのチェックを行うことで経済プラグインはそうすることができなくなります。

このコードは してはいけないこと を示します:

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));
}

そのかわりに、必要な金額をただ引き出し、返される TransactionResult に含まれる :javadoc:`ResultType`をチェックするのが最善です。マイナスの残高を認めない経済プラグインは :javadoc:`ResultType#ACCOUNT_NO_FUNDS` または :javadoc:`ResultTYPE#FAILED` を返すでしょう。

これが資金を引き出すのに 従うべき 方法です:

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
}