From 62a11cb53a48bbf7b068b838f028932bf02eb223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9D=8F=E9=BB=91?= Date: Thu, 29 Nov 2018 15:53:41 +0800 Subject: [PATCH] =?UTF-8?q?+=20=E9=99=84=E5=B1=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=8D=95=E6=8D=89=20+=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=A4=9A=E6=9D=A1=E6=8F=92=E4=BB=B6=E6=9B=B4=E6=96=B0=E7=BA=BF?= =?UTF-8?q?=E8=B7=AF=EF=BC=88GitHub=EF=BC=8CGitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/com/ilummc/tlib/TLib.java | 2 - .../com/ilummc/tlib/filter/TLoggerFilter.java | 66 ++++++++-- .../tlib/filter/TLoggerFilterHandler.java | 13 ++ .../tlib/filter/impl/FilterConfiguration.java | 28 +++++ .../filter/impl/FilterExceptionMirror.java | 117 ++++++++++++++++++ .../impl/FilterInvalidPluginLoader.java | 18 +++ src/main/java/me/skymc/taboolib/Main.java | 8 +- .../commands/TabooLibMainCommand.java | 12 +- .../listener/ListenerPlayerCommand.java | 29 +++++ .../taboolib/listener/ListenerPlugin.java | 8 ++ .../me/skymc/taboolib/update/UpdateTask.java | 59 ++++++--- src/main/resources/config.yml | 3 + src/main/resources/lang/zh_CN.yml | 37 +++++- 14 files changed, 358 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/ilummc/tlib/filter/TLoggerFilterHandler.java create mode 100644 src/main/java/com/ilummc/tlib/filter/impl/FilterConfiguration.java create mode 100644 src/main/java/com/ilummc/tlib/filter/impl/FilterExceptionMirror.java create mode 100644 src/main/java/com/ilummc/tlib/filter/impl/FilterInvalidPluginLoader.java diff --git a/pom.xml b/pom.xml index d7af26c..6b1f8b0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.skymc TabooLib - 4.62 + 4.63 UTF-8 diff --git a/src/main/java/com/ilummc/tlib/TLib.java b/src/main/java/com/ilummc/tlib/TLib.java index 7ca4864..83559c3 100644 --- a/src/main/java/com/ilummc/tlib/TLib.java +++ b/src/main/java/com/ilummc/tlib/TLib.java @@ -4,7 +4,6 @@ import com.ilummc.tlib.annotations.Dependency; import com.ilummc.tlib.compat.PlaceholderHook; import com.ilummc.tlib.config.TLibConfig; import com.ilummc.tlib.db.Pool; -import com.ilummc.tlib.filter.TLoggerFilter; import com.ilummc.tlib.inject.TConfigWatcher; import com.ilummc.tlib.inject.TDependencyInjector; import com.ilummc.tlib.inject.TPluginManager; @@ -62,7 +61,6 @@ public class TLib { public static void init() { tLib = new TLib(); - TLoggerFilter.init(); TLocaleLoader.init(); PlaceholderHook.init(); TLocaleLoader.load(Main.getInst(), false); diff --git a/src/main/java/com/ilummc/tlib/filter/TLoggerFilter.java b/src/main/java/com/ilummc/tlib/filter/TLoggerFilter.java index b53ad30..7d42c12 100644 --- a/src/main/java/com/ilummc/tlib/filter/TLoggerFilter.java +++ b/src/main/java/com/ilummc/tlib/filter/TLoggerFilter.java @@ -1,10 +1,19 @@ package com.ilummc.tlib.filter; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.ilummc.tlib.filter.impl.FilterConfiguration; +import com.ilummc.tlib.filter.impl.FilterExceptionMirror; +import com.ilummc.tlib.filter.impl.FilterInvalidPluginLoader; +import me.skymc.taboolib.TabooLib; import org.bukkit.Bukkit; import java.util.Arrays; +import java.util.List; +import java.util.Map; import java.util.logging.Filter; import java.util.logging.LogRecord; +import java.util.logging.Logger; /** * @author Bkm016 @@ -12,22 +21,53 @@ import java.util.logging.LogRecord; */ public class TLoggerFilter implements Filter { - public static void init() { - Bukkit.getLogger().setFilter(new TLoggerFilter()); + private Filter filter; + private static List handlers = Lists.newLinkedList(); + private static Map pluginFilter = Maps.newHashMap(); + private static TLoggerFilter globalFilter; + + static { + handlers.add(new FilterConfiguration()); + handlers.add(new FilterExceptionMirror()); + handlers.add(new FilterInvalidPluginLoader()); + } + + public static void preInit() { + inject(new TLoggerFilter(), Bukkit.getLogger()); + inject(new TLoggerFilter(), TabooLib.instance().getLogger()); + } + + public static void postInit() { + Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(TabooLib::isDependTabooLib).forEach(plugin -> inject(new TLoggerFilter(), plugin.getLogger())); + } + + public static void inject(TLoggerFilter filter, Logger logger) { + try { + filter.filter = logger.getFilter(); + logger.setFilter(filter); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public Filter getFilter() { + return filter; + } + + public static TLoggerFilter getGlobalFilter() { + return globalFilter; + } + + public static Map getPluginFilter() { + return pluginFilter; + } + + public static List getHandlers() { + return handlers; } @Override public boolean isLoggable(LogRecord e) { - if (e.getMessage().contains("Cannot load configuration from stream")) { - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - for (StackTraceElement element : elements) { - if (element.getClassName().contains("ConfigUtils")) { - System.out.println(Arrays.asList(e.getParameters())); - } - } - return false; - } else { - return !e.getMessage().contains("Enabled plugin with unregistered PluginClassLoader"); - } + return handlers.stream().allMatch(filter -> filter.isLoggable(e)) && (filter == null || filter.isLoggable(e)); } } diff --git a/src/main/java/com/ilummc/tlib/filter/TLoggerFilterHandler.java b/src/main/java/com/ilummc/tlib/filter/TLoggerFilterHandler.java new file mode 100644 index 0000000..9e4ef1b --- /dev/null +++ b/src/main/java/com/ilummc/tlib/filter/TLoggerFilterHandler.java @@ -0,0 +1,13 @@ +package com.ilummc.tlib.filter; + +import java.util.logging.LogRecord; + +/** + * @Author 坏黑 + * @Since 2018-11-29 11:42 + */ +public abstract class TLoggerFilterHandler { + + abstract public boolean isLoggable(LogRecord e); + +} diff --git a/src/main/java/com/ilummc/tlib/filter/impl/FilterConfiguration.java b/src/main/java/com/ilummc/tlib/filter/impl/FilterConfiguration.java new file mode 100644 index 0000000..aeb6f3c --- /dev/null +++ b/src/main/java/com/ilummc/tlib/filter/impl/FilterConfiguration.java @@ -0,0 +1,28 @@ +package com.ilummc.tlib.filter.impl; + +import com.ilummc.tlib.filter.TLoggerFilterHandler; + +import java.util.Arrays; +import java.util.logging.LogRecord; + +/** + * @Author 坏黑 + * @Since 2018-11-29 11:47 + */ +public class FilterConfiguration extends TLoggerFilterHandler { + + @Override + public boolean isLoggable(LogRecord e) { + if (e.getMessage().contains("Cannot load configuration from stream")) { + StackTraceElement[] elements = Thread.currentThread().getStackTrace(); + for (StackTraceElement element : elements) { + if (element.getClassName().contains("ConfigUtils")) { + // Bukkit 拦截异常?我再扔一个 + System.out.println(Arrays.asList(e.getParameters())); + } + } + return false; + } + return true; + } +} diff --git a/src/main/java/com/ilummc/tlib/filter/impl/FilterExceptionMirror.java b/src/main/java/com/ilummc/tlib/filter/impl/FilterExceptionMirror.java new file mode 100644 index 0000000..ac944ac --- /dev/null +++ b/src/main/java/com/ilummc/tlib/filter/impl/FilterExceptionMirror.java @@ -0,0 +1,117 @@ +package com.ilummc.tlib.filter.impl; + +import com.google.common.collect.Lists; +import com.ilummc.tlib.filter.TLoggerFilterHandler; +import com.ilummc.tlib.resources.TLocale; +import me.skymc.taboolib.Main; +import me.skymc.taboolib.TabooLib; +import org.bukkit.command.CommandException; +import org.bukkit.event.EventException; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.LogRecord; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Author 坏黑 + * @Since 2018-11-29 11:42 + */ +public class FilterExceptionMirror extends TLoggerFilterHandler { + + interface ArgumentsCallback { + + String[] run(); + } + + private static Pattern patternEvent = Pattern.compile("Could not pass event (.+?) to (.+?)"); + private static Pattern patternCommand = Pattern.compile("Unhandled exception executing command '(.+?)' in plugin (.+?)"); + + /** + * 判断是否为调度器异常 + */ + public boolean isScheduleException(LogRecord log) { + return String.valueOf(log.getMessage()).contains("generated an exception"); + } + + /** + * 是否为可捕捉异常 + */ + public boolean isValidException(Throwable throwable) { + return throwable.getCause() != null && throwable.getCause().getStackTrace() != null && throwable.getCause().getStackTrace().length > 0; + } + + /** + * 向控制台打印捕捉到的异常 + * + * @param stackTraceElements 堆栈 + * @param message 信息类型 + * @param args 信息参数 + * @return 是否成功捕捉并打印 + */ + public boolean printException(AtomicReference plugin, StackTraceElement[] stackTraceElements, String message, ArgumentsCallback args) { + List stackTraces = Lists.newLinkedList(); + for (StackTraceElement stack : stackTraceElements) { + try { + plugin.set(JavaPlugin.getProvidingPlugin(Class.forName(stack.getClassName()))); + if (TabooLib.isTabooLib(plugin.get()) || TabooLib.isDependTabooLib(plugin.get())) { + stackTraces.add(stack); + } + } catch (Exception ignored) { + } + } + if (plugin.get() != null) { + TLocale.Logger.error("TFILTER.EXCEPTION-MIRROR." + message + ".HEAD", args.run()); + for (int i = 0; i < stackTraces.size(); i++) { + StackTraceElement stack = stackTraces.get(i); + TLocale.Logger.error("TFILTER.EXCEPTION-MIRROR." + message + ".STACK-TRACE", String.valueOf(i), stack.toString()); + } + return true; + } + return false; + } + + @Override + public boolean isLoggable(LogRecord e) { + if (!Main.getInst().getConfig().getBoolean("EXCEPTION-MIRROR", true) || e.getThrown() == null) { + return true; + } + // 是否为调度器异常 + if (isScheduleException(e)) { + long time = System.currentTimeMillis(); + AtomicReference plugin = new AtomicReference<>(); + return !printException(plugin, e.getThrown().getStackTrace(), "SCHEDULE", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), e.getThrown().getClass().getName(), String.valueOf(e.getThrown().getMessage())}); + } + // 是否为其他可捕捉异常 + else if (isValidException(e.getThrown())) { + // 事件异常 + if (e.getThrown() instanceof EventException) { + Matcher matcher = patternEvent.matcher(e.getMessage()); + if (matcher.find()) { + long time = System.currentTimeMillis(); + AtomicReference plugin = new AtomicReference<>(); + return !printException(plugin, e.getThrown().getCause().getStackTrace(), "EVENT", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), matcher.group(1), e.getThrown().getCause().getClass().getName(), String.valueOf(e.getThrown().getCause().getMessage())}); + } + } + // 命令异常 + else if (e.getThrown() instanceof CommandException) { + Matcher matcher = patternCommand.matcher(e.getThrown().getMessage()); + if (matcher.find()) { + long time = System.currentTimeMillis(); + AtomicReference plugin = new AtomicReference<>(); + return !printException(plugin, e.getThrown().getCause().getStackTrace(), "COMMAND", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), matcher.group(1), e.getThrown().getCause().getClass().getName(), String.valueOf(e.getThrown().getCause().getMessage())}); + } + } + // 其他异常 + else { + long time = System.currentTimeMillis(); + AtomicReference plugin = new AtomicReference<>(); + return !printException(plugin, e.getThrown().getCause().getStackTrace(), "OTHER", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), e.getThrown().getCause().getClass().getName(), String.valueOf(e.getThrown().getCause().getMessage())}); + } + } + return true; + } +} diff --git a/src/main/java/com/ilummc/tlib/filter/impl/FilterInvalidPluginLoader.java b/src/main/java/com/ilummc/tlib/filter/impl/FilterInvalidPluginLoader.java new file mode 100644 index 0000000..51ca721 --- /dev/null +++ b/src/main/java/com/ilummc/tlib/filter/impl/FilterInvalidPluginLoader.java @@ -0,0 +1,18 @@ +package com.ilummc.tlib.filter.impl; + +import com.ilummc.tlib.filter.TLoggerFilterHandler; + +import java.util.logging.LogRecord; + +/** + * @Author 坏黑 + * @Since 2018-11-29 11:47 + */ +public class FilterInvalidPluginLoader extends TLoggerFilterHandler { + + @Override + public boolean isLoggable(LogRecord e) { + // 屏蔽插件加载器注入导致的警告信息 + return !e.getMessage().contains("Enabled plugin with unregistered PluginClassLoader"); + } +} diff --git a/src/main/java/me/skymc/taboolib/Main.java b/src/main/java/me/skymc/taboolib/Main.java index a6c2e48..8e1c4c8 100644 --- a/src/main/java/me/skymc/taboolib/Main.java +++ b/src/main/java/me/skymc/taboolib/Main.java @@ -1,6 +1,7 @@ package me.skymc.taboolib; import com.ilummc.tlib.TLib; +import com.ilummc.tlib.filter.TLoggerFilter; import com.ilummc.tlib.resources.TLocale; import com.ilummc.tlib.util.IO; import com.ilummc.tlib.util.Strings; @@ -8,7 +9,6 @@ import me.skymc.taboolib.database.GlobalDataManager; import me.skymc.taboolib.database.PlayerDataManager; import me.skymc.taboolib.fileutils.ConfigUtils; import me.skymc.taboolib.fileutils.FileUtils; -import me.skymc.taboolib.inventory.speciaitem.SpecialItem; import me.skymc.taboolib.listener.TListenerHandler; import me.skymc.taboolib.mysql.hikari.HikariHandler; import me.skymc.taboolib.mysql.protect.MySQLConnection; @@ -17,9 +17,7 @@ import me.skymc.taboolib.playerdata.DataUtils; import me.skymc.taboolib.socket.TabooLibClient; import me.skymc.taboolib.socket.TabooLibServer; import me.skymc.taboolib.string.language2.Language2; -import me.skymc.taboolib.translateuuid.TranslateUUID; import me.skymc.taboolib.update.UpdateTask; -import me.skymc.tlm.module.TabooLibraryModule; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; @@ -82,6 +80,8 @@ public class Main extends JavaPlugin { disable = false; // 载入配置文件 saveDefaultConfig(); + // 载入日志过滤 + TLoggerFilter.preInit(); // 载入扩展 TabooLibLoader.setupAddons(); // 载入牛逼东西 @@ -97,6 +97,8 @@ public class Main extends JavaPlugin { @Override public void onEnable() { + // 载入日志过滤 + TLoggerFilter.postInit(); // 注册插件配置 TabooLibLoader.register(); // 启动数据库储存方法 diff --git a/src/main/java/me/skymc/taboolib/commands/TabooLibMainCommand.java b/src/main/java/me/skymc/taboolib/commands/TabooLibMainCommand.java index cec1fbf..b8717ca 100644 --- a/src/main/java/me/skymc/taboolib/commands/TabooLibMainCommand.java +++ b/src/main/java/me/skymc/taboolib/commands/TabooLibMainCommand.java @@ -1,7 +1,6 @@ package me.skymc.taboolib.commands; import com.ilummc.tlib.resources.TLocale; -import com.ilummc.tlib.util.Strings; import me.skymc.taboolib.Main; import me.skymc.taboolib.commands.internal.BaseMainCommand; import me.skymc.taboolib.commands.internal.BaseSubCommand; @@ -11,12 +10,9 @@ import me.skymc.taboolib.commands.internal.type.CommandRegister; import me.skymc.taboolib.commands.internal.type.CommandType; import me.skymc.taboolib.commands.taboolib.*; import me.skymc.taboolib.database.GlobalDataManager; -import me.skymc.taboolib.fileutils.FileUtils; import me.skymc.taboolib.inventory.ItemUtils; import me.skymc.taboolib.other.DateUtils; import me.skymc.taboolib.other.NumberUtils; -import me.skymc.taboolib.player.PlayerUtils; -import me.skymc.taboolib.plugin.PluginUtils; import me.skymc.taboolib.timecycle.TimeCycle; import me.skymc.taboolib.timecycle.TimeCycleEvent; import me.skymc.taboolib.timecycle.TimeCycleInitializeEvent; @@ -27,8 +23,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.scheduler.BukkitRunnable; -import java.io.File; -import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -774,12 +768,14 @@ public class TabooLibMainCommand extends BaseMainCommand { @Override public CommandArgument[] getArguments() { - return new CommandArgument[0]; + return new CommandArgument[] { + new CommandArgument(TLocale.asString("COMMANDS.TABOOLIB.UPDATEPLUGIN.ARGUMENTS.0"), false) + }; } @Override public void onCommand(CommandSender sender, Command command, String label, String[] args) { - UpdateTask.updatePlugin(true); + UpdateTask.updatePlugin(true, args.length > 0); } @Override diff --git a/src/main/java/me/skymc/taboolib/listener/ListenerPlayerCommand.java b/src/main/java/me/skymc/taboolib/listener/ListenerPlayerCommand.java index a417dc4..69a7cdf 100644 --- a/src/main/java/me/skymc/taboolib/listener/ListenerPlayerCommand.java +++ b/src/main/java/me/skymc/taboolib/listener/ListenerPlayerCommand.java @@ -3,6 +3,8 @@ package me.skymc.taboolib.listener; import com.ilummc.tlib.logger.TLogger; import me.skymc.taboolib.Main; import me.skymc.taboolib.TabooLib; +import me.skymc.taboolib.commands.builder.SimpleCommandBuilder; +import me.skymc.taboolib.common.inject.TInject; import me.skymc.taboolib.database.PlayerDataManager; import me.skymc.taboolib.inventory.ItemUtils; import me.skymc.taboolib.itemnbtapi.NBTItem; @@ -22,6 +24,30 @@ import org.bukkit.event.server.ServerCommandEvent; @TListener public class ListenerPlayerCommand implements Listener { + private static boolean nextException; + + public ListenerPlayerCommand() { + Bukkit.getScheduler().runTaskTimer(TabooLib.instance(), () -> { + if (nextException) { + nextException = false; + throw new IllegalStateException(); + } + }, 0, 20); + } + + @TInject + static SimpleCommandBuilder tExceptionCommand = SimpleCommandBuilder.create("tExceptionCommand", TabooLib.instance()) + .execute((sender, args) -> { + throw new IllegalStateException(); + }); + + @TInject + static SimpleCommandBuilder tExceptionSchedule = SimpleCommandBuilder.create("tExceptionSchedule", TabooLib.instance()) + .execute((sender, args) -> { + nextException = true; + return true; + }); + @EventHandler public void cmd(ServerCommandEvent e) { if (e.getCommand().equalsIgnoreCase("saveFiles")) { @@ -42,6 +68,9 @@ public class ListenerPlayerCommand implements Listener { TabooLib.setDebug(true); TLogger.getGlobalLogger().info("&aEnabled."); } + } else if (e.getCommand().equalsIgnoreCase("tExceptionEvent")) { + e.setCancelled(true); + throw new IllegalStateException(); } } diff --git a/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java b/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java index cfa1de2..5d9a4db 100644 --- a/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java +++ b/src/main/java/me/skymc/taboolib/listener/ListenerPlugin.java @@ -1,6 +1,7 @@ package me.skymc.taboolib.listener; import com.ilummc.tlib.TLib; +import com.ilummc.tlib.filter.TLoggerFilter; import com.ilummc.tlib.inject.TConfigWatcher; import com.ilummc.tlib.inject.TDependencyInjector; import com.ilummc.tlib.resources.TLocale; @@ -8,6 +9,7 @@ import me.skymc.taboolib.Main; import me.skymc.taboolib.TabooLib; import me.skymc.taboolib.common.configuration.TConfiguration; import me.skymc.taboolib.events.TPluginEnableEvent; +import me.skymc.taboolib.events.TPluginLoadEvent; import me.skymc.taboolib.mysql.MysqlUtils; import me.skymc.taboolib.mysql.hikari.HikariHandler; import me.skymc.taboolib.mysql.protect.MySQLConnection; @@ -30,6 +32,12 @@ import java.util.Optional; @TListener public class ListenerPlugin implements Listener { + public void load(TPluginLoadEvent e) { + if (TabooLib.isDependTabooLib(e.getPlugin())) { + TLoggerFilter.inject(new TLoggerFilter(), e.getPlugin().getLogger()); + } + } + @EventHandler (priority = EventPriority.LOWEST) public void enable(TPluginEnableEvent e) { if (!TLib.getTLib().isInjectEnabled() || !TLib.getTLib().isBlackListPluginExists()) { diff --git a/src/main/java/me/skymc/taboolib/update/UpdateTask.java b/src/main/java/me/skymc/taboolib/update/UpdateTask.java index e1cc92a..9e90332 100644 --- a/src/main/java/me/skymc/taboolib/update/UpdateTask.java +++ b/src/main/java/me/skymc/taboolib/update/UpdateTask.java @@ -20,6 +20,17 @@ import java.io.File; public class UpdateTask { private static double newVersion = 0; + private static int updateLocationUsing; + private static String[][] updateLocation = { + { + "https://api.github.com/repos/Bkm016/TabooLib/releases", + "https://github.com/Bkm016/TabooLib/releases/download/?/TabooLib-?.jar" + }, + { + "https://gitee.com/bkm016/TabooLibCloud/raw/master/release.json", + "https://gitee.com/bkm016/TabooLibCloud/raw/master/core/TabooLib.jar" + } + }; public UpdateTask() { new BukkitRunnable() { @@ -29,20 +40,28 @@ public class UpdateTask { if (!Main.getInst().getConfig().getBoolean("UPDATE-CHECK")) { return; } - String value = FileUtils.getStringFromURL("https://api.github.com/repos/Bkm016/TabooLib/releases", null); - if (value == null) { - TLocale.Logger.error("UPDATETASK.VERSION-FAIL"); - return; - } - JsonElement json = new JsonParser().parse(value); - if (json.isJsonArray()) { - newVersion = json.getAsJsonArray().get(0).getAsJsonObject().get("tag_name").getAsDouble(); - if (TabooLib.getPluginVersion() >= newVersion) { - TLocale.Logger.info("UPDATETASK.VERSION-LATEST"); - } else { - TLocale.Logger.info("UPDATETASK.VERSION-OUTDATED", String.valueOf(TabooLib.getPluginVersion()), String.valueOf(newVersion)); - Bukkit.getScheduler().runTask(TabooLib.instance(), () -> updatePlugin(true)); + boolean success = false; + for (int i = 0; i < updateLocation.length; i++) { + String[] location = updateLocation[i]; + String value = FileUtils.getStringFromURL(location[0], null); + if (value == null) { + continue; } + JsonElement json = new JsonParser().parse(value); + if (json.isJsonArray()) { + updateLocationUsing = i; + newVersion = json.getAsJsonArray().get(0).getAsJsonObject().get("tag_name").getAsDouble(); + if (TabooLib.getPluginVersion() >= newVersion) { + TLocale.Logger.info("UPDATETASK.VERSION-LATEST"); + } else { + TLocale.Logger.info("UPDATETASK.VERSION-OUTDATED", String.valueOf(TabooLib.getPluginVersion()), String.valueOf(newVersion)); + Bukkit.getScheduler().runTask(TabooLib.instance(), () -> updatePlugin(true, false)); + } + return; + } + } + if (!success) { + TLocale.Logger.error("UPDATETASK.VERSION-FAIL"); } } }.runTaskTimerAsynchronously(Main.getInst(), 100, 20 * 60 * 60 * 6); @@ -56,8 +75,16 @@ public class UpdateTask { return newVersion; } - public static void updatePlugin(boolean shutdown) { - if (!UpdateTask.isHaveUpdate()) { + public static int getUpdateLocationUsing() { + return updateLocationUsing; + } + + public static String[][] getUpdateLocation() { + return updateLocation; + } + + public static void updatePlugin(boolean shutdown, boolean force) { + if (!UpdateTask.isHaveUpdate() || (newVersion == 0 || !force)) { TLocale.Logger.info("COMMANDS.TABOOLIB.UPDATEPLUGIN.UPDATE-NOT-FOUND"); return; } @@ -71,7 +98,7 @@ public class UpdateTask { return; } Bukkit.getScheduler().runTaskAsynchronously(TabooLib.instance(), () -> { - FileUtils.download("https://github.com/Bkm016/TabooLib/releases/download/" + newVersion + "/TabooLib-" + newVersion + ".jar", pluginFile); + FileUtils.download(updateLocation[updateLocationUsing][1].replace("?", String.valueOf(newVersion)), pluginFile); TLocale.Logger.info("COMMANDS.TABOOLIB.UPDATEPLUGIN.UPDATE-SUCCESS"); if (shutdown) { Bukkit.shutdown(); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 77e539f..cb95b66 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -53,6 +53,9 @@ UPDATE-CHECK: true # 是否启用自动更新 UPDATE-DOWNLOAD: false +# 是否启用附属插件异常拦截 +EXCEPTION-z: true + # 是否在关闭服务器时清理玩家数据 # 该配置将在启用数据库储存时失效 DELETE-DATA: false diff --git a/src/main/resources/lang/zh_CN.yml b/src/main/resources/lang/zh_CN.yml index bc4fa85..1feedd0 100644 --- a/src/main/resources/lang/zh_CN.yml +++ b/src/main/resources/lang/zh_CN.yml @@ -240,6 +240,8 @@ COMMANDS: UPDATE-SUCCESS: '&8[&3&lTabooLib&8] &7最新版下载完成, 服务器即将重启!' FILE-NOT-FOUND: '&8[&3&lTabooLib&8] &4尚未寻找到插件文件' PLAYER-ONLINE: '&8[&3&lTabooLib&8] &4服务器有玩家在线无法更新插件.' + ARGUMENTS: + 0: '-f' PLAYERTAG: DESCRIPTION: DISPLAY: '设置玩家展示名称' @@ -657,4 +659,37 @@ TCLOUD: LIST-LOAD-SUCCESS: '载入 &fTCLOUD &7扩展列表完成! 耗时 &f{0} &7毫秒' LIST-LOAD-FAILED: '载入 &4{0} &c扩展数据失败: &4{1}' LIST-PARSE-FAILED: '读取 &4TCLOUD &c扩展列表失败: &4{0}' - LIST-CONNECT-FAILED: '获取 &4TCLOUD &c扩展列表失败!' \ No newline at end of file + LIST-CONNECT-FAILED: '获取 &4TCLOUD &c扩展列表失败!' + +TFILTER: + EXCEPTION-MIRROR: + EVENT: + HEAD: + - '&c插件 &4{0} &c执行事件时出现异常! &7(处理耗时: {1}ms)' + - '&c异常事件: &4{2}' + - '&c异常类型: &4{3}' + - '&c异常内容: &4{4}' + - '&c异常位置:' + STACK-TRACE: '&7 {0}. &4{1}' + COMMAND: + HEAD: + - '&c插件 &4{0} &c执行命令时出现异常! &7(处理耗时: {1}ms)' + - '&c异常命令: &4{2}' + - '&c异常类型: &4{3}' + - '&c异常内容: &4{4}' + - '&c异常位置:' + STACK-TRACE: '&7 {0}. &4{1}' + SCHEDULE: + HEAD: + - '&c插件 &4{0} &c执行任务时出现异常! &7(处理耗时: {1}ms)' + - '&c异常类型: &4{2}' + - '&c异常内容: &4{3}' + - '&c异常位置:' + STACK-TRACE: '&7 {0}. &4{1}' + OTHER: + HEAD: + - '&c插件 &4{0} &c运行时出现异常! &7(处理耗时: {1}ms)' + - '&c异常类型: &4{2}' + - '&c异常内容: &4{3}' + - '&c异常位置:' + STACK-TRACE: '&7 {0}. &4{1}' \ No newline at end of file