From cb78112cb330feb42c67181154ef03a5b80595f9 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Sun, 25 Jul 2021 00:08:56 +0200 Subject: [PATCH] Add Velocity Updater support --- .../bukkit/entities/BukkitPlugin.java | 5 ++ .../listeners/BukkitPlayerListener.java | 5 +- .../bukkit/managers/BukkitPluginManager.java | 5 ++ .../bungee/entities/BungeePlugin.java | 5 ++ .../listeners/BungeePlayerListener.java | 5 +- .../bungee/managers/BungeePluginManager.java | 5 ++ .../serverutils/common/ServerUtilsApp.java | 71 +++++++++++++++---- .../common/entities/ServerUtilsPlugin.java | 3 + .../common/listeners/PlayerListener.java | 4 +- .../common/providers/PluginProvider.java | 2 + .../common/tasks/UpdateCheckerTask.java | 40 +++++++---- .../velocity/entities/VelocityPlugin.java | 11 ++- .../listeners/VelocityPlayerListener.java | 4 +- .../managers/VelocityPluginManager.java | 27 ++++--- 14 files changed, 151 insertions(+), 41 deletions(-) diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java index e0a91cd..dc29703 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitPlugin.java @@ -62,6 +62,11 @@ public class BukkitPlugin extends ServerUtilsPlugin< return Platform.BUKKIT; } + @Override + public Plugin getPlugin() { + return plugin; + } + @Override public BukkitPluginManager getPluginManager() { return pluginManager; diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/listeners/BukkitPlayerListener.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/listeners/BukkitPlayerListener.java index d941a85..cecbafa 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/listeners/BukkitPlayerListener.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/listeners/BukkitPlayerListener.java @@ -7,8 +7,11 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.Plugin; -public class BukkitPlayerListener extends PlayerListener implements Listener { +public class BukkitPlayerListener + extends PlayerListener + implements Listener { public BukkitPlayerListener(BukkitPlugin plugin) { super(plugin); diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java index 8d81161..f9f2cf9 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java @@ -437,6 +437,11 @@ public class BukkitPluginManager implements AbstractPluginManager { return Bukkit.getPluginManager().getPlugin(pluginName); } + @Override + public Plugin getInstance(Plugin plugin) { + return plugin; + } + @Override public Set getCommands() { Map knownCommands = getKnownCommands(); diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java index 3ef7f72..1ca0487 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeePlugin.java @@ -55,6 +55,11 @@ public class BungeePlugin extends ServerUtilsPlugin< return Platform.BUNGEE; } + @Override + public Plugin getPlugin() { + return plugin; + } + @Override public BungeePluginManager getPluginManager() { return pluginManager; diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/listeners/BungeePlayerListener.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/listeners/BungeePlayerListener.java index 1e8e0a2..f280314 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/listeners/BungeePlayerListener.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/listeners/BungeePlayerListener.java @@ -5,9 +5,12 @@ import net.frankheijden.serverutils.bungee.entities.BungeePlugin; import net.frankheijden.serverutils.common.listeners.PlayerListener; import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; -public class BungeePlayerListener extends PlayerListener implements Listener { +public class BungeePlayerListener + extends PlayerListener + implements Listener { public BungeePlayerListener(BungeePlugin plugin) { super(plugin); diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java index ba1d0ee..3c4ae52 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java @@ -229,6 +229,11 @@ public class BungeePluginManager implements AbstractPluginManager { return proxy.getPluginManager().getPlugin(pluginName); } + @Override + public Plugin getInstance(Plugin plugin) { + return plugin; + } + @Override public Set getCommands() { return proxy.getPluginManager().getCommands().stream() diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/ServerUtilsApp.java b/Common/src/main/java/net/frankheijden/serverutils/common/ServerUtilsApp.java index 517dd19..745d977 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/ServerUtilsApp.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/ServerUtilsApp.java @@ -1,42 +1,89 @@ package net.frankheijden.serverutils.common; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import net.frankheijden.serverutils.common.entities.CloseableResult; +import net.frankheijden.serverutils.common.entities.Result; +import net.frankheijden.serverutils.common.entities.ServerCommandSender; import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin; import net.frankheijden.serverutils.common.tasks.UpdateCheckerTask; -public class ServerUtilsApp { +public class ServerUtilsApp, P, T, C extends ServerCommandSender, S> { public static final int BSTATS_METRICS_ID = 7790; public static final String VERSION = "{version}"; - private final T platformPlugin; - private final ServerUtilsPlugin plugin; + private final Object platformPlugin; + private final U plugin; @SuppressWarnings("rawtypes") private static ServerUtilsApp instance; - private ServerUtilsApp(T platformPlugin, ServerUtilsPlugin plugin) { + private ServerUtilsApp(Object platformPlugin, U plugin) { this.platformPlugin = platformPlugin; this.plugin = plugin; - instance = this; } - public static void init(T obj, ServerUtilsPlugin plugin) { - new ServerUtilsApp<>(obj, plugin); + public static , P, T, C extends ServerCommandSender, S> void init( + Object platformPlugin, + U plugin + ) { + instance = new ServerUtilsApp<>(platformPlugin, plugin); } /** * Tries checking for updates if enabled by the config. */ public static void tryCheckForUpdates() { - UpdateCheckerTask.tryStart(getPlugin().getChatProvider().getConsoleSender(), "boot"); + UpdateCheckerTask.tryStart(getPlugin(), getPlugin().getChatProvider().getConsoleSender(), "boot"); } - public static ServerUtilsPlugin getPlugin() { - return instance.plugin; + /** + * Unloads the ServerUtilsUpdater and deletes the file. + */ + public static , P, T, C extends ServerCommandSender, S> + void unloadServerUtilsUpdater() { + U plugin = getPlugin(); + plugin.getTaskManager().runTaskLater(() -> { + String updaterName = plugin.getPlatform() == ServerUtilsPlugin.Platform.VELOCITY + ? "serverutilsupdater" + : "ServerUtilsUpdater"; + P updaterPlugin = plugin.getPluginManager().getPlugin(updaterName); + if (updaterPlugin == null) return; + + @SuppressWarnings("VariableDeclarationUsageDistance") + File file = plugin.getPluginManager().getPluginFile(updaterPlugin); + Result result = plugin.getPluginManager().disablePlugin(updaterPlugin); + if (result != Result.SUCCESS) { + result.sendTo(plugin.getChatProvider().getConsoleSender(), "disabl", updaterName); + return; + } + + CloseableResult closeableResult = plugin.getPluginManager().unloadPlugin(updaterName); + if (closeableResult.getResult() != Result.SUCCESS) { + closeableResult.getResult().sendTo(plugin.getChatProvider().getConsoleSender(), "unload", updaterName); + } + + closeableResult.tryClose(); + + if (Files.exists(file.toPath())) { + try { + Files.delete(file.toPath()); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + }, 10); + } + + public static Object getPlatformPlugin() { + return instance.platformPlugin; } @SuppressWarnings("unchecked") - public static T getPlatformPlugin() { - return (T) instance.platformPlugin; + public static , P, T, C extends ServerCommandSender, S> + U getPlugin() { + return (U) instance.plugin; } } diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java b/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java index 4f47f3f..9c9c186 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/entities/ServerUtilsPlugin.java @@ -27,6 +27,8 @@ public abstract class ServerUtilsPlugin, public abstract Platform getPlatform(); + public abstract P getPlugin(); + public CommandsResource getCommandsResource() { return commandsResource; } @@ -94,6 +96,7 @@ public abstract class ServerUtilsPlugin, reload(); enablePlugin(); ServerUtilsApp.tryCheckForUpdates(); + ServerUtilsApp.unloadServerUtilsUpdater(); } protected void enablePlugin() { diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/listeners/PlayerListener.java b/Common/src/main/java/net/frankheijden/serverutils/common/listeners/PlayerListener.java index cbdfeb6..8d28334 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/listeners/PlayerListener.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/listeners/PlayerListener.java @@ -4,7 +4,7 @@ import net.frankheijden.serverutils.common.entities.ServerCommandSender; import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin; import net.frankheijden.serverutils.common.tasks.UpdateCheckerTask; -public abstract class PlayerListener, C extends ServerCommandSender> +public abstract class PlayerListener, P, C extends ServerCommandSender> extends ServerUtilsListener { protected PlayerListener(U plugin) { @@ -17,7 +17,7 @@ public abstract class PlayerListener, C */ protected void handleUpdate(C sender) { if (sender.hasPermission("serverutils.notification.update")) { - UpdateCheckerTask.tryStart(sender, "login"); + UpdateCheckerTask.tryStart(plugin, sender, "login"); } } } diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/providers/PluginProvider.java b/Common/src/main/java/net/frankheijden/serverutils/common/providers/PluginProvider.java index 216a9b6..a961e7b 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/providers/PluginProvider.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/providers/PluginProvider.java @@ -24,6 +24,8 @@ public interface PluginProvider

{ P getPlugin(String pluginName); + Object getInstance(P plugin); + Set getCommands(); /** diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java b/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java index d0aaf2d..541dd62 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/tasks/UpdateCheckerTask.java @@ -22,12 +22,9 @@ import net.frankheijden.serverutils.common.utils.GitHubUtils; import net.frankheijden.serverutils.common.utils.VersionUtils; import net.frankheijden.serverutilsupdater.common.Updater; -public class UpdateCheckerTask implements Runnable { - - @SuppressWarnings("unchecked") - private static final ServerUtilsPlugin plugin = ServerUtilsApp.getPlugin(); - private static final ServerUtilsConfig config = plugin.getConfigResource().getConfig(); +public class UpdateCheckerTask, P> implements Runnable { + private final U plugin; private final ServerCommandSender sender; private final boolean download; private final boolean install; @@ -52,7 +49,8 @@ public class UpdateCheckerTask implements Runnable { private static final String UPDATER_ENABLE_ERROR = "Failed to enable ServerUtilsUpdater: {0}"; private static final String UP_TO_DATE = "We are up-to-date!"; - private UpdateCheckerTask(ServerCommandSender sender, boolean download, boolean install) { + private UpdateCheckerTask(U plugin, ServerCommandSender sender, boolean download, boolean install) { + this.plugin = plugin; this.sender = sender; this.download = download; this.install = install; @@ -62,9 +60,14 @@ public class UpdateCheckerTask implements Runnable { * Checks for updates if enabled per config for the specific action. * Action must be 'login' or 'boot'. */ - public static void tryStart(ServerCommandSender sender, String action) { + public static , P> void tryStart( + U plugin, + ServerCommandSender sender, + String action + ) { + ServerUtilsConfig config = ServerUtilsApp.getPlugin().getConfigResource().getConfig(); if (config.getBoolean("settings.check-updates-" + action)) { - start(sender, action); + start(plugin, sender, action); } } @@ -72,8 +75,14 @@ public class UpdateCheckerTask implements Runnable { * Checks for updates and downloads/installs if configured. * Action must be 'login' or 'boot'. */ - public static void start(ServerCommandSender sender, String action) { - plugin.getTaskManager().runTaskAsynchronously(new UpdateCheckerTask( + public static , P> void start( + U plugin, + ServerCommandSender sender, + String action + ) { + ServerUtilsConfig config = ServerUtilsApp.getPlugin().getConfigResource().getConfig(); + ServerUtilsApp.getPlugin().getTaskManager().runTaskAsynchronously(new UpdateCheckerTask<>( + plugin, sender, config.getBoolean("settings.download-updates-" + action), config.getBoolean("settings.install-updates-" + action) @@ -227,25 +236,26 @@ public class UpdateCheckerTask implements Runnable { } private void deletePlugin() { - plugin.getPluginManager().getPluginFile(ServerUtilsApp.getPlatformPlugin()).delete(); + plugin.getPluginManager().getPluginFile(plugin.getPlugin()).delete(); } private void tryReloadPlugin(File pluginFile, File updaterFile) { plugin.getTaskManager().runTask(() -> { - LoadResult loadResult = plugin.getPluginManager().loadPlugin(updaterFile); - Updater updater = (Updater) plugin.getPluginManager().getPlugin("ServerUtilsUpdater"); - if (!loadResult.isSuccess() && updater == null) { + LoadResult

loadResult = plugin.getPluginManager().loadPlugin(updaterFile); + if (!loadResult.isSuccess()) { plugin.getLogger().log(Level.INFO, UPDATER_LOAD_ERROR, loadResult.getResult().name()); return; } - Result result = plugin.getPluginManager().enablePlugin(updater); + P updaterPlugin = loadResult.get(); + Result result = plugin.getPluginManager().enablePlugin(updaterPlugin); if (result != Result.SUCCESS && result != Result.ALREADY_ENABLED) { plugin.getLogger().log(Level.INFO, UPDATER_ENABLE_ERROR, result.name()); return; } + Updater updater = (Updater) plugin.getPluginManager().getInstance(updaterPlugin); updater.update(pluginFile); updaterFile.delete(); }); diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPlugin.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPlugin.java index cbf8730..c153748 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPlugin.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPlugin.java @@ -34,7 +34,11 @@ public class VelocityPlugin extends ServerUtilsPlugin< */ public VelocityPlugin(ServerUtils plugin) { this.plugin = plugin; - this.pluginManager = new VelocityPluginManager(); + this.pluginManager = new VelocityPluginManager( + plugin.getProxy(), + plugin.getLogger(), + plugin.getPluginCommandManager() + ); this.taskManager = new VelocityTaskManager(plugin); this.resourceProvider = new VelocityResourceProvider(plugin); this.chatProvider = new VelocityChatProvider(plugin); @@ -66,6 +70,11 @@ public class VelocityPlugin extends ServerUtilsPlugin< return Platform.VELOCITY; } + @Override + public PluginContainer getPlugin() { + return plugin.getPluginContainer(); + } + @Override public VelocityResourceProvider getResourceProvider() { return this.resourceProvider; diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/listeners/VelocityPlayerListener.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/listeners/VelocityPlayerListener.java index 784efa8..82ed268 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/listeners/VelocityPlayerListener.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/listeners/VelocityPlayerListener.java @@ -2,11 +2,13 @@ package net.frankheijden.serverutils.velocity.listeners; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; +import com.velocitypowered.api.plugin.PluginContainer; import net.frankheijden.serverutils.common.listeners.PlayerListener; import net.frankheijden.serverutils.velocity.entities.VelocityCommandSender; import net.frankheijden.serverutils.velocity.entities.VelocityPlugin; -public class VelocityPlayerListener extends PlayerListener { +public class VelocityPlayerListener + extends PlayerListener { public VelocityPlayerListener(VelocityPlugin plugin) { super(plugin); diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/managers/VelocityPluginManager.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/managers/VelocityPluginManager.java index 516dad5..250c89d 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/managers/VelocityPluginManager.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/managers/VelocityPluginManager.java @@ -30,7 +30,6 @@ import net.frankheijden.serverutils.common.entities.CloseableResult; import net.frankheijden.serverutils.common.entities.Result; import net.frankheijden.serverutils.common.events.PluginEvent; import net.frankheijden.serverutils.common.managers.AbstractPluginManager; -import net.frankheijden.serverutils.velocity.ServerUtils; import net.frankheijden.serverutils.velocity.entities.VelocityLoadResult; import net.frankheijden.serverutils.velocity.events.VelocityPluginDisableEvent; import net.frankheijden.serverutils.velocity.events.VelocityPluginEnableEvent; @@ -43,15 +42,23 @@ import net.frankheijden.serverutils.velocity.reflection.RVelocityEventManager; import net.frankheijden.serverutils.velocity.reflection.RVelocityPluginContainer; import net.frankheijden.serverutils.velocity.reflection.RVelocityPluginManager; import net.frankheijden.serverutils.velocity.reflection.RVelocityScheduler; +import org.slf4j.Logger; public class VelocityPluginManager implements AbstractPluginManager { private static VelocityPluginManager instance; private final ProxyServer proxy; + private final Logger logger; + private final VelocityPluginCommandManager pluginCommandManager; - public VelocityPluginManager() { + /** + * Constructs a new VelocityPluginManager. + */ + public VelocityPluginManager(ProxyServer proxy, Logger logger, VelocityPluginCommandManager pluginCommandManager) { instance = this; - this.proxy = ServerUtils.getInstance().getProxy(); + this.proxy = proxy; + this.logger = logger; + this.pluginCommandManager = pluginCommandManager; } public static VelocityPluginManager get() { @@ -73,7 +80,7 @@ public class VelocityPluginManager implements AbstractPluginManager"), @@ -158,7 +165,7 @@ public class VelocityPluginManager implements AbstractPluginManager getCommands() { return RVelocityCommandManager.getDispatcher(proxy.getCommandManager()).getRoot().getChildren().stream()