diff --git a/src/main/java/net/raphimc/viaproxy/plugins/PluginManager.java b/src/main/java/net/raphimc/viaproxy/plugins/PluginManager.java index 2167e4f..099df23 100644 --- a/src/main/java/net/raphimc/viaproxy/plugins/PluginManager.java +++ b/src/main/java/net/raphimc/viaproxy/plugins/PluginManager.java @@ -47,6 +47,7 @@ public class PluginManager { public PluginManager() { this.loadPlugins(); + Runtime.getRuntime().addShutdownHook(new Thread(this::unloadPlugins)); } public List getPlugins() { @@ -84,7 +85,7 @@ public class PluginManager { for (ViaProxyPlugin plugin : this.plugins) { if (!plugin.isEnabled()) { - enablePlugin(plugin); + this.enablePlugin(plugin); } } } @@ -127,13 +128,13 @@ public class PluginManager { private void enablePlugin(final ViaProxyPlugin plugin) { for (String depend : plugin.getDepends()) { - final ViaProxyPlugin dependPlugin = getPlugin(depend); + final ViaProxyPlugin dependPlugin = this.getPlugin(depend); if (dependPlugin == null) { Logger.LOGGER.error("Plugin '" + plugin.getName() + "' depends on '" + depend + "' which is not loaded"); return; } if (!dependPlugin.isEnabled()) { - enablePlugin(dependPlugin); + this.enablePlugin(dependPlugin); } RStream.of(plugin.getClassLoader()).fields().by("parent").set(dependPlugin.getClassLoader()); @@ -147,4 +148,32 @@ public class PluginManager { } } + private void unloadPlugins() { + for (ViaProxyPlugin plugin : this.plugins) { + if (plugin.isEnabled()) { + this.disablePlugin(plugin); + } + } + } + + private void disablePlugin(final ViaProxyPlugin plugin) { + for (String depend : plugin.getDepends()) { + final ViaProxyPlugin dependPlugin = this.getPlugin(depend); + if (dependPlugin == null) { + Logger.LOGGER.error("Plugin '" + plugin.getName() + "' depends on '" + depend + "' which is not loaded"); + return; + } + if (dependPlugin.isEnabled()) { + this.disablePlugin(dependPlugin); + } + } + + try { + plugin.disable(); + Logger.LOGGER.info("Disabled plugin '" + plugin.getName() + "'"); + } catch (Throwable e) { + Logger.LOGGER.error("Failed to disable plugin '" + plugin.getName() + "'", e); + } + } + } diff --git a/src/main/java/net/raphimc/viaproxy/plugins/ViaProxyPlugin.java b/src/main/java/net/raphimc/viaproxy/plugins/ViaProxyPlugin.java index c95c3b5..b2b6d58 100644 --- a/src/main/java/net/raphimc/viaproxy/plugins/ViaProxyPlugin.java +++ b/src/main/java/net/raphimc/viaproxy/plugins/ViaProxyPlugin.java @@ -41,6 +41,17 @@ public abstract class ViaProxyPlugin { public abstract void onEnable(); + final void disable() { + try { + this.onDisable(); + } finally { + this.enabled = false; + } + } + + public void onDisable() { + } + public final String getName() { return (String) this.viaProxyYaml.get("name"); }