package com.Acrobot.ChestShop; import com.Acrobot.Breeze.Configuration.Configuration; import com.Acrobot.ChestShop.Commands.Give; import com.Acrobot.ChestShop.Commands.ItemInfo; import com.Acrobot.ChestShop.Commands.Version; import com.Acrobot.ChestShop.Configuration.Messages; import com.Acrobot.ChestShop.Configuration.Properties; import com.Acrobot.ChestShop.DB.Generator; import com.Acrobot.ChestShop.DB.Queue; import com.Acrobot.ChestShop.DB.Transaction; import com.Acrobot.ChestShop.Listeners.Block.BlockPlace; import com.Acrobot.ChestShop.Listeners.Block.Break.ChestBreak; import com.Acrobot.ChestShop.Listeners.Block.Break.SignBreak; import com.Acrobot.ChestShop.Listeners.Block.SignCreate; import com.Acrobot.ChestShop.Listeners.Economy.ServerAccountCorrector; import com.Acrobot.ChestShop.Listeners.Economy.TaxModule; import com.Acrobot.ChestShop.Listeners.Item.ItemMoveListener; import com.Acrobot.ChestShop.Listeners.ItemInfoListener; import com.Acrobot.ChestShop.Listeners.Modules.DiscountModule; import com.Acrobot.ChestShop.Listeners.Modules.PriceRestrictionModule; import com.Acrobot.ChestShop.Listeners.Player.*; import com.Acrobot.ChestShop.Listeners.PostShopCreation.CreationFeeGetter; import com.Acrobot.ChestShop.Listeners.PostShopCreation.MessageSender; import com.Acrobot.ChestShop.Listeners.PostShopCreation.ShopCreationLogger; import com.Acrobot.ChestShop.Listeners.PostShopCreation.SignSticker; import com.Acrobot.ChestShop.Listeners.PostTransaction.*; import com.Acrobot.ChestShop.Listeners.PreShopCreation.*; import com.Acrobot.ChestShop.Listeners.PreTransaction.*; import com.Acrobot.ChestShop.Listeners.PreTransaction.ErrorMessageSender; import com.Acrobot.ChestShop.Listeners.PreTransaction.PermissionChecker; import com.Acrobot.ChestShop.Listeners.ShopRemoval.ShopRefundListener; import com.Acrobot.ChestShop.Listeners.ShopRemoval.ShopRemovalLogger; import com.Acrobot.ChestShop.Logging.FileFormatter; import com.Acrobot.ChestShop.Metadata.ItemDatabase; import com.Acrobot.ChestShop.Signs.RestrictedSign; import com.Acrobot.ChestShop.Utils.uName; import com.avaje.ebean.EbeanServer; import com.lennardf1989.bukkitex.Database; import com.nijikokun.register.payment.forChestShop.Methods; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.event.Event; import org.bukkit.event.Listener; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; import org.mcstats.Metrics; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.FileHandler; import java.util.logging.Logger; /** * Main file of the plugin * * @author Acrobot */ public class ChestShop extends JavaPlugin { private static ChestShop plugin; private static Server server; private static PluginDescriptionFile description; private static File dataFolder; private static EbeanServer database; private static ItemDatabase itemDatabase; private static Logger logger; private FileHandler handler; public void onEnable() { plugin = this; logger = getLogger(); dataFolder = getDataFolder(); description = getDescription(); server = getServer(); Configuration.pairFileAndClass(loadFile("config.yml"), Properties.class); Configuration.pairFileAndClass(loadFile("local.yml"), Messages.class); itemDatabase = new ItemDatabase(); uName.file = loadFile("longName.storage"); uName.load(); Methods.setPreferred(Properties.PREFERRED_ECONOMY_PLUGIN); Dependencies.loadPlugins(); registerEvents(); if (Properties.LOG_TO_DATABASE || Properties.GENERATE_STATISTICS_PAGE) { setupDB(); } if (Properties.GENERATE_STATISTICS_PAGE) { File htmlFolder = new File(Properties.STATISTICS_PAGE_PATH); scheduleTask(new Generator(htmlFolder), 300L, Properties.STATISTICS_PAGE_GENERATION_INTERVAL * 20L); } if (Properties.LOG_TO_FILE) { File log = loadFile("ChestShop.log"); FileHandler handler = loadHandler(log.getAbsolutePath()); handler.setFormatter(new FileFormatter()); this.handler = handler; logger.addHandler(handler); } if (!Properties.LOG_TO_CONSOLE) { logger.setUseParentHandlers(false); } getCommand("iteminfo").setExecutor(new ItemInfo()); getCommand("csVersion").setExecutor(new Version()); getCommand("csGive").setExecutor(new Give()); startStatistics(); } public static File loadFile(String string) { File file = new File(dataFolder, string); return loadFile(file); } private static File loadFile(File file) { if (!file.exists()) { try { if (file.getParent() != null) { file.getParentFile().mkdirs(); } file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } return file; } private static FileHandler loadHandler(String path) { FileHandler handler = null; try { handler = new FileHandler(path, true); } catch (IOException ex) { ex.printStackTrace(); } return handler; } public void onDisable() { getServer().getScheduler().cancelTasks(this); if (handler != null) { handler.close(); getLogger().removeHandler(handler); } } ////////////////// REGISTER EVENTS, SCHEDULER & STATS /////////////////////////// private void registerEvents() { registerEvent(new com.Acrobot.ChestShop.Plugins.ChestShop()); //Chest protection registerPreShopCreationEvents(); registerPreTransactionEvents(); registerPostShopCreationEvents(); registerPostTransactionEvents(); registerShopRemovalEvents(); registerModules(); registerEvent(new SignBreak()); registerEvent(new SignCreate()); registerEvent(new ChestBreak()); registerEvent(new BlockPlace()); registerEvent(new PlayerConnect()); registerEvent(new PlayerInteract()); registerEvent(new PlayerInventory()); registerEvent(new PlayerTeleport()); registerEvent(new ItemInfoListener()); registerEvent(new RestrictedSign()); registerEvent(new ShortNameSaver()); if (!Properties.TURN_OFF_HOPPER_PROTECTION) { registerEvent(new ItemMoveListener()); } } private void registerShopRemovalEvents() { registerEvent(new ShopRefundListener()); registerEvent(new ShopRemovalLogger()); } private void registerPreShopCreationEvents() { if (Properties.BLOCK_SHOPS_WITH_SELL_PRICE_HIGHER_THAN_BUY_PRICE) { registerEvent(new PriceRatioChecker()); } registerEvent(new ChestChecker()); registerEvent(new ItemChecker()); registerEvent(new MoneyChecker()); registerEvent(new NameChecker()); registerEvent(new com.Acrobot.ChestShop.Listeners.PreShopCreation.PermissionChecker()); registerEvent(new com.Acrobot.ChestShop.Listeners.PreShopCreation.ErrorMessageSender()); registerEvent(new PriceChecker()); registerEvent(new QuantityChecker()); registerEvent(new TerrainChecker()); } private void registerPostShopCreationEvents() { registerEvent(new CreationFeeGetter()); registerEvent(new MessageSender()); registerEvent(new SignSticker()); registerEvent(new ShopCreationLogger()); } private void registerPreTransactionEvents() { if (Properties.ALLOW_PARTIAL_TRANSACTIONS) { registerEvent(new PartialTransactionModule()); } else { registerEvent(new AmountAndPriceChecker()); } registerEvent(new CreativeModeIgnorer()); registerEvent(new ErrorMessageSender()); registerEvent(new PermissionChecker()); registerEvent(new PriceValidator()); registerEvent(new ShopValidator()); registerEvent(new SpamClickProtector()); registerEvent(new StockFittingChecker()); } private void registerPostTransactionEvents() { registerEvent(new EconomicModule()); registerEvent(new EmptyShopDeleter()); registerEvent(new ItemManager()); registerEvent(new TransactionLogger()); registerEvent(new TransactionMessageSender()); } private void registerModules() { registerEvent(new DiscountModule()); registerEvent(new PriceRestrictionModule()); registerEconomicalModules(); } private void registerEconomicalModules() { registerEvent(new ServerAccountCorrector()); registerEvent(new TaxModule()); } public void registerEvent(Listener listener) { getServer().getPluginManager().registerEvents(listener, this); } private void scheduleTask(Runnable runnable, long startTime, long repetetionTime) { server.getScheduler().runTaskTimerAsynchronously(this, runnable, startTime, repetetionTime); } private void startStatistics() { try { new Metrics(this).start(); } catch (IOException ex) { ChestShop.getBukkitLogger().severe("There was an error while submitting statistics."); } } ///////////////////// DATABASE STUFF //////////////////////////////// private void setupDB() { loadFile(new File("ebean.properties")); Database DB; DB = new Database(this) { protected java.util.List> getDatabaseClasses() { List> list = new ArrayList>(); list.add(Transaction.class); return list; } }; FileConfiguration config = YamlConfiguration.loadConfiguration(new File("bukkit.yml")); DB.initializeDatabase( config.getString("database.driver"), config.getString("database.url"), config.getString("database.username"), config.getString("database.password"), config.getString("database.isolation") ); database = DB.getDatabase(); scheduleTask(new Queue(), 200L, 200L); } @Override public EbeanServer getDatabase() { return database; } /////////////////////////////////////////////////////////////////////////////// public static ItemDatabase getItemDatabase() { return itemDatabase; } public static File getFolder() { return dataFolder; } public static Logger getBukkitLogger() { return logger; } public static Server getBukkitServer() { return server; } public static String getVersion() { return description.getVersion(); } public static String getPluginName() { return description.getName(); } public static EbeanServer getDB() { return database; } public static List getDependencies() { return description.getSoftDepend(); } public static ChestShop getPlugin() { return plugin; } public static void registerListener(Listener listener) { plugin.registerEvent(listener); } public static void callEvent(Event event) { Bukkit.getPluginManager().callEvent(event); } }