ChestShop-3/src/main/java/com/Acrobot/ChestShop/Listeners/Economy/Plugins/VaultListener.java

276 lines
11 KiB
Java

package com.Acrobot.ChestShop.Listeners.Economy.Plugins;
import java.math.BigDecimal;
import java.util.logging.Level;
import javax.annotation.Nullable;
import com.Acrobot.ChestShop.Configuration.Properties;
import com.Acrobot.ChestShop.Listeners.Economy.EconomyAdapter;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.server.ServiceRegisterEvent;
import org.bukkit.event.server.ServiceUnregisterEvent;
import org.bukkit.plugin.RegisteredServiceProvider;
import com.Acrobot.ChestShop.ChestShop;
import com.Acrobot.ChestShop.Events.Economy.AccountCheckEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyAddEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyAmountEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyCheckEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyFormatEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyHoldEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencySubtractEvent;
import com.Acrobot.ChestShop.Events.Economy.CurrencyTransferEvent;
/**
* Represents a Vault connector
*
* @author Acrobot
*/
public class VaultListener extends EconomyAdapter {
private RegisteredServiceProvider<Economy> rsp;
private static Economy provider;
private VaultListener() {
updateEconomyProvider();
}
private void updateEconomyProvider() {
rsp = ChestShop.getBukkitServer().getServicesManager().getRegistration(Economy.class);
if (rsp != null) {
provider = rsp.getProvider();
ChestShop.getBukkitLogger().log(Level.INFO, "Using " + provider.getName() + " as the Economy provider now.");
}
}
private boolean checkSetup() {
if (provider == null) {
ChestShop.getBukkitLogger().log(Level.SEVERE, "No Vault compatible Economy plugin found!");
ChestShop.getBukkitServer().getPluginManager().disablePlugin(ChestShop.getPlugin());
return false;
}
return true;
}
public static Economy getProvider() { return provider; }
public boolean transactionCanFail() {
if (provider == null) {
return false;
}
return provider.getName().equals("Gringotts")
|| provider.getName().equals("GoldIsMoney")
|| provider.getName().equals("MultiCurrency")
|| provider.getName().equalsIgnoreCase("TheNewEconomy");
}
/**
* Creates a new VaultListener and returns it (if possible)
*
* @return VaultListener
*/
public static @Nullable VaultListener initializeVault() {
if (Bukkit.getPluginManager().getPlugin("Vault") == null) {
return null;
}
return new VaultListener();
}
@EventHandler
public void onServiceRegister(ServiceRegisterEvent event) {
if (event.getProvider().getProvider() instanceof Economy) {
updateEconomyProvider();
}
}
@EventHandler
public void onServiceUnregister(ServiceUnregisterEvent event) {
if (event.getProvider().getProvider() instanceof Economy) {
updateEconomyProvider();
}
}
@EventHandler
public void onAmountCheck(CurrencyAmountEvent event) {
if (!checkSetup() || event.wasHandled() || !event.getAmount().equals(BigDecimal.ZERO)) {
return;
}
double balance = 0;
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
if (lastSeen != null) {
try {
balance = provider.getBalance(lastSeen, event.getWorld().getName());
} catch (Exception e) {
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not get balance account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + "." +
"This is probably due to https://github.com/MilkBowl/Vault/issues/746 and has to be fixed in either Vault directly or your economy plugin." +
"If you are sure it's not this issue then please report the following error.", e);
}
if (balance > Double.MAX_VALUE) {
balance = Double.MAX_VALUE;
}
event.setHandled(true);
} else {
ChestShop.getBukkitLogger().log(Level.WARNING, "The server could not get the OfflinePlayer with the UUID " + event.getAccount() + " to check balance?");
}
event.setAmount(BigDecimal.valueOf(balance));
}
@EventHandler
public void onCurrencyCheck(CurrencyCheckEvent event) {
if (!checkSetup() || event.wasHandled() || event.hasEnough()) {
return;
}
World world = event.getWorld();
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
try {
event.hasEnough(lastSeen != null && provider.has(lastSeen, world.getName(), event.getAmount().doubleValue()));
event.setHandled(true);
} catch (Exception e) {
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not check if account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + " has " + event.getAmount() + "." +
"This is probably due to https://github.com/MilkBowl/Vault/issues/746 and has to be fixed in either Vault directly or your economy plugin." +
"If you are sure it's not this issue then please report the following error.", e);
}
}
@EventHandler
public void onAccountCheck(AccountCheckEvent event) {
if (!checkSetup() || event.wasHandled() || event.hasAccount()) {
return;
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getAccount());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
try {
event.hasAccount(lastSeen != null && provider.hasAccount(lastSeen, world.getName()));
event.setHandled(true);
} catch (Exception e) {
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not check account balance of "+ lastSeen.getUniqueId() + "/" + lastSeen.getName() + "." +
"This is probably due to https://github.com/MilkBowl/Vault/issues/746 and has to be fixed in either Vault directly or your economy plugin." +
"If you are sure it's not this issue then please report the following error.", e);
}
}
@EventHandler
public void onCurrencyFormat(CurrencyFormatEvent event) {
if (!checkSetup() || event.wasHandled() || !event.getFormattedAmount().isEmpty()) {
return;
}
String formatted = provider.format(event.getAmount().doubleValue());
event.setFormattedAmount(Properties.STRIP_PRICE_COLORS ? ChatColor.stripColor(formatted) : formatted);
event.setHandled(true);
}
@EventHandler
public void onCurrencyAdd(CurrencyAddEvent event) {
if (!checkSetup() || event.wasHandled()) {
return;
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getTarget());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getTarget());
if (lastSeen != null) {
try {
EconomyResponse response = provider.depositPlayer(lastSeen, world.getName(), event.getAmount().doubleValue());
event.setHandled(response.type == EconomyResponse.ResponseType.SUCCESS);
} catch (Exception e) {
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not add money to account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + "." +
"This is probably due to https://github.com/MilkBowl/Vault/issues/746 and has to be fixed in either Vault directly or your economy plugin." +
"If you are sure it's not this issue then please report the following error.", e);
}
} else {
ChestShop.getBukkitLogger().log(Level.WARNING, "The server could not get the OfflinePlayer with the UUID " + event.getTarget() + " to add " + event.getAmount() + "?");
}
}
@EventHandler
public void onCurrencySubtraction(CurrencySubtractEvent event) {
if (!checkSetup() || event.wasHandled()) {
return;
}
World world = event.getWorld();
//String lastSeen = NameManager.getLastSeenName(event.getTarget());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getTarget());
if (lastSeen != null) {
try {
EconomyResponse response = provider.withdrawPlayer(lastSeen, world.getName(), event.getAmount().doubleValue());
event.setHandled(response.type == EconomyResponse.ResponseType.SUCCESS);
} catch (Exception e) {
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not add money to account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + "." +
"This is probably due to https://github.com/MilkBowl/Vault/issues/746 and has to be fixed in either Vault directly or your economy plugin." +
"If you are sure it's not this issue then please report the following error.", e);
}
} else {
ChestShop.getBukkitLogger().log(Level.WARNING, "The server could not get the OfflinePlayer with the UUID " + event.getTarget() + " to subtract " + event.getAmount() + "?");
}
}
@EventHandler
public void onCurrencyTransfer(CurrencyTransferEvent event) {
if (!checkSetup()) {
return;
}
processTransfer(event);
}
@EventHandler
public void onCurrencyHoldCheck(CurrencyHoldEvent event) {
if (!checkSetup() || event.wasHandled() || event.getAccount() == null || !transactionCanFail() || event.canHold()) {
return;
}
//String lastSeen = NameManager.getLastSeenName(event.getAccount());
OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount());
String world = event.getWorld().getName();
if (lastSeen == null) {
event.canHold(false);
ChestShop.getBukkitLogger().log(Level.WARNING, "The server could not get the OfflinePlayer with the UUID " + event.getAccount() + " to check if it can hold " + event.getAmount() + "?");
return;
}
try {
if (!provider.hasAccount(lastSeen, world)) {
event.canHold(false);
return;
}
EconomyResponse response = provider.depositPlayer(lastSeen, world, event.getAmount().doubleValue());
if (!response.transactionSuccess()) {
event.canHold(false);
event.setHandled(true);
return;
}
provider.withdrawPlayer(lastSeen, world, event.getAmount().doubleValue());
event.setHandled(true);
} catch (Exception e) {
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not check if account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + " can hold " + event.getAmount() + "." +
"This is probably due to https://github.com/MilkBowl/Vault/issues/746 and has to be fixed in either Vault directly or your economy plugin." +
"If you are sure it's not then please report this error to the devs of ChestShop.", e);
}
}
}