Make chestshop buying transactions fail if money deposit on seller's account fails.

Some economy plugins, such as Gringotts, only allow a limited amount of money in an account.
Thus, deposits to an account can fail. Chestshop would ignore the failure, which could cause a seller not
to receive the payment for selling an item.

This commit fixes the problem by canceling a transaction if the seller is not able to receive the money of a sale.
This commit is contained in:
Justin Kaeser 2013-01-09 01:50:44 +01:00
parent 30c19e4864
commit 9625680d97
8 changed files with 48 additions and 15 deletions

View File

@ -17,6 +17,9 @@ public class Messages {
public static String NOT_ENOUGH_MONEY = "You don't have enough money!";
public static String NOT_ENOUGH_MONEY_SHOP = "Shop owner doesn't have enough money!";
public static String DEPOSIT_FAILED = "Money deposit to shop owner failed!";
public static String DEPOSIT_FAILED_OWNER = "Money deposit to your account failed, shop transaction aborted!";
public static byte NEWLINE_NOT_ENOUGH_MONEY_SHO; ///////////////////////////////////////////////////

View File

@ -31,7 +31,7 @@ public class Economy {
return ChestShopSign.isAdminShop(acc);
}
public static void add(String name, double amount) {
public static boolean add(String name, double amount) {
if (isServerAccount(name) && !getServerAccountName().isEmpty()) {
name = getServerAccountName();
}
@ -46,19 +46,19 @@ public class Economy {
amount -= tax;
}
manager.add(uName.getName(name), amount);
return manager.add(uName.getName(name), amount);
}
public static double getTax(float tax, double price) {
return NumberUtil.roundDown((tax / 100F) * price);
}
public static void subtract(String name, double amount) {
public static boolean subtract(String name, double amount) {
if (isServerAccount(name) && !getServerAccountName().isEmpty()) {
name = getServerAccountName();
}
manager.subtract(uName.getName(name), roundUp(amount));
return manager.subtract(uName.getName(name), roundUp(amount));
}
public static boolean hasEnough(String name, double amount) {

View File

@ -11,12 +11,14 @@ public class EconomyManager {
return false;
}
public void add(String player, double amount) {
public boolean add(String player, double amount) {
printError();
return false;
}
public void subtract(String player, double amount) {
public boolean subtract(String player, double amount) {
printError();
return false;
}
public boolean hasEnough(String player, double amount) {

View File

@ -16,12 +16,12 @@ public class Register extends EconomyManager {
return method.hasAccount(player);
}
public void add(String player, double amount) {
method.getAccount(player).add(amount);
public boolean add(String player, double amount) {
return method.getAccount(player).add(amount);
}
public void subtract(String player, double amount) {
method.getAccount(player).subtract(amount);
public boolean subtract(String player, double amount) {
return method.getAccount(player).subtract(amount);
}
public boolean hasEnough(String player, double amount) {

View File

@ -13,12 +13,12 @@ public class Vault extends EconomyManager {
return vaultPlugin.hasAccount(player);
}
public void add(String player, double amount) {
vaultPlugin.depositPlayer(player, amount);
public boolean add(String player, double amount) {
return vaultPlugin.depositPlayer(player, amount).transactionSuccess();
}
public void subtract(String player, double amount) {
vaultPlugin.withdrawPlayer(player, amount);
public boolean subtract(String player, double amount) {
return vaultPlugin.withdrawPlayer(player, amount).transactionSuccess();
}
public boolean hasEnough(String player, double amount) {

View File

@ -125,6 +125,8 @@ public class PreTransactionEvent extends Event {
CLIENT_DOES_NOT_HAVE_ENOUGH_MONEY,
SHOP_DOES_NOT_HAVE_ENOUGH_MONEY,
/** not enough space in shop's account for money deposit on sell */
SHOP_DEPOSIT_FAILED,
NOT_ENOUGH_SPACE_IN_CHEST,
NOT_ENOUGH_SPACE_IN_INVENTORY,

View File

@ -14,7 +14,7 @@ import org.bukkit.inventory.ItemStack;
import java.util.LinkedList;
import java.util.List;
import static com.Acrobot.ChestShop.Configuration.Messages.NOT_ENOUGH_STOCK_IN_YOUR_SHOP;
import static com.Acrobot.ChestShop.Configuration.Messages.*;
/**
* @author Acrobot
@ -58,12 +58,27 @@ public class ErrorMessageSender implements Listener {
sendMessageToOwner(event.getOwner(), messageOutOfStock);
message = Messages.NOT_ENOUGH_STOCK;
break;
case SHOP_DEPOSIT_FAILED:
String messageDepositFailed = Messages.prefix(DEPOSIT_FAILED);
sendMessageToOwner(event.getOwner(), messageDepositFailed);
message = DEPOSIT_FAILED;
break;
case SHOP_IS_RESTRICTED:
message = Messages.ACCESS_DENIED;
break;
case INVALID_SHOP:
message = Messages.INVALID_SHOP_DETECTED;
break;
case CREATIVE_MODE_PROTECTION:
break;
case OTHER:
break;
case SPAM_CLICKING_PROTECTION:
break;
case TRANSACTION_SUCCESFUL:
break;
default:
break;
}
if (message != null) {

View File

@ -47,6 +47,17 @@ public class PartialTransactionModule implements Listener {
event.setPrice(amountAffordable * pricePerItem);
event.setStock(getCountedItemStack(stock, amountAffordable));
}
String seller = event.getOwner().getName();
boolean added = Economy.add(seller, price);
if (added) {
// added amount successfully, owner has enough space for deposit
// --> undo the add, for some other event to actually do.
Economy.subtract(seller, price);
} else {
event.setCancelled(SHOP_DEPOSIT_FAILED);
return;
}
stock = event.getStock();