001/* This file is part of Vault.
002
003    Vault is free software: you can redistribute it and/or modify
004    it under the terms of the GNU Lesser General Public License as published by
005    the Free Software Foundation, either version 3 of the License, or
006    (at your option) any later version.
007
008    Vault is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU Lesser General Public License for more details.
012
013    You should have received a copy of the GNU Lesser General Public License
014    along with Vault.  If not, see <http://www.gnu.org/licenses/>.
015 */
016package net.milkbowl.vault;
017
018import java.io.BufferedReader;
019import java.io.IOException;
020import java.io.InputStreamReader;
021import java.lang.reflect.InvocationTargetException;
022import java.lang.reflect.Method;
023import java.net.URL;
024import java.net.URLConnection;
025import java.util.Collection;
026import java.util.logging.Logger;
027
028import net.milkbowl.vault.chat.Chat;
029import net.milkbowl.vault.chat.plugins.Chat_DroxPerms;
030import net.milkbowl.vault.chat.plugins.Chat_GroupManager;
031import net.milkbowl.vault.chat.plugins.Chat_OverPermissions;
032import net.milkbowl.vault.chat.plugins.Chat_Permissions3;
033import net.milkbowl.vault.chat.plugins.Chat_PermissionsEx;
034import net.milkbowl.vault.chat.plugins.Chat_Privileges;
035import net.milkbowl.vault.chat.plugins.Chat_bPermissions;
036import net.milkbowl.vault.chat.plugins.Chat_bPermissions2;
037import net.milkbowl.vault.chat.plugins.Chat_iChat;
038import net.milkbowl.vault.chat.plugins.Chat_mChat;
039import net.milkbowl.vault.chat.plugins.Chat_mChatSuite;
040import net.milkbowl.vault.chat.plugins.Chat_zPermissions;
041import net.milkbowl.vault.chat.plugins.Chat_rscPermissions;
042import net.milkbowl.vault.economy.Economy;
043import net.milkbowl.vault.economy.plugins.Economy_3co;
044import net.milkbowl.vault.economy.plugins.Economy_AEco;
045import net.milkbowl.vault.economy.plugins.Economy_BOSE6;
046import net.milkbowl.vault.economy.plugins.Economy_BOSE7;
047import net.milkbowl.vault.economy.plugins.Economy_CommandsEX;
048import net.milkbowl.vault.economy.plugins.Economy_Craftconomy;
049import net.milkbowl.vault.economy.plugins.Economy_Craftconomy3;
050import net.milkbowl.vault.economy.plugins.Economy_CurrencyCore;
051import net.milkbowl.vault.economy.plugins.Economy_DigiCoin;
052import net.milkbowl.vault.economy.plugins.Economy_Dosh;
053import net.milkbowl.vault.economy.plugins.Economy_EconXP;
054import net.milkbowl.vault.economy.plugins.Economy_Essentials;
055import net.milkbowl.vault.economy.plugins.Economy_GoldIsMoney;
056import net.milkbowl.vault.economy.plugins.Economy_GoldIsMoney2;
057import net.milkbowl.vault.economy.plugins.Economy_GoldenChestEconomy;
058import net.milkbowl.vault.economy.plugins.Economy_Gringotts;
059import net.milkbowl.vault.economy.plugins.Economy_McMoney;
060import net.milkbowl.vault.economy.plugins.Economy_MineConomy;
061import net.milkbowl.vault.economy.plugins.Economy_MultiCurrency;
062import net.milkbowl.vault.economy.plugins.Economy_TAEcon;
063import net.milkbowl.vault.economy.plugins.Economy_XPBank;
064import net.milkbowl.vault.economy.plugins.Economy_eWallet;
065import net.milkbowl.vault.economy.plugins.Economy_iConomy4;
066import net.milkbowl.vault.economy.plugins.Economy_iConomy5;
067import net.milkbowl.vault.economy.plugins.Economy_iConomy6;
068import net.milkbowl.vault.economy.plugins.Economy_SDFEconomy;
069import net.milkbowl.vault.economy.plugins.Economy_Minefaconomy;  
070import net.milkbowl.vault.permission.Permission;
071import net.milkbowl.vault.permission.plugins.Permission_DroxPerms;
072import net.milkbowl.vault.permission.plugins.Permission_GroupManager;
073import net.milkbowl.vault.permission.plugins.Permission_OverPermissions;
074import net.milkbowl.vault.permission.plugins.Permission_Permissions3;
075import net.milkbowl.vault.permission.plugins.Permission_PermissionsBukkit;
076import net.milkbowl.vault.permission.plugins.Permission_PermissionsEx;
077import net.milkbowl.vault.permission.plugins.Permission_Privileges;
078import net.milkbowl.vault.permission.plugins.Permission_SimplyPerms;
079import net.milkbowl.vault.permission.plugins.Permission_Starburst;
080import net.milkbowl.vault.permission.plugins.Permission_SuperPerms;
081import net.milkbowl.vault.permission.plugins.Permission_Xperms;
082import net.milkbowl.vault.permission.plugins.Permission_bPermissions;
083import net.milkbowl.vault.permission.plugins.Permission_bPermissions2;
084import net.milkbowl.vault.permission.plugins.Permission_zPermissions;
085import net.milkbowl.vault.permission.plugins.Permission_TotalPermissions;
086import net.milkbowl.vault.permission.plugins.Permission_rscPermissions;
087import net.milkbowl.vault.permission.plugins.Permission_KPerms;
088
089import org.bukkit.Bukkit;
090import org.bukkit.OfflinePlayer;
091import org.bukkit.command.Command;
092import org.bukkit.command.CommandSender;
093import org.bukkit.entity.Player;
094import org.bukkit.event.EventHandler;
095import org.bukkit.event.EventPriority;
096import org.bukkit.event.Listener;
097import org.bukkit.event.player.PlayerJoinEvent;
098import org.bukkit.event.server.PluginEnableEvent;
099import org.bukkit.permissions.PermissionDefault;
100import org.bukkit.plugin.Plugin;
101import org.bukkit.plugin.RegisteredServiceProvider;
102import org.bukkit.plugin.ServicePriority;
103import org.bukkit.plugin.ServicesManager;
104import org.bukkit.plugin.java.JavaPlugin;
105import org.json.simple.JSONArray;
106import org.json.simple.JSONObject;
107import org.json.simple.JSONValue;
108
109import com.nijikokun.register.payment.Methods;
110
111import net.milkbowl.vault.chat.plugins.Chat_TotalPermissions;
112import net.milkbowl.vault.economy.plugins.Economy_MiConomy;
113
114public class Vault extends JavaPlugin {
115
116    private static Logger log;
117    private Permission perms;
118    private String newVersionTitle = "";
119    private double newVersion = 0;
120    private double currentVersion = 0;
121    private String currentVersionTitle = "";
122    private ServicesManager sm;
123    private Metrics metrics;
124    private Vault plugin;
125
126    @Override
127    public void onDisable() {
128        // Remove all Service Registrations
129        getServer().getServicesManager().unregisterAll(this);
130        Bukkit.getScheduler().cancelTasks(this);
131    }
132
133    @Override
134    public void onEnable() {
135        plugin = this;
136        log = this.getLogger();
137        currentVersionTitle = getDescription().getVersion().split("-")[0];
138        currentVersion = Double.valueOf(currentVersionTitle.replaceFirst("\\.", ""));
139        sm = getServer().getServicesManager();
140        // set defaults
141        getConfig().addDefault("update-check", true);
142        getConfig().options().copyDefaults(true);
143        saveConfig();
144
145        // Load Vault Addons
146        loadEconomy();
147        loadPermission();
148        loadChat();
149
150        getCommand("vault-info").setExecutor(this);
151        getCommand("vault-convert").setExecutor(this);
152        getServer().getPluginManager().registerEvents(new VaultListener(), this);
153        // Schedule to check the version every 30 minutes for an update. This is to update the most recent 
154        // version so if an admin reconnects they will be warned about newer versions.
155        this.getServer().getScheduler().runTask(this, new Runnable() {
156
157            @Override
158            public void run() {
159                // Programmatically set the default permission value cause Bukkit doesn't handle plugin.yml properly for Load order STARTUP plugins
160                org.bukkit.permissions.Permission perm = getServer().getPluginManager().getPermission("vault.update");
161                if (perm == null)
162                {
163                    perm = new org.bukkit.permissions.Permission("vault.update");
164                    perm.setDefault(PermissionDefault.OP);
165                    plugin.getServer().getPluginManager().addPermission(perm);
166                }
167                perm.setDescription("Allows a user or the console to check for vault updates");
168
169                getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() {
170
171                    @Override
172                    public void run() {
173                        if (getServer().getConsoleSender().hasPermission("vault.update") && getConfig().getBoolean("update-check", true)) {
174                            try {
175                                newVersion = updateCheck(currentVersion);
176                                log.info("Checking for Updates:");
177                                if (newVersion > currentVersion) {
178                                    log.warning("Stable Version: " + newVersionTitle + " is out!" + " You are still running version: " + currentVersionTitle);
179                                    log.warning("Update at: http://dev.bukkit.org/server-mods/vault");
180                                } else if (currentVersion > newVersion) {
181                                    log.info("Stable Version: " + newVersionTitle + " | Current Version: " + currentVersionTitle);
182                                } else {
183                                    log.info("No new version available");
184                                }
185                            } catch (Exception e) {
186                                // ignore exceptions
187                            }
188                        }
189                    }
190                }, 0, 432000);
191
192            }
193
194        });
195
196        // Load up the Plugin metrics
197        try {
198            metrics = new Metrics(this);
199            metrics.findCustomData();
200            metrics.start();
201        } catch (IOException e) {
202            // ignore exception
203        }
204        log.info(String.format("[%s] Enabled Version %s", getDescription().getName(), getDescription().getVersion()));
205    }
206
207    /**
208     * Attempts to load Chat Addons
209     */
210    private void loadChat() {
211        // Try to load PermissionsEx
212        hookChat("PermissionsEx", Chat_PermissionsEx.class, ServicePriority.Highest, "ru.tehkode.permissions.bukkit.PermissionsEx");
213
214        // Try to load mChatSuite
215        hookChat("mChatSuite", Chat_mChatSuite.class, ServicePriority.Highest, "in.mDev.MiracleM4n.mChatSuite.mChatSuite");
216
217        // Try to load mChat
218        hookChat("mChat", Chat_mChat.class, ServicePriority.Highest, "net.D3GN.MiracleM4n.mChat");
219
220        // Try to load OverPermissions
221        hookChat("OverPermissions", Chat_OverPermissions.class, ServicePriority.Highest, "com.overmc.overpermissions.OverPermissions");
222
223        // Try to load DroxPerms Chat
224        hookChat("DroxPerms", Chat_DroxPerms.class, ServicePriority.Lowest, "de.hydrox.bukkit.DroxPerms.DroxPerms");
225
226        // Try to load bPermssions 2
227        hookChat("bPermssions2", Chat_bPermissions2.class, ServicePriority.Highest, "de.bananaco.bpermissions.api.ApiLayer");
228
229        // Try to load bPermissions 1
230        hookChat("bPermissions", Chat_bPermissions.class, ServicePriority.Normal, "de.bananaco.permissions.info.InfoReader");
231
232        // Try to load GroupManager
233        hookChat("GroupManager", Chat_GroupManager.class, ServicePriority.Normal, "org.anjocaido.groupmanager.GroupManager");
234
235        // Try to load Permissions 3 (Yeti)
236        hookChat("Permissions3", Chat_Permissions3.class, ServicePriority.Normal, "com.nijiko.permissions.ModularControl");
237
238        // Try to load iChat
239        hookChat("iChat", Chat_iChat.class, ServicePriority.Low, "net.TheDgtl.iChat.iChat");
240
241        // Try to load zPermissions
242        hookChat("zPermissions", Chat_zPermissions.class, ServicePriority.Normal, "org.tyrannyofheaven.bukkit.zPermissions.model.EntityMetadata");
243
244        // Try to load Privileges
245        hookChat("Privileges", Chat_Privileges.class, ServicePriority.Normal, "net.krinsoft.privileges.Privileges");
246
247        // Try to load rscPermissions
248        hookChat("rscPermissions", Chat_rscPermissions.class, ServicePriority.Normal, "ru.simsonic.rscPermissions.MainPluginClass");
249
250        //Try to load TotalPermissions
251        hookChat("TotalPermissions", Chat_TotalPermissions.class, ServicePriority.Normal, "net.ar97.totalpermissions.TotalPermissions");
252    }
253
254    /**
255     * Attempts to load Economy Addons
256     */
257    private void loadEconomy() {
258        // Try to load MiConomy
259        hookEconomy("MiConomy", Economy_MiConomy.class, ServicePriority.Normal, "com.gmail.bleedobsidian.miconomy.Main");
260
261        // Try to load MiFaConomy
262        hookEconomy("MineFaConomy", Economy_Minefaconomy.class, ServicePriority.Normal, "me.coniin.plugins.minefaconomy.Minefaconomy");
263
264        // Try to load MultiCurrency
265        hookEconomy("MultiCurrency", Economy_MultiCurrency.class, ServicePriority.Normal, "me.ashtheking.currency.Currency", "me.ashtheking.currency.CurrencyList");
266
267        // Try to load MineConomy
268        hookEconomy("MineConomy", Economy_MineConomy.class, ServicePriority.Normal, "me.mjolnir.mineconomy.MineConomy");
269
270        // Try to load AEco
271        hookEconomy("AEco", Economy_AEco.class, ServicePriority.Normal, "org.neocraft.AEco.AEco");
272
273        // Try to load McMoney
274        hookEconomy("McMoney", Economy_McMoney.class, ServicePriority.Normal, "boardinggamer.mcmoney.McMoneyAPI");
275
276        // Try to load Craftconomy
277        hookEconomy("CraftConomy", Economy_Craftconomy.class, ServicePriority.Normal, "me.greatman.Craftconomy.Craftconomy");
278
279        // Try to load Craftconomy3
280        hookEconomy("CraftConomy3", Economy_Craftconomy3.class, ServicePriority.Normal, "com.greatmancode.craftconomy3.tools.interfaces.BukkitLoader");
281
282        // Try to load eWallet
283        hookEconomy("eWallet", Economy_eWallet.class, ServicePriority.Normal, "me.ethan.eWallet.ECO");
284
285        // Try to load 3co
286        hookEconomy("3co", Economy_3co.class, ServicePriority.Normal, "me.ic3d.eco.ECO");
287
288        // Try to load BOSEconomy 6
289        hookEconomy("BOSEconomy6", Economy_BOSE6.class, ServicePriority.Normal, "cosine.boseconomy.BOSEconomy", "cosine.boseconomy.CommandManager");
290
291        // Try to load BOSEconomy 7
292        hookEconomy("BOSEconomy7", Economy_BOSE7.class, ServicePriority.Normal, "cosine.boseconomy.BOSEconomy", "cosine.boseconomy.CommandHandler");
293
294        // Try to load CurrencyCore
295        hookEconomy("CurrencyCore", Economy_CurrencyCore.class, ServicePriority.Normal, "is.currency.Currency");
296
297        // Try to load Gringotts
298        hookEconomy("Gringotts", Economy_Gringotts.class, ServicePriority.Normal, "org.gestern.gringotts.Gringotts");
299
300        // Try to load Essentials Economy
301        hookEconomy("Essentials Economy", Economy_Essentials.class, ServicePriority.Low, "com.earth2me.essentials.api.Economy", "com.earth2me.essentials.api.NoLoanPermittedException",  "com.earth2me.essentials.api.UserDoesNotExistException");
302
303        // Try to load iConomy 4
304        hookEconomy("iConomy 4", Economy_iConomy4.class, ServicePriority.High, "com.nijiko.coelho.iConomy.iConomy", "com.nijiko.coelho.iConomy.system.Account");
305
306        // Try to load iConomy 5
307        hookEconomy("iConomy 5", Economy_iConomy5.class, ServicePriority.High, "com.iConomy.iConomy", "com.iConomy.system.Account", "com.iConomy.system.Holdings");
308
309        // Try to load iConomy 6
310        hookEconomy("iConomy 6", Economy_iConomy6.class, ServicePriority.High, "com.iCo6.iConomy");
311
312        // Try to load EconXP
313        hookEconomy("EconXP", Economy_EconXP.class, ServicePriority.Normal, "ca.agnate.EconXP.EconXP");
314
315        // Try to load GoldIsMoney
316        hookEconomy("GoldIsMoney", Economy_GoldIsMoney.class, ServicePriority.Normal, "com.flobi.GoldIsMoney.GoldIsMoney");
317
318        // Try to load GoldIsMoney2
319        hookEconomy("GoldIsMoney2", Economy_GoldIsMoney2.class, ServicePriority.Normal, "com.flobi.GoldIsMoney2.GoldIsMoney");
320
321        // Try to load GoldenChestEconomy
322        hookEconomy("GoldenChestEconomy", Economy_GoldenChestEconomy.class, ServicePriority.Normal, "me.igwb.GoldenChest.GoldenChestEconomy");
323
324        // Try to load Dosh
325        hookEconomy("Dosh", Economy_Dosh.class, ServicePriority.Normal, "com.gravypod.Dosh.Dosh");
326
327        // Try to load CommandsEX Economy
328        hookEconomy("CommandsEX", Economy_CommandsEX.class, ServicePriority.Normal, "com.github.zathrus_writer.commandsex.api.EconomyAPI");
329
330        // Try to load SDFEconomy Economy
331        hookEconomy("SDFEconomy", Economy_SDFEconomy.class, ServicePriority.Normal, "com.github.omwah.SDFEconomy.SDFEconomy");
332
333        // Try to load XPBank
334        hookEconomy("XPBank", Economy_XPBank.class, ServicePriority.Normal, "com.gmail.mirelatrue.xpbank.XPBank");
335
336        // Try to load TAEcon
337        hookEconomy("TAEcon", Economy_TAEcon.class, ServicePriority.Normal, "net.teamalpha.taecon.TAEcon");
338
339        // Try to load DigiCoin
340        hookEconomy("DigiCoin", Economy_DigiCoin.class, ServicePriority.Normal, "co.uk.silvania.cities.digicoin.DigiCoin");
341    }
342
343    /**
344     * Attempts to load Permission Addons
345     */
346    private void loadPermission() {
347        // Try to load Starburst
348        hookPermission("Starburst", Permission_Starburst.class, ServicePriority.Highest, "com.dthielke.starburst.StarburstPlugin");
349
350        // Try to load PermissionsEx
351        hookPermission("PermissionsEx", Permission_PermissionsEx.class, ServicePriority.Highest, "ru.tehkode.permissions.bukkit.PermissionsEx");
352
353        // Try to load OverPermissions
354        hookPermission("OverPermissions", Permission_OverPermissions.class, ServicePriority.Highest, "com.overmc.overpermissions.OverPermissions");
355
356        // Try to load PermissionsBukkit
357        hookPermission("PermissionsBukkit", Permission_PermissionsBukkit.class, ServicePriority.Normal, "com.platymuus.bukkit.permissions.PermissionsPlugin");
358
359        // Try to load DroxPerms
360        hookPermission("DroxPerms", Permission_DroxPerms.class, ServicePriority.High, "de.hydrox.bukkit.DroxPerms.DroxPerms");
361
362        // Try to load SimplyPerms
363        hookPermission("SimplyPerms", Permission_SimplyPerms.class, ServicePriority.Highest, "net.crystalyx.bukkit.simplyperms.SimplyPlugin");
364
365        // Try to load bPermissions2
366        hookPermission("bPermissions 2", Permission_bPermissions2.class, ServicePriority.Highest, "de.bananaco.bpermissions.api.WorldManager");
367
368        // Try to load zPermission
369        hookPermission("zPermissions", Permission_zPermissions.class, ServicePriority.High, "org.tyrannyofheaven.bukkit.zPermissions.ZPermissionsPlugin");
370
371        // Try to load Privileges
372        hookPermission("Privileges", Permission_Privileges.class, ServicePriority.Highest, "net.krinsoft.privileges.Privileges");
373
374        // Try to load bPermissions
375        hookPermission("bPermissions", Permission_bPermissions.class, ServicePriority.High, "de.bananaco.permissions.SuperPermissionHandler");
376
377        // Try to load GroupManager
378        hookPermission("GroupManager", Permission_GroupManager.class, ServicePriority.High, "org.anjocaido.groupmanager.GroupManager");
379
380        // Try to load Permissions 3 (Yeti)
381        hookPermission("Permissions 3 (Yeti)", Permission_Permissions3.class, ServicePriority.Normal, "com.nijiko.permissions.ModularControl");
382
383        // Try to load Xperms
384        hookPermission("Xperms", Permission_Xperms.class, ServicePriority.Low, "com.github.sebc722.Xperms");
385
386        //Try to load TotalPermissions
387        hookPermission("TotalPermissions", Permission_TotalPermissions.class, ServicePriority.Normal, "net.ae97.totalpermissions.TotalPermissions");
388
389        // Try to load rscPermissions
390        hookPermission("rscPermissions", Permission_rscPermissions.class, ServicePriority.Normal, "ru.simsonic.rscPermissions.MainPluginClass");
391
392        // Try to load KPerms
393        hookPermission("KPerms", Permission_KPerms.class, ServicePriority.Normal, "com.lightniinja.kperms.KPermsPlugin");
394
395        Permission perms = new Permission_SuperPerms(this);
396        sm.register(Permission.class, perms, this, ServicePriority.Lowest);
397        log.info(String.format("[%s][Permission] SuperPermissions loaded as backup permission system.", getDescription().getName()));
398
399        this.perms = sm.getRegistration(Permission.class).getProvider();
400    }
401
402    private void hookChat (String name, Class<? extends Chat> hookClass, ServicePriority priority, String...packages) {
403        try {
404            if (packagesExists(packages)) {
405                Chat chat = hookClass.getConstructor(Plugin.class, Permission.class).newInstance(this, perms);
406                sm.register(Chat.class, chat, this, priority);
407                log.info(String.format("[%s][Chat] %s found: %s", getDescription().getName(), name, chat.isEnabled() ? "Loaded" : "Waiting"));
408            }
409        } catch (Exception e) {
410            log.severe(String.format("[%s][Chat] There was an error hooking %s - check to make sure you're using a compatible version!", getDescription().getName(), name));
411        }
412    }
413
414    private void hookEconomy (String name, Class<? extends Economy> hookClass, ServicePriority priority, String...packages) {
415        try {
416            if (packagesExists(packages)) {
417                Economy econ = hookClass.getConstructor(Plugin.class).newInstance(this);
418                sm.register(Economy.class, econ, this, priority);
419                log.info(String.format("[%s][Economy] %s found: %s", getDescription().getName(), name, econ.isEnabled() ? "Loaded" : "Waiting"));
420            }
421        } catch (Exception e) {
422            log.severe(String.format("[%s][Economy] There was an error hooking %s - check to make sure you're using a compatible version!", getDescription().getName(), name));
423        }
424    }
425
426    private void hookPermission (String name, Class<? extends Permission> hookClass, ServicePriority priority, String...packages) {
427        try {
428            if (packagesExists(packages)) {
429                Permission perms = hookClass.getConstructor(Plugin.class).newInstance(this);
430                sm.register(Permission.class, perms, this, priority);
431                log.info(String.format("[%s][Permission] %s found: %s", getDescription().getName(), name, perms.isEnabled() ? "Loaded" : "Waiting"));
432            }
433        } catch (Exception e) {
434            log.severe(String.format("[%s][Permission] There was an error hooking %s - check to make sure you're using a compatible version!", getDescription().getName(), name));
435        }
436    }
437
438    @Override
439    public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) {
440        if (!sender.hasPermission("vault.admin")) {
441            sender.sendMessage("You do not have permission to use that command!");
442        }
443
444        if (command.getName().equalsIgnoreCase("vault-info")) {
445            infoCommand(sender);
446            return true;
447        } else if (command.getName().equalsIgnoreCase("vault-convert")) {
448            convertCommand(sender, args);
449            return true;
450        } else {
451            // Show help
452            sender.sendMessage("Vault Commands:");
453            sender.sendMessage("  /vault-info - Displays information about Vault");
454            sender.sendMessage("  /vault-convert [economy1] [economy2] - Converts from one Economy to another");
455            return true;
456        }
457    }
458
459    private void convertCommand(CommandSender sender, String[] args) {
460        Collection<RegisteredServiceProvider<Economy>> econs = this.getServer().getServicesManager().getRegistrations(Economy.class);
461        if (econs == null || econs.size() < 2) {
462            sender.sendMessage("You must have at least 2 economies loaded to convert.");
463            return;
464        } else if (args.length != 2) {
465            sender.sendMessage("You must specify only the economy to convert from and the economy to convert to. (names should not contain spaces)");
466            return;
467        }
468        Economy econ1 = null;
469        Economy econ2 = null;
470        for (RegisteredServiceProvider<Economy> econ : econs) {
471            String econName = econ.getProvider().getName().replace(" ", "");
472            if (econName.equalsIgnoreCase(args[0])) {
473                econ1 = econ.getProvider();
474            } else if (econName.equalsIgnoreCase(args[1])) {
475                econ2 = econ.getProvider();
476            }
477        }
478
479        if (econ1 == null) {
480            sender.sendMessage("Could not find " + args[0] + " loaded on the server, check your spelling");
481            return;
482        } else if (econ2 == null) {
483            sender.sendMessage("Could not find " + args[1] + " loaded on the server, check your spelling");
484            return;
485        }
486
487        sender.sendMessage("This may take some time to convert, expect server lag.");
488        for (OfflinePlayer op : Bukkit.getServer().getOfflinePlayers()) {
489            String pName = op.getName();
490            if (econ1.hasAccount(pName)) {
491                if (econ2.hasAccount(pName)) {
492                    continue;
493                }
494                econ2.createPlayerAccount(pName);
495                econ2.depositPlayer(pName, econ1.getBalance(pName));
496            }
497        }
498        sender.sendMessage("Converson complete, please verify the data before using it.");
499    }
500
501    private void infoCommand(CommandSender sender) {
502        // Get String of Registered Economy Services
503        String registeredEcons = null;
504        Collection<RegisteredServiceProvider<Economy>> econs = this.getServer().getServicesManager().getRegistrations(Economy.class);
505        for (RegisteredServiceProvider<Economy> econ : econs) {
506            Economy e = econ.getProvider();
507            if (registeredEcons == null) {
508                registeredEcons = e.getName();
509            } else {
510                registeredEcons += ", " + e.getName();
511            }
512        }
513
514        // Get String of Registered Permission Services
515        String registeredPerms = null;
516        Collection<RegisteredServiceProvider<Permission>> perms = this.getServer().getServicesManager().getRegistrations(Permission.class);
517        for (RegisteredServiceProvider<Permission> perm : perms) {
518            Permission p = perm.getProvider();
519            if (registeredPerms == null) {
520                registeredPerms = p.getName();
521            } else {
522                registeredPerms += ", " + p.getName();
523            }
524        }
525
526        String registeredChats = null;
527        Collection<RegisteredServiceProvider<Chat>> chats = this.getServer().getServicesManager().getRegistrations(Chat.class);
528        for (RegisteredServiceProvider<Chat> chat : chats) {
529            Chat c = chat.getProvider();
530            if (registeredChats == null) {
531                registeredChats = c.getName();
532            } else {
533                registeredChats += ", " + c.getName();
534            }
535        }
536
537        // Get Economy & Permission primary Services
538        RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
539        Economy econ = null;
540        if (rsp != null) {
541            econ = rsp.getProvider();
542        }
543        Permission perm = null;
544        RegisteredServiceProvider<Permission> rspp = getServer().getServicesManager().getRegistration(Permission.class);
545        if (rspp != null) {
546            perm = rspp.getProvider();
547        }
548        Chat chat = null;
549        RegisteredServiceProvider<Chat> rspc = getServer().getServicesManager().getRegistration(Chat.class);
550        if (rspc != null) {
551            chat = rspc.getProvider();
552        }
553        // Send user some info!
554        sender.sendMessage(String.format("[%s] Vault v%s Information", getDescription().getName(), getDescription().getVersion()));
555        sender.sendMessage(String.format("[%s] Economy: %s [%s]", getDescription().getName(), econ == null ? "None" : econ.getName(), registeredEcons));
556        sender.sendMessage(String.format("[%s] Permission: %s [%s]", getDescription().getName(), perm == null ? "None" : perm.getName(), registeredPerms));
557        sender.sendMessage(String.format("[%s] Chat: %s [%s]", getDescription().getName(), chat == null ? "None" : chat.getName(), registeredChats));
558    }
559
560    /**
561     * Determines if all packages in a String array are within the Classpath
562     * This is the best way to determine if a specific plugin exists and will be
563     * loaded. If the plugin package isn't loaded, we shouldn't bother waiting
564     * for it!
565     * @param packages String Array of package names to check
566     * @return Success or Failure
567     */
568    private static boolean packagesExists(String...packages) {
569        try {
570            for (String pkg : packages) {
571                Class.forName(pkg);
572            }
573            return true;
574        } catch (Exception e) {
575            return false;
576        }
577    }
578
579    public double updateCheck(double currentVersion) {
580        try {
581            URL url = new URL("https://api.curseforge.com/servermods/files?projectids=33184");
582            URLConnection conn = url.openConnection();
583            conn.setReadTimeout(5000);
584            conn.addRequestProperty("User-Agent", "Vault Update Checker");
585            conn.setDoOutput(true);
586            final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
587            final String response = reader.readLine();
588            final JSONArray array = (JSONArray) JSONValue.parse(response);
589
590            if (array.size() == 0) {
591                this.getLogger().warning("No files found, or Feed URL is bad.");
592                return currentVersion;
593            }
594            // Pull the last version from the JSON
595            newVersionTitle = ((String) ((JSONObject) array.get(array.size() - 1)).get("name")).replace("Vault", "").trim();
596            return Double.valueOf(newVersionTitle.replaceFirst("\\.", "").trim());
597        } catch (Exception e) {
598            log.info("There was an issue attempting to check for the latest version.");
599        }
600        return currentVersion;
601    }
602
603    public class VaultListener implements Listener {
604
605        @EventHandler(priority = EventPriority.MONITOR)
606        public void onPlayerJoin(PlayerJoinEvent event) {
607            Player player = event.getPlayer();
608            if (perms.has(player, "vault.update")) {
609                try {
610                    if (newVersion > currentVersion) {
611                        player.sendMessage("Vault " +  newVersion + " is out! You are running " + currentVersion);
612                        player.sendMessage("Update Vault at: http://dev.bukkit.org/server-mods/vault");
613                    }
614                } catch (Exception e) {
615                    // Ignore exceptions
616                }
617            }
618        }
619
620        @EventHandler(priority = EventPriority.MONITOR)
621        public void onPluginEnable(PluginEnableEvent event) {
622            if (event.getPlugin().getDescription().getName().equals("Register") && packagesExists("com.nijikokun.register.payment.Methods")) {
623                if (!Methods.hasMethod()) {
624                    try {
625                        Method m = Methods.class.getMethod("addMethod", Methods.class);
626                        m.setAccessible(true);
627                        m.invoke(null, "Vault", new net.milkbowl.vault.VaultEco());
628                        if (!Methods.setPreferred("Vault")) {
629                            log.info("Unable to hook register");
630                        } else {
631                            log.info("[Vault] - Successfully injected Vault methods into Register.");
632                        }
633                    } catch (SecurityException e) {
634                        log.info("Unable to hook register");
635                    } catch (NoSuchMethodException e) {
636                        log.info("Unable to hook register");
637                    } catch (IllegalArgumentException e) {
638                        log.info("Unable to hook register");
639                    } catch (IllegalAccessException e) {
640                        log.info("Unable to hook register");
641                    } catch (InvocationTargetException e) {
642                        log.info("Unable to hook register");
643                    }
644                }
645            }
646        }
647    }
648}