Ekonomi API en iyi pratik yöntemleri
Economy API, ekonomi eklentilerine, nasıl çalıştıkları konusunda esneklik kazandırmak için soyut olmaya çalışıyor. Ekonomi eklentilerini mümkün olduğunca kontrol edebilmek için, Economy API’sini kullanan eklentiler, onunla çalışırken bazı yönergelere uymalıdır:
Para çekmek
Eklentiler, bir hesabın para çekme girişiminde bulunmadan önce yeterli para olup olmadığını kontrol etmemelidir. Bu, karşıt-sezgisel gibi gelse de, ekonomi eklentilerinin negatif dengeleri nasıl ele aldıklarını tam olarak kontrol etmelerini sağlar.
Hesabın yeterli parası olup olmadığını kontrol ederek ekonomi eklentisinin olumsuz bir denge oluşturmasına (potansiyel olarak) engel olursunuz. Örneğin, bir ekonomi eklentisi, yöneticilerin veya belirli bir izni olan oyuncuların olumsuz dengelerini sağlamak isteyebilir. Kontrolü kendiniz yaparsanız, bu gücü ekonomi eklentisinden alırsınız.
Bu kod neyin yapılamayacağını göstermektedir:
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.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.of(eventContext, plugin));
}
Bunun yerine, yapılacak en iyi şey, yalnızca ihtiyacınız olan miktarı geri çekmeniz ve iade edilen :javadoc: TransactionResult için ResultType öğesini kontrol edin. Negatif bakiyelere izin vermek istemeyen bir ekonomi eklentisi ResultType#ACCOUNT_NO_FUNDS veya ResultType#FAILED durumunda geri dönecektir.
Nasıl para çekmeniz gerektiği hakkında bilgi:
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.getResult() == ResultType.SUCCESS) {
// Success!
} else if (result.getResult() == ResultType.FAILED || result.getResult() == ResultType.ACCOUNT_NO_FUNDS) {
// Something went wrong!
} else {
// Handle other conditions
}