ChestShop-3/src/main/java/com/Acrobot/ChestShop/ChestShop.java

469 lines
16 KiB
Java
Raw Normal View History

2011-05-15 19:33:03 +02:00
package com.Acrobot.ChestShop;
import com.Acrobot.Breeze.Configuration.Configuration;
2013-10-27 16:49:14 +01:00
import com.Acrobot.ChestShop.Commands.Give;
2011-05-29 13:25:25 +02:00
import com.Acrobot.ChestShop.Commands.ItemInfo;
import com.Acrobot.ChestShop.Commands.Toggle;
2011-05-29 13:25:25 +02:00
import com.Acrobot.ChestShop.Commands.Version;
import com.Acrobot.ChestShop.Commands.AccessToggle;
import com.Acrobot.ChestShop.Configuration.Messages;
import com.Acrobot.ChestShop.Configuration.Properties;
2015-05-22 13:25:32 +02:00
import com.Acrobot.ChestShop.Database.Migrations;
import com.Acrobot.ChestShop.Listeners.Block.BlockPlace;
2012-09-12 12:35:48 +02:00
import com.Acrobot.ChestShop.Listeners.Block.Break.ChestBreak;
import com.Acrobot.ChestShop.Listeners.Block.Break.SignBreak;
2013-01-24 22:35:28 +01:00
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.AuthMeChestShopListener;
2015-05-22 13:25:32 +02:00
import com.Acrobot.ChestShop.Listeners.GarbageTextListener;
2013-03-24 20:57:54 +01:00
import com.Acrobot.ChestShop.Listeners.Item.ItemMoveListener;
import com.Acrobot.ChestShop.Listeners.ItemInfoListener;
2019-01-17 19:50:47 +01:00
import com.Acrobot.ChestShop.Listeners.SignParseListener;
2013-04-23 21:04:59 +02:00
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.PreShopCreation.CreationFeeGetter;
2013-01-24 22:35:28 +01:00
import com.Acrobot.ChestShop.Listeners.PostShopCreation.MessageSender;
2013-08-07 02:03:09 +02:00
import com.Acrobot.ChestShop.Listeners.PostShopCreation.ShopCreationLogger;
2013-01-24 22:35:28 +01:00
import com.Acrobot.ChestShop.Listeners.PostShopCreation.SignSticker;
import com.Acrobot.ChestShop.Listeners.PostTransaction.*;
2013-01-24 22:35:28 +01:00
import com.Acrobot.ChestShop.Listeners.PreShopCreation.*;
import com.Acrobot.ChestShop.Listeners.PreTransaction.*;
2013-01-24 22:35:28 +01:00
import com.Acrobot.ChestShop.Listeners.PreTransaction.ErrorMessageSender;
import com.Acrobot.ChestShop.Listeners.PreTransaction.PermissionChecker;
2013-08-07 02:03:09 +02:00
import com.Acrobot.ChestShop.Listeners.ShopRemoval.ShopRefundListener;
import com.Acrobot.ChestShop.Listeners.ShopRemoval.ShopRemovalLogger;
import com.Acrobot.ChestShop.Logging.FileFormatter;
2013-01-24 22:35:28 +01:00
import com.Acrobot.ChestShop.Metadata.ItemDatabase;
2012-08-10 19:00:20 +02:00
import com.Acrobot.ChestShop.Signs.RestrictedSign;
2014-04-12 13:57:39 +02:00
import com.Acrobot.ChestShop.UUIDs.NameManager;
import com.Acrobot.ChestShop.Updater.Updater;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
2016-08-20 22:17:10 +02:00
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
2011-05-29 13:25:25 +02:00
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
2011-05-29 13:25:25 +02:00
import java.util.List;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
2011-05-29 13:25:25 +02:00
/**
* Main file of the plugin
2011-05-29 13:25:25 +02:00
*
* @author Acrobot
*/
2011-05-15 19:33:03 +02:00
public class ChestShop extends JavaPlugin {
2013-01-24 22:35:28 +01:00
private static ChestShop plugin;
private static Server server;
private static PluginDescriptionFile description;
2013-01-24 22:35:28 +01:00
private static File dataFolder;
private static ItemDatabase itemDatabase;
2013-01-24 22:35:28 +01:00
private static Logger logger;
private FileHandler handler;
private List<PluginCommand> commands = new ArrayList<>();
2015-05-22 13:25:32 +02:00
public ChestShop() {
dataFolder = getDataFolder();
2015-05-22 13:25:32 +02:00
logger = getLogger();
description = getDescription();
server = getServer();
2015-05-22 13:25:32 +02:00
plugin = this;
}
2018-08-29 21:32:27 +02:00
@Override
public void onLoad() {
Dependencies.initializePlugins();
}
@Override
2015-05-22 13:25:32 +02:00
public void onEnable() {
turnOffDatabaseLogging();
if (!handleMigrations()) {
return;
}
2014-04-12 17:37:23 +02:00
registerCommand("iteminfo", new ItemInfo(), Permission.ITEMINFO);
registerCommand("csVersion", new Version(), Permission.ADMIN);
registerCommand("csGive", new Give(), Permission.ADMIN);
registerCommand("cstoggle", new Toggle(), Permission.NOTIFY_TOGGLE);
registerCommand("csaccess", new AccessToggle(), Permission.ACCESS_TOGGLE);
loadConfig();
itemDatabase = new ItemDatabase();
if (!Dependencies.loadPlugins()) {
getServer().getPluginManager().disablePlugin(this);
return;
}
2011-05-29 13:25:25 +02:00
registerEvents();
registerPluginMessagingChannels();
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);
}
2012-12-19 18:54:23 +01:00
if (!Properties.LOG_TO_CONSOLE) {
logger.setUseParentHandlers(false);
}
2011-05-29 13:25:25 +02:00
startStatistics();
2014-03-20 16:57:19 +01:00
startUpdater();
}
private void registerCommand(String name, CommandExecutor executor, Permission permission) {
PluginCommand command = getCommand(name);
command.setExecutor(executor);
command.setPermission(permission.toString());
commands.add(command);
}
public void loadConfig() {
Configuration.pairFileAndClass(loadFile("config.yml"), Properties.class, getBukkitLogger());
Configuration.pairFileAndClass(loadFile("local.yml"), Messages.class, getBukkitLogger());
NameManager.load();
commands.forEach(c -> c.setPermissionMessage(Messages.prefix(Messages.ACCESS_DENIED)));
}
private void turnOffDatabaseLogging() {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
org.apache.logging.log4j.core.config.Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig("");
loggerConfig.addFilter(new AbstractFilter() {
@Override
public Result filter(org.apache.logging.log4j.core.Logger logger, Level level, Marker marker, String msg, Object... params) {
return filter(logger.getName(), level);
}
@Override
public Result filter(org.apache.logging.log4j.core.Logger logger, Level level, Marker marker, Object msg, Throwable t) {
return filter(logger.getName(), level);
}
@Override
public Result filter(org.apache.logging.log4j.core.Logger logger, Level level, Marker marker, Message msg, Throwable t) {
return filter(logger.getName(), level);
}
@Override
public Result filter(LogEvent event) {
return filter(event.getLoggerName(), event.getLevel());
}
private Result filter(String classname, Level level) {
if (level.intLevel() <= Level.ERROR.intLevel() && !classname.contains("SqliteDatabaseType")) {
return Result.NEUTRAL;
}
if (classname.contains("SqliteDatabaseType") || classname.contains("TableUtils")) {
return Result.DENY;
} else {
return Result.NEUTRAL;
}
}
});
}
private boolean handleMigrations() {
2014-04-21 17:08:20 +02:00
File versionFile = loadFile("version");
YamlConfiguration previousVersion = YamlConfiguration.loadConfiguration(versionFile);
2014-04-12 17:37:23 +02:00
if (previousVersion.get("version") == null) {
2015-05-22 13:25:32 +02:00
previousVersion.set("version", Migrations.CURRENT_DATABASE_VERSION);
2014-04-21 17:08:20 +02:00
try {
previousVersion.save(versionFile);
} catch (IOException e) {
e.printStackTrace();
}
2014-04-12 17:37:23 +02:00
}
int lastVersion = previousVersion.getInt("version");
2015-05-22 13:25:32 +02:00
int newVersion = Migrations.migrate(lastVersion);
2014-04-12 17:37:23 +02:00
if (newVersion == -1) {
plugin.getLogger().log(java.util.logging.Level.SEVERE, "Error while migrating! ChestShop can not run with a broken/outdated database...");
plugin.getServer().getPluginManager().disablePlugin(this);
return false;
} else if (lastVersion != newVersion) {
2015-05-22 13:25:32 +02:00
previousVersion.set("version", newVersion);
2015-03-11 18:01:50 +01:00
2015-05-22 13:25:32 +02:00
try {
previousVersion.save(versionFile);
} catch (IOException e) {
e.printStackTrace();
}
2014-04-12 17:37:23 +02:00
}
return true;
2014-04-12 17:37:23 +02:00
}
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 {
2013-04-05 13:11:06 +02:00
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);
Toggle.clearToggledPlayers();
if (handler != null) {
handler.close();
getLogger().removeHandler(handler);
}
}
////////////////// REGISTER EVENTS, SCHEDULER & STATS ///////////////////////////
private void registerEvents() {
2012-06-25 17:15:32 +02:00
registerEvent(new com.Acrobot.ChestShop.Plugins.ChestShop()); //Chest protection
registerEvent(new NameManager());
2013-01-24 22:35:28 +01:00
registerPreShopCreationEvents();
registerPreTransactionEvents();
registerPostShopCreationEvents();
registerPostTransactionEvents();
2013-08-07 02:03:09 +02:00
registerShopRemovalEvents();
2013-01-24 22:35:28 +01:00
2013-04-23 21:04:59 +02:00
registerModules();
registerEvent(new SignBreak());
2013-01-24 22:35:28 +01:00
registerEvent(new SignCreate());
2012-09-12 12:35:48 +02:00
registerEvent(new ChestBreak());
registerEvent(new BlockPlace());
registerEvent(new PlayerConnect());
registerEvent(new PlayerInteract());
2012-09-12 12:35:48 +02:00
registerEvent(new PlayerInventory());
registerEvent(new PlayerLeave());
2013-07-28 16:59:44 +02:00
registerEvent(new PlayerTeleport());
2019-01-17 19:50:47 +01:00
registerEvent(new SignParseListener());
registerEvent(new ItemInfoListener());
2015-05-22 13:25:32 +02:00
registerEvent(new GarbageTextListener());
2016-08-20 22:17:10 +02:00
Plugin authMe = getServer().getPluginManager().getPlugin("AuthMe");
2017-01-16 19:53:21 +01:00
if (authMe != null && authMe.isEnabled()) {
registerEvent(new AuthMeChestShopListener());
}
2013-01-24 22:35:28 +01:00
registerEvent(new RestrictedSign());
if (!Properties.TURN_OFF_HOPPER_PROTECTION) {
registerEvent(new ItemMoveListener());
}
2013-01-24 22:35:28 +01:00
}
2013-08-07 02:03:09 +02:00
private void registerShopRemovalEvents() {
registerEvent(new ShopRefundListener());
registerEvent(new ShopRemovalLogger());
}
2013-01-24 22:35:28 +01:00
private void registerPreShopCreationEvents() {
if (Properties.BLOCK_SHOPS_WITH_SELL_PRICE_HIGHER_THAN_BUY_PRICE) {
registerEvent(new PriceRatioChecker());
}
2013-01-24 22:35:28 +01:00
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());
}
2012-08-10 19:00:20 +02:00
2013-01-24 22:35:28 +01:00
private void registerPostShopCreationEvents() {
registerEvent(new CreationFeeGetter());
registerEvent(new MessageSender());
registerEvent(new SignSticker());
2013-08-07 02:03:09 +02:00
registerEvent(new ShopCreationLogger());
2013-01-24 22:35:28 +01:00
}
private void registerPreTransactionEvents() {
if (Properties.ALLOW_PARTIAL_TRANSACTIONS) {
registerEvent(new PartialTransactionModule());
} else {
registerEvent(new AmountAndPriceChecker());
}
2013-01-24 22:35:28 +01:00
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());
}
2013-04-23 21:04:59 +02:00
private void registerModules() {
registerEvent(new DiscountModule());
registerEvent(new PriceRestrictionModule());
registerEconomicalModules();
}
private void registerEconomicalModules() {
registerEvent(new ServerAccountCorrector());
registerEvent(new TaxModule());
2013-04-23 21:04:59 +02:00
}
private void registerPluginMessagingChannels() {
if (Properties.BUNGEECORD_MESSAGES) {
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
}
}
public void registerEvent(Listener listener) {
getServer().getPluginManager().registerEvents(listener, this);
}
private void startStatistics() {
try {
new org.mcstats.Metrics(this).start();
} catch (IOException ex) {
ChestShop.getBukkitLogger().severe("There was an error while submitting MCStats statistics.");
}
new org.bstats.bukkit.MetricsLite(this, 1109);
}
2014-03-20 16:57:19 +01:00
private static final int PROJECT_BUKKITDEV_ID = 31263;
private void startUpdater() {
if (Properties.TURN_OFF_UPDATES) {
return;
}
new Updater(this, PROJECT_BUKKITDEV_ID, this.getFile(), Updater.UpdateType.DEFAULT, true);
}
2011-05-29 13:25:25 +02:00
///////////////////////////////////////////////////////////////////////////////
2013-01-24 22:35:28 +01:00
public static ItemDatabase getItemDatabase() {
return itemDatabase;
}
public static File getFolder() {
return dataFolder;
}
public static Logger getBukkitLogger() {
return logger;
}
2011-05-29 13:25:25 +02:00
public static Server getBukkitServer() {
return server;
}
2011-05-29 13:25:25 +02:00
public static String getVersion() {
return description.getVersion();
2011-05-29 13:25:25 +02:00
}
public static String getPluginName() {
return description.getName();
2011-05-29 13:25:25 +02:00
}
2012-11-04 21:09:38 +01:00
public static List<String> getDependencies() {
return description.getSoftDepend();
}
2013-01-24 22:35:28 +01:00
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);
}
public static void sendBungeeMessage(String playerName, String message) {
if (Properties.BUNGEECORD_MESSAGES && !Bukkit.getOnlinePlayers().isEmpty()) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Message");
out.writeUTF(playerName);
out.writeUTF(message);
Bukkit.getOnlinePlayers().iterator().next().sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
}
}
}