package com.Acrobot.ChestShop.Listeners.Economy.Plugins; import java.math.BigDecimal; import java.util.logging.Level; import javax.annotation.Nullable; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.EconomyResponse; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; 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 implements Listener { private RegisteredServiceProvider 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.getAmount().equals(BigDecimal.ZERO)) { return; } double balance = 0; //String lastSeen = NameManager.getLastSeenName(event.getAccount()); 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.setAmount(balance); } @EventHandler public void onCurrencyCheck(CurrencyCheckEvent event) { if (!checkSetup() || event.hasEnough()) { return; } World world = event.getWorld(); //String lastSeen = NameManager.getLastSeenName(event.getAccount()); OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount()); try { event.hasEnough(lastSeen != null && provider.has(lastSeen, world.getName(), event.getDoubleAmount())); } catch (Exception e) { ChestShop.getBukkitLogger().log(Level.WARNING, "Could not check if account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + " has " + event.getDoubleAmount() + "." + "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.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())); } 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.getFormattedAmount().isEmpty()) { return; } String formatted = provider.format(event.getDoubleAmount()); event.setFormattedAmount(formatted); } @EventHandler public void onCurrencyAdd(CurrencyAddEvent event) { if (!checkSetup() || event.isAdded()) { 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.getDoubleAmount()); event.setAdded(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); } } } @EventHandler public void onCurrencySubtraction(CurrencySubtractEvent event) { if (!checkSetup() || event.isSubtracted()) { 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.getDoubleAmount()); event.setSubtracted(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); } } } @EventHandler public void onCurrencyTransfer(CurrencyTransferEvent event) { if (!checkSetup() || event.hasBeenTransferred()) { return; } CurrencySubtractEvent currencySubtractEvent = new CurrencySubtractEvent(event.getAmount(), event.getSender(), event.getWorld()); onCurrencySubtraction(currencySubtractEvent); if (!currencySubtractEvent.isSubtracted()) { return; } CurrencyAddEvent currencyAddEvent = new CurrencyAddEvent(currencySubtractEvent.getAmount(), event.getReceiver(), event.getWorld()); onCurrencyAdd(currencyAddEvent); event.setTransferred(currencyAddEvent.isAdded()); } @EventHandler public void onCurrencyHoldCheck(CurrencyHoldEvent event) { if (!checkSetup() || event.getAccount() == null || !transactionCanFail()) { return; } //String lastSeen = NameManager.getLastSeenName(event.getAccount()); OfflinePlayer lastSeen = Bukkit.getOfflinePlayer(event.getAccount()); String world = event.getWorld().getName(); if (lastSeen == null) { event.canHold(false); return; } try { if (!provider.hasAccount(lastSeen, world)) { event.canHold(false); return; } EconomyResponse response = provider.depositPlayer(lastSeen, world, event.getDoubleAmount()); if (!response.transactionSuccess()) { event.canHold(false); return; } provider.withdrawPlayer(lastSeen, world, event.getDoubleAmount()); } catch (Exception e) { ChestShop.getBukkitLogger().log(Level.WARNING, "Could not check if account of " + lastSeen.getUniqueId() + "/" + lastSeen.getName() + " can hold " + event.getDoubleAmount() + "." + "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); } } }