/** * This file is part of Craftconomy3. * * Copyright (c) 2011-2016, Greatman <http://github.com/greatman/> * * Craftconomy3 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Craftconomy3 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Craftconomy3. If not, see <http://www.gnu.org/licenses/>. */ package com.greatmancode.craftconomy3; import com.greatmancode.craftconomy3.account.Account; import com.greatmancode.craftconomy3.account.AccountManager; import com.greatmancode.craftconomy3.commands.bank.*; import com.greatmancode.craftconomy3.commands.config.*; import com.greatmancode.craftconomy3.commands.currency.*; import com.greatmancode.craftconomy3.commands.group.GroupAddWorldCommand; import com.greatmancode.craftconomy3.commands.group.GroupCreateCommand; import com.greatmancode.craftconomy3.commands.group.GroupDelWorldCommand; import com.greatmancode.craftconomy3.commands.money.*; import com.greatmancode.craftconomy3.commands.setup.*; import com.greatmancode.craftconomy3.converter.H2ToMySQLConverter; import com.greatmancode.craftconomy3.currency.Currency; import com.greatmancode.craftconomy3.currency.CurrencyManager; import com.greatmancode.craftconomy3.events.EventManager; import com.greatmancode.craftconomy3.groups.WorldGroupsManager; import com.greatmancode.craftconomy3.storage.StorageHandler; import com.greatmancode.craftconomy3.utils.OldFormatConverter; import com.greatmancode.tools.caller.bukkit.BukkitServerCaller; import com.greatmancode.tools.caller.unittest.UnitTestServerCaller; import com.greatmancode.tools.commands.CommandHandler; import com.greatmancode.tools.commands.SubCommand; import com.greatmancode.tools.configuration.Config; import com.greatmancode.tools.configuration.ConfigurationManager; import com.greatmancode.tools.interfaces.caller.ServerCaller; import com.greatmancode.tools.language.LanguageManager; import com.greatmancode.tools.utils.FeatherBoard; import com.greatmancode.tools.utils.Metrics; import com.greatmancode.tools.utils.Tools; import com.greatmancode.tools.utils.Updater; import org.json.simple.parser.ParseException; import java.io.IOException; import java.math.BigDecimal; import java.sql.SQLException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.logging.Level; import java.util.logging.Logger; /** * The core of Craftconomy. Every requests pass through this class * * @author greatman */ public class Common implements com.greatmancode.tools.interfaces.Common { private Logger log = null; private static Common instance = null; // Managers private AccountManager accountManager = null; private ConfigurationManager config = null; private CurrencyManager currencyManager = null; private StorageHandler storageHandler = null; private EventManager eventManager = null; private LanguageManager languageManager = null; private WorldGroupsManager worldGroupManager = null; private CommandHandler commandManager = null; private ServerCaller serverCaller = null; private boolean databaseInitialized = false; private boolean currencyInitialized = false; private static boolean initialized = false; private Metrics metrics = null; private Config mainConfig = null; private Updater updater; //Default values private DisplayFormat displayFormat = null; private double holdings = 0.0; private double bankPrice = 0.0; /** * Initialize the Common core. */ public void onEnable(ServerCaller serverCaller, final Logger log) { this.serverCaller = serverCaller; instance = this; this.log = log; if (!initialized) { sendConsoleMessage(Level.INFO, "Starting up!"); sendConsoleMessage(Level.INFO, "Loading the Configuration"); config = new ConfigurationManager(serverCaller); mainConfig = config.loadFile(serverCaller.getDataFolder(), "config.yml"); if (!mainConfig.has("System.Setup")) { initializeConfig(); } if (!getMainConfig().has("System.Database.Prefix")) { getMainConfig().setValue("System.Database.Prefix", "cc3_"); } if (!getMainConfig().has("System.Database.Poolsize")) { getMainConfig().setValue("System.Database.Poolsize", 10); } languageManager = new LanguageManager(serverCaller, serverCaller.getDataFolder(), "lang.yml"); loadLanguage(); serverCaller.setCommandPrefix(languageManager.getString("command_prefix")); if (!(getServerCaller() instanceof UnitTestServerCaller)) { try { metrics = new Metrics("Craftconomy", this.getServerCaller().getPluginVersion(), serverCaller); } catch (IOException e) { this.getLogger().log(Level.SEVERE, String.format(getLanguageManager().getString("metric_start_error"), e.getMessage())); } } if (getMainConfig().getBoolean("System.CheckNewVersion") && (serverCaller instanceof BukkitServerCaller)) { updater = new Updater(serverCaller, 35564, Updater.UpdateType.NO_DOWNLOAD, false); if (updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE) { sendConsoleMessage(Level.WARNING, getLanguageManager().parse("running_old_version", updater.getLatestName())); } } sendConsoleMessage(Level.INFO, "Loading listeners."); serverCaller.getLoader().getEventManager().registerEvents(this, new EventManager()); sendConsoleMessage(Level.INFO, "Loading commands"); Common.getInstance().getServerCaller().registerPermission("craftconomy.*"); commandManager = new CommandHandler(serverCaller); registerCommands(); if (getMainConfig().getBoolean("System.Setup")) { //We got quick setup. Let's do it!!!! if (getMainConfig().getBoolean("System.QuickSetup.Enable")) { quickSetup(); reloadPlugin(); } else { sendConsoleMessage(Level.WARNING, getLanguageManager().getString("loaded_setup_mode")); } } else { commandManager.setCurrentLevel(1); initialiseDatabase(); updateDatabase(); initializeCurrency(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("loading_default_settings")); loadDefaultSettings(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("default_settings_loaded")); startUp(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("ready")); } getServerCaller().registerPermission("craftconomy.money.log.others"); addFeatherboardSupport(); initialized = true; } } /** * Disable the plugin. */ @Override public void onDisable() { if (getStorageHandler() != null) { getLogger().info(getLanguageManager().getString("closing_db_link")); getStorageHandler().disable(); } // Managers accountManager = null; config = null; currencyManager = null; storageHandler = null; eventManager = null; languageManager = null; worldGroupManager = null; commandManager = null; databaseInitialized = false; currencyInitialized = false; initialized = false; metrics = null; mainConfig = null; updater = null; //Default values displayFormat = null; holdings = 0.0; bankPrice = 0.0; } /** * Reload the plugin. */ public void reloadPlugin() { sendConsoleMessage(Level.INFO, "Starting up!"); sendConsoleMessage(Level.INFO, "Loading the Configuration"); config = new ConfigurationManager(serverCaller); mainConfig = config.loadFile(serverCaller.getDataFolder(), "config.yml"); if (!mainConfig.has("System.Setup")) { initializeConfig(); } if (!getMainConfig().has("System.Database.Prefix")) { getMainConfig().setValue("System.Database.Prefix", "cc3_"); } languageManager = new LanguageManager(serverCaller, serverCaller.getDataFolder(), "lang.yml"); loadLanguage(); serverCaller.setCommandPrefix(languageManager.getString("command_prefix")); commandManager.setCurrentLevel(1); initialiseDatabase(); updateDatabase(); initializeCurrency(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("loading_default_settings")); loadDefaultSettings(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("default_settings_loaded")); startUp(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("ready")); } /** * Retrieve the main configuration file * * @return the main configuration file */ public Config getMainConfig() { return mainConfig; } /** * Retrieve the logger associated with this plugin. * * @return The logger instance. */ public Logger getLogger() { return log; } /** * Sends a message to the console through the Logge.r * * @param level The log level to show. * @param msg The message to send. */ public void sendConsoleMessage(Level level, String msg) { if (!(getServerCaller() instanceof UnitTestServerCaller)) { getLogger().log(level, msg); } } /** * Retrieve the instance of Common. Need to go through that to access any managers. * * @return The Common instance. */ public static Common getInstance() { return instance; } /** * Retrieve the Account Manager. * * @return The Account Manager instance or null if the manager is not initialized. */ public AccountManager getAccountManager() { return accountManager; } /** * Retrieve the Configuration Manager. * * @return The Configuration Manager instance or null if the manager is not initialized. */ public ConfigurationManager getConfigurationManager() { return config; } /** * Retrieve the Storage Handler. * * @return The Storage Handler instance or null if the handler is not initialized. */ public StorageHandler getStorageHandler() { return storageHandler; } /** * Retrieve the Currency Manager. * * @return The Currency Manager instance or null if the manager is not initialized. */ public CurrencyManager getCurrencyManager() { return currencyManager; } /** * Retrieve the Command Manager. * * @return The Command Manager instance or null if the manager is not initialized. */ public CommandHandler getCommandManager() { return commandManager; } /** * Retrieve the Server Caller. * * @return The Server Caller instance or null if the caller is not initialized. */ public ServerCaller getServerCaller() { return serverCaller; } /** * Format a balance to a readable string. * * @param worldName The world Name associated with this balance * @param currency The currency instance associated with this balance. * @param balance The balance. * @param format the display format to use * @return A pretty String showing the balance. Returns a empty string if currency is invalid. */ public String format(String worldName, Currency currency, double balance, DisplayFormat format) { StringBuilder string = new StringBuilder(); if (worldName != null && !worldName.equals(WorldGroupsManager.DEFAULT_GROUP_NAME)) { // We put the world name if the conf is true string.append(worldName).append(": "); } if (currency != null) { // We removes some cents if it's something like 20.20381 it would set it // to 20.20 String[] theAmount = BigDecimal.valueOf(balance).toPlainString().split("\\."); DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(); unusualSymbols.setGroupingSeparator(','); DecimalFormat decimalFormat = new DecimalFormat("###,###", unusualSymbols); String name = currency.getName(); if (balance > 1.0 || balance < 1.0) { name = currency.getPlural(); } String coin; if (theAmount.length == 2) { if (theAmount[1].length() >= 2) { coin = theAmount[1].substring(0, 2); } else { coin = theAmount[1] + "0"; } } else { coin = "0"; } String amount; try { amount = decimalFormat.format(Double.parseDouble(theAmount[0])); } catch (NumberFormatException e) { amount = theAmount[0]; } // Do we seperate money and dollar or not? if (format == DisplayFormat.LONG) { String subName = currency.getMinor(); if (Long.parseLong(coin) > 1) { subName = currency.getMinorPlural(); } string.append(amount).append(" ").append(name).append(" ").append(coin).append(" ").append(subName); } else if (format == DisplayFormat.SMALL) { string.append(amount).append(".").append(coin).append(" ").append(name); } else if (format == DisplayFormat.SIGN) { string.append(currency.getSign()).append(amount).append(".").append(coin); } else if (format == DisplayFormat.SIGNFRONT) { string.append(amount).append(".").append(coin).append(currency.getSign()); }else if (format == DisplayFormat.MAJORONLY) { string.append(amount).append(" ").append(name); } } return string.toString(); } /** * Format a balance to a readable string with the default formatting. * * @param worldName The world Name associated with this balance * @param currency The currency instance associated with this balance. * @param balance The balance. * @return A pretty String showing the balance. Returns a empty string if currency is invalid. */ public String format(String worldName, Currency currency, double balance) { return format(worldName, currency, balance, displayFormat); } /** * Initialize the database Manager */ public void initialiseDatabase() { if (!databaseInitialized) { sendConsoleMessage(Level.INFO, getLanguageManager().getString("loading_database_manager")); storageHandler = new StorageHandler(); //TODO: Re-support that if (getMainConfig().getBoolean("System.Database.ConvertFromH2")) { convertDatabase(); } databaseInitialized = true; sendConsoleMessage(Level.INFO, getLanguageManager().getString("database_manager_loaded")); } } /** * Convert from SQLite to MySQL */ private void convertDatabase(){ sendConsoleMessage(Level.INFO, getLanguageManager().getString("starting_database_convert")); new H2ToMySQLConverter().run(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("convert_done")); getMainConfig().setValue("System.Database.ConvertFromH2", false); } /** * Initialize the {@link CurrencyManager} */ public void initializeCurrency() { if (!currencyInitialized) { sendConsoleMessage(Level.INFO, getLanguageManager().getString("loading_currency_manager")); currencyManager = new CurrencyManager(); currencyInitialized = true; sendConsoleMessage(Level.INFO, getLanguageManager().getString("currency_manager_loaded")); } } /** * Initialize the {@link WorldGroupsManager} */ public void initializeWorldGroup() { if (worldGroupManager == null) { worldGroupManager = new WorldGroupsManager(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("world_group_manager_loaded")); } } /** * Initialize the {@link AccountManager}, Metrics and {@link EventManager} */ public void startUp() { sendConsoleMessage(Level.INFO, getLanguageManager().getString("loading_account_manager")); accountManager = new AccountManager(); //addMetricsGraph("Multiworld", getConfigurationManager().isMultiWorld()); startMetrics(); sendConsoleMessage(Level.INFO, getLanguageManager().getString("account_manager_loaded")); eventManager = new EventManager(); initializeWorldGroup(); } /** * Add a graph to Metrics * * @param title The title of the Graph * @param value The value of the entry */ public void addMetricsGraph(String title, String value) { if (metrics != null) { Metrics.Graph graph = metrics.createGraph(title); graph.addPlotter(new Metrics.Plotter(value) { @Override public int getValue() { return 1; } }); } } /** * Add a graph to Metrics * * @param title The title of the Graph * @param value The value of the entry */ public void addMetricsGraph(String title, boolean value) { addMetricsGraph(title, value ? "Yes" : "No"); } /** * Start Metrics. */ public void startMetrics() { if (metrics != null) { getLogger().info("Starting Metrics."); metrics.start(); } } /** * Write a transaction to the Log. * * @param info The type of transaction to log. * @param cause The cause of the transaction. * @param causeReason The reason of the cause * @param account The account being impacted by the change * @param amount The amount of money in this transaction. * @param currency The currency associated with this transaction * @param worldName The world name associated with this transaction */ public void writeLog(LogInfo info, Cause cause, String causeReason, Account account, double amount, Currency currency, String worldName) { if (getMainConfig().getBoolean("System.Logging.Enabled")) { getStorageHandler().getStorageEngine().saveLog(info, cause, causeReason, account, amount, currency, worldName); } } /** * Get the version Checker. * * @return The version checker. May return null if the system is disabled in the config.yml */ public Updater getVersionChecker() { return updater; } /** * Retrieve the Event manager. * * @return The Event manager. */ public EventManager getEventManager() { return eventManager; } /** * Retrieve the {@link com.greatmancode.tools.language.LanguageManager} * * @return The {@link com.greatmancode.tools.language.LanguageManager} */ public LanguageManager getLanguageManager() { return languageManager; } /** * Retrieve the {@link WorldGroupsManager} * * @return The {@link WorldGroupsManager} */ public WorldGroupsManager getWorldGroupManager() { return worldGroupManager; } /** * Check if the system has been initialized. * * @return True if the system has been initialized else false. */ public static boolean isInitialized() { return initialized; } /** * Reload the default settings. */ public void loadDefaultSettings() { String value = getStorageHandler().getStorageEngine().getConfigEntry("longmode"); if (value != null) { displayFormat = DisplayFormat.valueOf(value.toUpperCase()); } else { getStorageHandler().getStorageEngine().setConfigEntry("longmode", "long"); displayFormat = DisplayFormat.LONG; } addMetricsGraph("Display Format", displayFormat.toString()); value = getStorageHandler().getStorageEngine().getConfigEntry("holdings"); if (value != null && Tools.isValidDouble(value)) { holdings = Double.parseDouble(value); } else { getStorageHandler().getStorageEngine().setConfigEntry("holdings", 100.0 + ""); sendConsoleMessage(Level.SEVERE, "No default value was set for account creation or was invalid! Defaulting to 100."); holdings = 100.0; } value = getStorageHandler().getStorageEngine().getConfigEntry("bankprice"); if (value != null && Tools.isValidDouble(value)) { bankPrice = Double.parseDouble(value); } else { getStorageHandler().getStorageEngine().setConfigEntry("bankprice", 100.0 + ""); sendConsoleMessage(Level.SEVERE, "No default value was set for bank creation or was invalid! Defaulting to 100."); bankPrice = 100.0; } } /** * Retrieve the display format for any formatting through {@link #format(String, com.greatmancode.craftconomy3.currency.Currency, double, DisplayFormat)} * * @return the display format used. */ public DisplayFormat getDisplayFormat() { return displayFormat; } /** * Set the display format for any formatting through {@link #format(String, com.greatmancode.craftconomy3.currency.Currency, double, DisplayFormat)} * * @param format The format display to be set to */ public void setDisplayFormat(DisplayFormat format) { getStorageHandler().getStorageEngine().setConfigEntry("longmode", format.toString()); displayFormat = format; } /** * Get the default amount of money a account will have * * @return the default amount of money */ public double getDefaultHoldings() { return holdings; } /** * Set the default amount of money a account will have * * @param value the default amount of money */ public void setDefaultHoldings(double value) { getStorageHandler().getStorageEngine().setConfigEntry("holdings", String.valueOf(value)); holdings = value; } /** * Retrieve the price of a bank account creation * * @return The price of a bank account creation */ public double getBankPrice() { return bankPrice; } /** * Set the bank account creation price * * @param value the bank account creation price */ public void setBankPrice(double value) { getStorageHandler().getStorageEngine().setConfigEntry("bankprice", String.valueOf(value)); bankPrice = value; } /** * Perform a quick setup */ private void quickSetup() { initialiseDatabase(); Common.getInstance().initializeCurrency(); Currency currency = Common.getInstance().getCurrencyManager().addCurrency(getMainConfig().getString("System.QuickSetup.Currency.Name"), getMainConfig().getString("System.QuickSetup.Currency.NamePlural"), getMainConfig().getString("System.QuickSetup.Currency.Minor"), getMainConfig().getString("System.QuickSetup.Currency.MinorPlural"), getMainConfig().getString("System.QuickSetup.Currency.Sign"), true); Common.getInstance().getCurrencyManager().setDefault(currency); Common.getInstance().getCurrencyManager().setDefaultBankCurrency(currency); getStorageHandler().getStorageEngine().setConfigEntry("longmode", DisplayFormat.valueOf(getMainConfig().getString("System.QuickSetup.DisplayMode").toUpperCase()).toString()); getStorageHandler().getStorageEngine().setConfigEntry("holdings", getMainConfig().getString("System.QuickSetup.StartBalance")); getStorageHandler().getStorageEngine().setConfigEntry("bankprice", getMainConfig().getString("System.QuickSetup.PriceBank")); initializeCurrency(); loadDefaultSettings(); Common.getInstance().startUp(); Common.getInstance().getMainConfig().setValue("System.Setup", false); commandManager.setCurrentLevel(1); sendConsoleMessage(Level.INFO, "Quick-Config done!"); } /** * Register all the commands */ private void registerCommands() { commandManager.setWrongLevelMsg(languageManager.getString("command_disabled_setup_mode")); SubCommand money = new SubCommand("money", commandManager, null, 1); money.addCommand("", new MainCommand()); money.addCommand("all", new AllCommand()); money.addCommand("pay", new PayCommand()); money.addCommand("give", new GiveCommand()); money.addCommand("take", new TakeCommand()); money.addCommand("set", new SetCommand()); money.addCommand("delete", new DeleteCommand()); money.addCommand("create", new CreateCommand()); money.addCommand("balance", new BalanceCommand()); money.addCommand("top", new TopCommand()); money.addCommand("exchange", new ExchangeCommand()); money.addCommand("infinite", new InfiniteCommand()); money.addCommand("log", new LogCommand()); commandManager.registerMainCommand("money", money); SubCommand bank = new SubCommand("bank", commandManager, null, 1); bank.addCommand("create", new BankCreateCommand()); bank.addCommand("balance", new BankBalanceCommand()); bank.addCommand("deposit", new BankDepositCommand()); bank.addCommand("withdraw", new BankWithdrawCommand()); bank.addCommand("set", new BankSetCommand()); bank.addCommand("give", new BankGiveCommand()); bank.addCommand("take", new BankTakeCommand()); bank.addCommand("perm", new BankPermCommand()); bank.addCommand("list", new BankListCommand()); bank.addCommand("delete", new BankDeleteCommand()); bank.addCommand("ignoreacl", new BankIgnoreACLCommand()); commandManager.registerMainCommand("bank", bank); SubCommand ccsetup = new SubCommand("ccsetup", commandManager, null, 0); ccsetup.addCommand("", new NewSetupMainCommand()); ccsetup.addCommand("database", new NewSetupDatabaseCommand()); ccsetup.addCommand("currency", new NewSetupCurrencyCommand()); ccsetup.addCommand("basic", new NewSetupBasicCommand()); ccsetup.addCommand("convert", new NewSetupConvertCommand()); commandManager.registerMainCommand("ccsetup", ccsetup); SubCommand currency = new SubCommand("currency", commandManager, null, 1); currency.addCommand("add", new CurrencyAddCommand()); currency.addCommand("delete", new CurrencyDeleteCommand()); currency.addCommand("edit", new CurrencyEditCommand()); currency.addCommand("info", new CurrencyInfoCommand()); currency.addCommand("default", new CurrencyDefaultCommand()); currency.addCommand("exchange", new CurrencyExchangeCommand()); currency.addCommand("rates", new CurrencyRatesCommand()); currency.addCommand("list", new CurrencyListCommand()); commandManager.registerMainCommand("currency", currency); SubCommand configCommand = new SubCommand("craftconomy", commandManager, null, 1); configCommand.addCommand("holdings", new ConfigHoldingsCommand()); configCommand.addCommand("bankprice", new ConfigBankPriceCommand()); configCommand.addCommand("format", new ConfigFormatCommand()); configCommand.addCommand("clearlog", new ConfigClearLogCommand()); configCommand.addCommand("reload", new ConfigReloadCommand()); commandManager.registerMainCommand("craftconomy", configCommand); SubCommand ccgroup = new SubCommand("ccgroup", commandManager, null, 1); ccgroup.addCommand("create", new GroupCreateCommand()); ccgroup.addCommand("addworld", new GroupAddWorldCommand()); ccgroup.addCommand("delworld", new GroupDelWorldCommand()); commandManager.registerMainCommand("ccgroup", ccgroup); SubCommand payCommand = new SubCommand("pay", commandManager, null, 1); payCommand.addCommand("", new PayCommand()); commandManager.registerMainCommand("pay", payCommand); } /** * Initialize the configuration file */ private void loadLanguage() { languageManager.addLanguageEntry("metric_start_error", "Unable to load Metrics! The error is: %s"); languageManager.addLanguageEntry("checking_new_version", "Checking if there's a new version."); languageManager.addLanguageEntry("running_old_version", "Running a old version of Craftconomy! New version is: %s"); languageManager.addLanguageEntry("database_connect_error", "A error occured while trying to connect to the database. Message received: %s"); languageManager.addLanguageEntry("loading_default_settings", "Loading default settings."); languageManager.addLanguageEntry("default_settings_loaded", "Default settings loaded!"); languageManager.addLanguageEntry("loaded_setup_mode", "Loading Craftconomy in setup mode. Please type /ccsetup to start the setup."); languageManager.addLanguageEntry("ready", "Ready!"); languageManager.addLanguageEntry("closing_db_link", "Closing the connection to the database."); languageManager.addLanguageEntry("unable_close_db_link", "Unable to close the database connection! Reason is: %s"); languageManager.addLanguageEntry("loading_database_manager", "Loading the Database Manager"); languageManager.addLanguageEntry("database_manager_loaded", "Database Manager Loaded!"); languageManager.addLanguageEntry("loading_curency_manager", "Loading the Currency Manager"); languageManager.addLanguageEntry("currency_manager_loaded", "Currency Manager Loaded!"); languageManager.addLanguageEntry("loading_account_manager", "Loading the Account Manager"); languageManager.addLanguageEntry("account_manager_loaded", "Account Manager Loaded!"); languageManager.addLanguageEntry("loading_payday_manager", "Loading the PayDay manager."); languageManager.addLanguageEntry("payday_manager_loaded", "PayDay Manager loaded!"); languageManager.addLanguageEntry("error_write_log", "Error while writing the transaction logger! Error is: %s"); languageManager.addLanguageEntry("invalid_library", "Invalid library URL for: %s. Full error is: %s"); languageManager.addLanguageEntry("command_disabled_setup_mode", "{{DARK_RED}}This command is disabled while Craftconomy is under setup mode! Type /ccsetup to configure the plugin."); languageManager.addLanguageEntry("user_only_command", "{{DARK_RED}}This command should only be used by players!"); languageManager.addLanguageEntry("no_permission", "{{DARK_RED}}You don't have permissions!"); languageManager.addLanguageEntry("command_usage", "Usage: %s"); languageManager.addLanguageEntry("subcommand_not_exist", "{{DARK_RED}}This subcommand doesn't exist!"); languageManager.addLanguageEntry("bank_statement", "{{DARK_GREEN}}Bank Statement:"); languageManager.addLanguageEntry("cant_check_bank_statement", "{{DARK_RED}}You can't check this bank account statement"); languageManager.addLanguageEntry("account_not_exist", "{{DARK_RED}}This account doesn't exist!"); languageManager.addLanguageEntry("bank_account_created", "{{DARK_GREEN}}The account has been created!"); languageManager.addLanguageEntry("bank_account_not_enough_money_create", "{{DARK_RED}}You don't have enough money to create a bank account! You need {{WHITE}}%s"); languageManager.addLanguageEntry("account_already_exists", "{{DARK_RED}}This account already exists!"); languageManager.addLanguageEntry("currency_not_exist", "{{DARK_RED}}That currency doesn't exist!"); languageManager.addLanguageEntry("not_enough_money", "{{DARK_RED}}Not enough money!"); languageManager.addLanguageEntry("invalid_amount", "{{DARK_RED}}Invalid amount!"); languageManager.addLanguageEntry("bank_cant_deposit", "{{DARK_RED}}You can't deposit in this account!"); languageManager.addLanguageEntry("deposited", "{{DARK_GREEN}}Deposited {{WHITE}}%s {{DARK_GREEN}}in the {{WHITE}}%s {{DARK_GREEN}}bank Account."); languageManager.addLanguageEntry("bank_help_title", "{{DARK_GREEN}} ======== Bank Commands ========"); languageManager.addLanguageEntry("bank_create_cmd_help", "/bank create <Account Name> - Create a bank account"); languageManager.addLanguageEntry("bank_balance_cmd_help", "/bank balance <Account Name> - Check the balance of a account."); languageManager.addLanguageEntry("bank_deposit_cmd_help", "/bank deposit <Account Name> <Amount> [Currency] - Deposit money in a bank account."); languageManager.addLanguageEntry("bank_give_cmd_help", "/bank give <Account Name> <Amount> [Currency] [World] - Give money in a bank account."); languageManager.addLanguageEntry("bank_help_cmd_help", "/bank - Shows bank help"); languageManager.addLanguageEntry("bank_perm_cmd_help", "/bank perm <Account Name> <deposit/withdraw/acl/show> <Player Name> <true/false> - Modify the permission of a player"); languageManager.addLanguageEntry("bank_set_cmd_help", "/bank set <Account Name> <Amount> [Currency] [World]- Set a balance in a account."); languageManager.addLanguageEntry("bank_take_cmd_help", "/bank take <Account Name> <Amount> [Currency] [World]- Take money from a account."); languageManager.addLanguageEntry("bank_withdraw_cmd_help", "/bank withdraw <Account Name> <Amount> [Currency] - Withdraw money in a account."); languageManager.addLanguageEntry("world_not_exist", "{{DARK_RED}}This world doesn't exist!"); languageManager.addLanguageEntry("bank_give_success", "{{DARK_GREEN}}Deposited {{WHITE}}%s{{DARK_GREEN}} from the {{WHITE}}%s{{DARK_GREEN}} bank Account."); languageManager.addLanguageEntry("invalid_flag", "{{DARK_RED}}Invalid flag!"); languageManager.addLanguageEntry("bank_flag_set", "{{DARK_GREEN}}The flag {{WHITE}}%s {{DARK_GREEN}}for the player {{WHITE}}%s {{DARK_GREEN}}has been set to {{WHITE}}%s"); languageManager.addLanguageEntry("cant_modify_acl", "{{DARK_RED}}You can't modify the ACL of this account!"); languageManager.addLanguageEntry("bank_set_success", "{{DARK_GREEN}}Set {{WHITE}}%s {{DARK_GREEN}}in the {{WHITE}}%s {{DARK_GREEN}}bank Account."); languageManager.addLanguageEntry("bank_not_enough_money", "{{DARK_RED}}The bank account doesn't have enough money!"); languageManager.addLanguageEntry("bank_take_success", "{{DARK_GREEN}}Taken {{WHITE}}%s {{DARK_GREEN}}from the {{WHITE}}%s {{DARK_GREEN}}bank Account."); languageManager.addLanguageEntry("cant_withdraw_bank", "{{DARK_RED}}You can't withdraw in this account!"); languageManager.addLanguageEntry("bank_price_modified", "{{DARK_GREEN}}Bank price modified!"); languageManager.addLanguageEntry("config_bankprice_cmd_help", "/craftconomy bankprice <Amount> - Change the price to create a bank account."); languageManager.addLanguageEntry("config_format_cmd_help", "/craftconomy format <long/small/sign/signfront/majoronly> - Set the display format."); languageManager.addLanguageEntry("config_cmd_help", "/craftconomy - shows config command help"); languageManager.addLanguageEntry("config_holdings_cmd_help", "/craftconomy holdings <Amount> - Set the default amount of money of a user account."); languageManager.addLanguageEntry("config_help_title", "{{DARK_GREEN}} ======== Craftconomy Commands ========"); languageManager.addLanguageEntry("format_modified", "{{DARK_GREEN}}long balance format changed!"); languageManager.addLanguageEntry("invalid_mode", "{{DARK_RED}}Invalid mode!"); languageManager.addLanguageEntry("default_holding_modified", "{{DARK_GREEN}}Default holdings modified!"); languageManager.addLanguageEntry("currency_added", "{{DARK_GREEN}}Currency added!"); languageManager.addLanguageEntry("currency_already_exists", "{{DARK_RED}}This currency already exists!"); languageManager.addLanguageEntry("currency_add_cmd_help", "/currency add <Name> <Name Plural> <Minor> <Minor Plural> <Sign> - Add a currency."); languageManager.addLanguageEntry("currency_default_cmd_help", "/currency default <Name> - Set a currency as the default one."); languageManager.addLanguageEntry("currency_delete_cmd_help", "/currency delete <Name> - Delete a currency {{DARK_RED}}It also deletes all balance with this currency."); languageManager.addLanguageEntry("currency_edit_cmd_help", "/currency edit <name/nameplural/minor/minorplural/sign> <Currency Name> <new Value> - Modify a currency."); languageManager.addLanguageEntry("currency_help_cmd_help", "/currency - shows currency command help"); languageManager.addLanguageEntry("currency_info_cmd_help", "/currency info <Name> - Display the information about a currency."); languageManager.addLanguageEntry("default_currency_set", "%s {{DARK_GREEN}}has been set as the default currency!"); languageManager.addLanguageEntry("currency_deleted", "{{DARK_GREEN}}Currency deleted!"); languageManager.addLanguageEntry("currency_modified", "{{DARK_GREEN}}Currency modified!"); languageManager.addLanguageEntry("invalid_type", "{{DARK_RED}}Invalid type!"); languageManager.addLanguageEntry("currency_empty_value", "{{DARK_RED}}Can't change a currency value to empty (Aka \\)"); languageManager.addLanguageEntry("currency_help_title", "{{DARK_GREEN}} ======== Currency Commands ========"); languageManager.addLanguageEntry("currency_info_name", "{{DARK_GREEN}}Name: {{WHITE}}%s"); languageManager.addLanguageEntry("currency_info_name_plural", "{{DARK_GREEN}}Name Plural: {{WHITE}}%s"); languageManager.addLanguageEntry("currency_info_minor", "{{DARK_GREEN}}Minor: {{WHITE}}%s"); languageManager.addLanguageEntry("currency_info_minor_plural", "{{DARK_GREEN}}Minor plural: {{WHITE}}%s"); languageManager.addLanguageEntry("money_all_title", "{{DARK_GREEN}}Balance: "); languageManager.addLanguageEntry("money_all_cmd_help", "/money all - Display your balance on all the worlds"); languageManager.addLanguageEntry("money_balance_cmd_help", "/money balance <Player Name> - Display the balance of a player"); languageManager.addLanguageEntry("money_create_cmd_help", "/money create <Name> - Create a account"); languageManager.addLanguageEntry("money_delete_cmd_help", "/money delete <Name> - Delete a account"); languageManager.addLanguageEntry("money_give_cmd_help", "/money give <Player Name> <Amount> [Currency] [World] - Give money to someone"); languageManager.addLanguageEntry("money_main_cmd_help", "/money - List your balance"); languageManager.addLanguageEntry("money_help_cmd_help", "/money help - Shows money help"); languageManager.addLanguageEntry("money_pay_cmd_help", "/money pay <Player Name> <Amount> [Currency] - Send money to someone"); languageManager.addLanguageEntry("money_set_cmd_help", "/money set <Player Name> <Amount> [Currency] [World] - set a balance of someone"); languageManager.addLanguageEntry("money_take_cmd_help", "/money take <Player Name> <Amount> [Currency] [World] - take money from someone"); languageManager.addLanguageEntry("money_top_cmd_help", "/money top <Currency> [Page] [World] - Shows the top list"); languageManager.addLanguageEntry("money_create_success", "{{DARK_GREEN}} Account created!"); languageManager.addLanguageEntry("money_delete_success", "{{DARK_GREEN}}The account {{WHITE}}%s {{DARK_GREEN}}has been deleted!"); languageManager.addLanguageEntry("money_give_received", "{{DARK_GREEN}}Received {{WHITE}}%s {{DARK_GREEN}}from {{WHITE}}%s"); languageManager.addLanguageEntry("money_give_send", "{{DARK_GREEN}}Gave {{WHITE}}%s {{DARK_GREEN}}to {{WHITE}}%s"); languageManager.addLanguageEntry("money_help_title", "{{DARK_GREEN}} ======== Money Commands ========"); languageManager.addLanguageEntry("money_pay_sent", "{{DARK_GREEN}}Sent {{WHITE}}%s {{DARK_GREEN}}to {{WHITE}}%s"); languageManager.addLanguageEntry("money_pay_received", "{{DARK_GREEN}}Received {{WHITE}}%s {{DARK_GREEN}}from {{WHITE}}%s"); languageManager.addLanguageEntry("money_set", "{{DARK_GREEN}}Set {{WHITE}}%s {{DARK_GREEN}}balance to {{WHITE}}%s"); languageManager.addLanguageEntry("money_set_other", "{{DARK_GREEN}}Your money has been set to {{WHITE}}%s {{DARK_GREEN}}by {{WHITE}}%s"); languageManager.addLanguageEntry("money_take", "{{DARK_GREEN}}Took {{WHITE}}%s {{DARK_GREEN}}from {{WHITE}}%s"); languageManager.addLanguageEntry("money_take_other", "{{WHITE}}%s {{DARK_GREEN}}has been removed from your account by {{WHITE}}%s"); languageManager.addLanguageEntry("player_not_exist", "{{DARK_RED}}The player doesn't exist!"); languageManager.addLanguageEntry("invalid_page", "{{DARK_RED}}Invalid page!"); languageManager.addLanguageEntry("money_top_header", "{{DARK_GREEN}} Money Top | Page {{WHITE}}%s {{DARK_GREEN}} | World {{WHITE}}%s"); languageManager.addLanguageEntry("payday_create_cmd_help", "/payday create <Name> <Interval> <wage/tax> <Amount> [Account] [Currency Name] [World Name] - Create a new payday"); languageManager.addLanguageEntry("payday_delete_cmd_help", "/payday delete <Name> - Delete a PayDay."); languageManager.addLanguageEntry("payday_help_cmd_help", "/payday - shows payday command help"); languageManager.addLanguageEntry("payday_info_cmd_help", "/payday info <Payday Name> - Show information about a payday."); languageManager.addLanguageEntry("payday_list_cmd_help", "/payday list - List all payday"); languageManager.addLanguageEntry("payday_modify_cmd_help", "/payday modify <Name> <Name/status/disabled/interval/amount/account/currency/World> <Value> - Modify a payday setting."); languageManager.addLanguageEntry("payday_help_title", "{{DARK_GREEN}} ======== PayDay Commands ========"); languageManager.addLanguageEntry("payday_already_exist", "{{DARK_RED}}There's already a payday named like that!"); languageManager.addLanguageEntry("invalid_interval", "{{DARK_RED}}Invalid interval!"); languageManager.addLanguageEntry("payday_invalid_mode", "{{DARK_RED}}Invalid mode. only wage or tax is supported!"); languageManager.addLanguageEntry("payday_create_success", "{{DARK_GREEN}}Payday added! Add the permission node {{WHITE}}%s {{DARK_GREEN}}to the players you want to add this payday!"); languageManager.addLanguageEntry("payday_not_found", "{{DARK_RED}}PayDay not found!"); languageManager.addLanguageEntry("error_occured", "{{DARK_GREEN}}A error occured. Check the console for any errors!"); languageManager.addLanguageEntry("payday_removed", "{{DARK_GREEN}}Payday removed!"); languageManager.addLanguageEntry("payday_info_title", "{{DARK_GREEN}} ======== {{WHITE}}%s information {{DARK_GREEN}}========"); languageManager.addLanguageEntry("payday_info_type_wage", "{{DARK_GREEN}}Type: {{WHITE}}Wage"); languageManager.addLanguageEntry("payday_info_type_tax", "{{DARK_GREEN}}Type: {{WHITE}}Tax"); languageManager.addLanguageEntry("payday_info_account", "{{DARK_GREEN}}Account: {{WHITE}}%s"); languageManager.addLanguageEntry("payday_info_interval", "{{DARK_GREEN}}Interval: {{WHITE}}%s"); languageManager.addLanguageEntry("payday_info_amount", "{{DARK_GREEN}}Amount: {{WHITE}}%s"); languageManager.addLanguageEntry("payday_list_title", "{{DARK_GREEN}} ========= {{WHITE}}Payday list {{DARK_GREEN}}========="); languageManager.addLanguageEntry("invalid_edit_mode", "{{DARK_RED}}Invalid Edit mode."); languageManager.addLanguageEntry("world_changed", "{{DARK_GREEN}}World changed!"); languageManager.addLanguageEntry("currency_changed", "{{DARK_GREEN}}Currency changed!"); languageManager.addLanguageEntry("account_changed", "{{DARK_GREEN}}Account changed!"); languageManager.addLanguageEntry("amount_changed", "{{DARK_GREEN}}Amount changed!"); languageManager.addLanguageEntry("interval_changed", "{{DARK_GREEN}}Interval changed!"); languageManager.addLanguageEntry("disabled_changed", "{{DARK_GREEN}}Disabled changed!"); languageManager.addLanguageEntry("status_changed", "{{DARK_GREEN}}Status changed!"); languageManager.addLanguageEntry("name_changed", "{{DARK_GREEN}}Name changed!"); languageManager.addLanguageEntry("invalid_interval", "{{DARK_RED}}Invalid interval! I need a amount of seconds! (Example: 60 for 60 seconds)"); languageManager.addLanguageEntry("invalid_disabled", "{{DARK_RED}}Invalid disabled mode! Valid values are: true/false"); languageManager.addLanguageEntry("invalid_status", "{{DARK_RED}}Invalid status! Valid values are: wage/tax"); languageManager.addLanguageEntry("payday_with_name_already_exist", "{{DARK_RED}}There's already a payday with this name!"); languageManager.addLanguageEntry("money_exchange_cmd_help", "/money exchange <Current Currency> <New Currency> <Amount> -Exchange a currency"); languageManager.addLanguageEntry("no_exchange_rate", "{{DARK_RED}}No exchange rate from {{WHITE}}%s {{DARK_RED}}to {{WHITE}}%s!"); languageManager.addLanguageEntry("exchange_done", "{{WHITE}}%s %s {{DARK_GREEN}}has been converted to {{WHITE}}%s %s"); languageManager.addLanguageEntry("currency_exchange_cmd_help", "/currency exchange <Currency from> <Currency to> <amount> - set a currency exchange rate"); languageManager.addLanguageEntry("currency_exchange_set", "Currency exchange set!"); languageManager.addLanguageEntry("world_group_manager_loaded", "World Group Manager loaded!"); languageManager.addLanguageEntry("group_create_cmd_help", "/ccgroup create <Name> - Create a world group."); languageManager.addLanguageEntry("group_addworld_cmd_help", "/ccgroup addworld <Group Name> <World Name> - Add a world to a world group."); languageManager.addLanguageEntry("group_already_exist", "{{DARK_RED}}This world group already exist!"); languageManager.addLanguageEntry("group_created", "World group created!"); languageManager.addLanguageEntry("group_not_exist", "{{DARK_RED}}This world group doesn't exist!"); languageManager.addLanguageEntry("group_world_added", "World added to the group!"); languageManager.addLanguageEntry("world_already_in_group", "{{DARK_RED}}This world is already in a group! Please remove it with {{WHITE}}/ccgroup delworld %s"); languageManager.addLanguageEntry("group_delworld_cmd_help", "/ccgroup delworld <World Name> - Remove a world from his group. Reverting it to the default group."); languageManager.addLanguageEntry("world_not_in_group", "{{DARK_RED}}This world isin't in a group!"); languageManager.addLanguageEntry("world_removed_from_group", "The world has been removed from the group! It has been set to the default group."); languageManager.addLanguageEntry("loading_currency_manager", "Loading the Currency manager."); languageManager.addLanguageEntry("command_prefix", "{{DARK_GREEN}}[{{WHITE}}Money{{DARK_GREEN}}]{{WHITE}} "); languageManager.addLanguageEntry("group_help_title", "{{DARK_GREEN}} ======== Group Commands ========"); languageManager.addLanguageEntry("group_help_cmd_help", "/ccgroup - Shows ccgroup help."); languageManager.addLanguageEntry("money_infinite_cmd_help", "/money infinite <Account Name> - Put a account in infinite money mode."); languageManager.addLanguageEntry("money_infinite_set_false", "The account is no more infinite!"); languageManager.addLanguageEntry("money_infinite_set_true", "The account is now infinite!"); languageManager.addLanguageEntry("money_log_header", "{{DARK_GREEN}} Money Log | Page {{WHITE}}%s {{DARK_GREEN}} | Account {{WHITE}}%s"); languageManager.addLanguageEntry("money_log_cmd_help", "/money log <page> [Account Name] - Show the account log"); languageManager.addLanguageEntry("bank_list_cmd_help", "/bank list - List all the bank accounts you have access"); languageManager.addLanguageEntry("bank_account_list", "List of bank accounts: %s"); languageManager.addLanguageEntry("currency_rates_cmd_help", "/currency rates - Show all the exchange rates available."); languageManager.addLanguageEntry("rates_header", "{{DARK_GREEN}}[Currency rates]"); languageManager.addLanguageEntry("bank_delete_cmd_help", "/bank delete <Name> - Delete a bank account that you own."); languageManager.addLanguageEntry("bank_delete_not_owner", "{{DARK_RED}}You aren't this bank owner!"); languageManager.addLanguageEntry("bank_account_deleted", "Bank account deleted"); languageManager.addLanguageEntry("currency_list_cmd_help", "/currency list - List all the currencies"); languageManager.addLanguageEntry("currency_list_title", "{{DARK_GREEN}}====== {{WHITE}}Currencies {{DARK_GREEN}}======"); languageManager.addLanguageEntry("invalid_time_log", "Invalid time! It needs to be a positive number!"); languageManager.addLanguageEntry("log_cleared", "The log table has been cleared up to the time you said!"); languageManager.addLanguageEntry("craftconomy_clearlog_cmd_help", "/craftconomy clearlog <Time in days> - Clear the log table from entries olders than the value provided"); languageManager.addLanguageEntry("bank_ignoreacl_cmd_help", "/bank ignoreacl <Account Name> - Ignore the ACL system for that account."); languageManager.addLanguageEntry("account_is_ignoring_acl", "The account is now ignoring the ACL!"); languageManager.addLanguageEntry("account_is_not_ignoring_acl", "The account is now following the ACL!"); languageManager.addLanguageEntry("starting_database_convert", "Starting database convertion to MySQL. This can take come time."); languageManager.addLanguageEntry("convert_save_account", "Converting accounts... (1/9)"); languageManager.addLanguageEntry("convert_save_balance", "Converting balances... (2/9)"); languageManager.addLanguageEntry("convert_save_access", "Converting bank access... (3/9)"); languageManager.addLanguageEntry("convert_save_currency", "Converting currencies... (4/9)"); languageManager.addLanguageEntry("convert_save_config", "Converting config... (5/9)"); languageManager.addLanguageEntry("convert_save_payday", "Converting payday... (6/9)"); languageManager.addLanguageEntry("convert_save_exchange", "Converting exchange... (7/9)"); languageManager.addLanguageEntry("convert_save_worldgroup", "Converting worldgroups... (8/9)"); languageManager.addLanguageEntry("convert_save_log", "Converting logs... (9/9)"); languageManager.addLanguageEntry("convert_done", "Conversion done!"); languageManager.addLanguageEntry("config_reload_help_cmd", "/craftconomy reload - Reload craftconomy."); languageManager.addLanguageEntry("craftconomy_reloaded", "Craftconomy has been reloaded!"); } /** * Initialize the configuration file */ private void initializeConfig() { mainConfig.setValue("System.Setup", true); mainConfig.setValue("System.QuickSetup.Enable", false); mainConfig.setValue("System.QuickSetup.Currency.Name", "Dollar"); mainConfig.setValue("System.QuickSetup.Currency.NamePlural", "Dollars"); mainConfig.setValue("System.QuickSetup.Currency.Minor", "Coin"); mainConfig.setValue("System.QuickSetup.Currency.MinorPlural", "Coins"); mainConfig.setValue("System.QuickSetup.Currency.Sign", "$"); mainConfig.setValue("System.QuickSetup.StartBalance", 100.0); mainConfig.setValue("System.QuickSetup.PriceBank", 200.0); mainConfig.setValue("System.QuickSetup.DisplayMode", "long"); mainConfig.setValue("System.CheckNewVersion", true); mainConfig.setValue("System.Case-sentitive", false); mainConfig.setValue("System.CreateOnLogin", false); mainConfig.setValue("System.Logging.Enabled", false); mainConfig.setValue("System.Database.Type", "h2"); mainConfig.setValue("System.Database.Address", "localhost"); mainConfig.setValue("System.Database.Port", 3306); mainConfig.setValue("System.Database.Username", "root"); mainConfig.setValue("System.Database.Password", ""); mainConfig.setValue("System.Database.Db", "craftconomy"); mainConfig.setValue("System.Database.Prefix", "cc3_"); mainConfig.setValue("System.Database.Poolsize", 10); mainConfig.setValue("System.Database.ConvertFromH2", false); } /** * Run a database update. */ private void updateDatabase() { if (getMainConfig().getInt("Database.dbVersion") == 0) { alertOldDbVersion(0, 1); //We first check if we have the DB version in the database. If we do, we have a old layout in our hands String value = getStorageHandler().getStorageEngine().getConfigEntry("dbVersion"); if (value != null) { //We have a old database, do the whole conversion try { new OldFormatConverter().run(); getMainConfig().setValue("Database.dbVersion", 1); sendConsoleMessage(Level.INFO, "Updated to Revision 1!"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } else { getMainConfig().setValue("Database.dbVersion", 1); sendConsoleMessage(Level.INFO, "Updated to Revision 1!"); } } else if (getMainConfig().getInt("Database.dbVersion") == -1) { alertOldDbVersion(-1,1); try { new OldFormatConverter().step2(); getMainConfig().setValue("Database.dbVersion", 1); sendConsoleMessage(Level.INFO, "Updated to Revision 1!"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } } /** * Alert in the console of a database update. * * @param currentVersion The current version * @param newVersion The database update version */ private void alertOldDbVersion(int currentVersion, int newVersion) { Common.getInstance().sendConsoleMessage(Level.INFO, "Your database is out of date! (Version " + currentVersion + "). Updating it to Revision " + newVersion + "."); } private void addFeatherboardSupport() { if (getServerCaller() instanceof BukkitServerCaller && getServerCaller().isPluginEnabled("MVdWPlaceholderAPI")) { FeatherBoard.registerPlaceHolder(getServerCaller().getLoader(), "cc3money", new FeatherBoard.FeatherBoardReplaceEvent() { @Override public String getResult(String username, boolean isOnline) { if (getAccountManager().exist(username, false)) { return format(null, getCurrencyManager().getDefaultCurrency(), getAccountManager().getAccount(username, false).getBalance("default", getCurrencyManager().getDefaultCurrency().getName()), getDisplayFormat()); } return ""; } }); } } }