diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 7a1acbc..e6320bf 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -25,7 +25,7 @@ jobs: - name: Upload artififacts uses: actions/upload-artifact@v2.2.1 with: - name: ServerUtils + name: Bukman path: jars/*.jar - name: Publish if: ${{ github.event_name == 'push' }} diff --git a/Bukkit/build.gradle.kts b/Bukkit/build.gradle.kts index 1a86c9e..8ea4da0 100644 --- a/Bukkit/build.gradle.kts +++ b/Bukkit/build.gradle.kts @@ -9,11 +9,11 @@ val rootDependencyDir = "${rootProject.group}.dependencies" val dependencyDir = "${group}.bukkit.dependencies" version = rootProject.version base { - archivesName.set("${rootProject.name}-Bukkit") + archivesName.set("${rootProject.name}-bukkit") } dependencies { - implementation("cloud.commandframework:cloud-paper:${VersionConstants.cloudVersion}") + implementation("org.zhdev.oblak:cloud-paper:${VersionConstants.cloudVersion}") implementation("net.kyori:adventure-api:${VersionConstants.adventureVersion}") { exclude("net.kyori", "adventure-text-minimessage") } @@ -36,11 +36,11 @@ tasks.withType { } bukkit { - name = "ServerUtils" + name = "Bukman" main = "net.frankheijden.serverutils.bukkit.ServerUtils" description = "A server utility" apiVersion = "1.13" - website = "https://github.com/FrankHeijden/ServerUtils" + website = "https://git.zhira.net/zhdev/bukman" softDepend = listOf("ServerUtilsUpdater") - authors = listOf("FrankHeijden") + authors = listOf("FrankHeijden", "ZhDev") } 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 0765066..d9e1d98 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 @@ -2,6 +2,9 @@ package net.frankheijden.serverutils.bukkit.managers; import java.io.Closeable; import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -12,8 +15,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.stream.Collectors; import net.frankheijden.serverutils.bukkit.entities.BukkitPluginDescription; import net.frankheijden.serverutils.bukkit.events.BukkitPluginDisableEvent; @@ -41,9 +44,11 @@ import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.plugin.InvalidDescriptionException; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginLoader; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.UnknownDependencyException; +import org.yaml.snakeyaml.error.YAMLException; public class BukkitPluginManager extends AbstractPluginManager { @@ -348,45 +353,43 @@ public class BukkitPluginManager extends AbstractPluginManager getFileAssociations() { - try { - return RSimplePluginManager.getFileAssociations(Bukkit.getPluginManager()); - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - return null; - } - } - - /** - * Retrieves the PluginLoader for the input file. - * @param file The file. - * @return The appropiate PluginLoader. - */ - public static Optional getPluginLoader(File file) { - Map fileAssociations = getFileAssociations(); - if (fileAssociations != null) { - for (Map.Entry entry : fileAssociations.entrySet()) { - Matcher match = entry.getKey().matcher(file.getName()); - if (match.find()) { - return Optional.ofNullable(entry.getValue()); - } - } - } - return Optional.empty(); - } - @Override public Optional getPluginDescription(File file) throws InvalidPluginDescriptionException { if (!file.exists()) return Optional.empty(); - Optional loader = getPluginLoader(file); - if (!loader.isPresent()) throw new InvalidPluginDescriptionException("Plugin loader is not present!"); try { - return Optional.of(new BukkitPluginDescription(loader.get().getPluginDescription(file), file)); + JarFile jar = null; + InputStream stream = null; + + try { + jar = new JarFile(file); + JarEntry entry = jar.getJarEntry("plugin.yml"); + + if (entry == null) { + throw new InvalidDescriptionException(new FileNotFoundException("Jar does not contain plugin.yml")); + } + + stream = jar.getInputStream(entry); + + return Optional.of(new BukkitPluginDescription(new PluginDescriptionFile(stream), file)); + } catch (IOException | YAMLException ex) { + throw new InvalidDescriptionException(ex); + } finally { + if (jar != null) { + try { + jar.close(); + } catch (IOException ignored) { + // we do nothing + } + } + if (stream != null) { + try { + stream.close(); + } catch (IOException ignored) { + // we do nothing + } + } + } } catch (InvalidDescriptionException ex) { throw new InvalidPluginDescriptionException(ex); } diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java index 049ee45..2d4e957 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RCraftServer.java @@ -3,6 +3,7 @@ package net.frankheijden.serverutils.bukkit.reflection; import dev.frankheijden.minecraftreflection.MinecraftReflection; import dev.frankheijden.minecraftreflection.MinecraftReflectionVersion; import java.io.File; +import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; @@ -51,7 +52,7 @@ public class RCraftServer { public static void syncCommands(Set removedCommands) { if (MinecraftReflectionVersion.MINOR < 13) return; - Collection children = RCommandDispatcher.getDispatcher().getRoot().getChildren(); + Collection children = new ArrayList<>(RCommandDispatcher.getDispatcher().getRoot().getChildren()); reflection.invoke(Bukkit.getServer(), "syncCommands"); Object root = RCommandDispatcher.getDispatcher().getRoot(); diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RSimplePluginManager.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RSimplePluginManager.java index 10c53c3..4886280 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RSimplePluginManager.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RSimplePluginManager.java @@ -4,25 +4,46 @@ import dev.frankheijden.minecraftreflection.MinecraftReflection; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.regex.Pattern; +import dev.frankheijden.minecraftreflection.exceptions.MinecraftReflectionException; +import net.frankheijden.serverutils.bukkit.ServerUtils; +import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginLoader; -import org.bukkit.plugin.SimplePluginManager; public class RSimplePluginManager { + private static final MinecraftReflection reflection = MinecraftReflection.of(Bukkit.getPluginManager().getClass()); + private static final MinecraftReflection paperPluginManagerReflection; + private static final MinecraftReflection paperInstanceManagerReflection; - private static final MinecraftReflection reflection = MinecraftReflection.of(SimplePluginManager.class); + static { + MinecraftReflection pluginManagerReflection; + MinecraftReflection instanceManagerReflection; + try { + pluginManagerReflection = + MinecraftReflection.of("io.papermc.paper.plugin.manager.PaperPluginManagerImpl"); + instanceManagerReflection = + MinecraftReflection.of("io.papermc.paper.plugin.manager.PaperPluginInstanceManager"); + } catch (MinecraftReflectionException e) { + pluginManagerReflection = null; + instanceManagerReflection = null; + } + paperPluginManagerReflection = pluginManagerReflection; + paperInstanceManagerReflection = instanceManagerReflection; + } public static MinecraftReflection getReflection() { return reflection; } - public static Map getFileAssociations(Object manager) throws IllegalAccessException { - return reflection.get(manager, "fileAssociations"); - } - + /** + * Gets a list of plugins. + * @param manager The SimplePluginManager instance to get plugins from. + * @return list of plugins. + */ public static List getPlugins(Object manager) { - return reflection.get(manager, "plugins"); + if (paperPluginManagerReflection == null) { + return reflection.get(manager, "plugins"); + } + return paperInstanceManagerReflection.get(getInstanceManager(manager), "plugins"); } /** @@ -32,9 +53,23 @@ public class RSimplePluginManager { * @param name The name of the plugin to remove. */ public static void removeLookupName(Object manager, String name) { - Map lookupNames = reflection.get(manager, "lookupNames"); - if (lookupNames == null) return; + Map lookupNames; + if (paperPluginManagerReflection == null) { + lookupNames = reflection.get(manager, "lookupNames"); + } else { + lookupNames = paperInstanceManagerReflection.get(getInstanceManager(manager), "lookupNames"); + } + if (lookupNames == null) { + ServerUtils.getInstance().getLogger() + .warning("Cannot remove lookup name '" + name + "' because lookupNames is null"); + return; + } lookupNames.remove(name.replace(' ', '_')); lookupNames.remove(name.replace(' ', '_').toLowerCase(Locale.ENGLISH)); // Paper } + + private static Object getInstanceManager(Object manager) { + Object paperPluginManager = reflection.get(manager, "paperPluginManager"); + return paperPluginManagerReflection.get(paperPluginManager, "instanceManager"); + } } diff --git a/Bungee/build.gradle.kts b/Bungee/build.gradle.kts index a49de7f..420993c 100644 --- a/Bungee/build.gradle.kts +++ b/Bungee/build.gradle.kts @@ -9,7 +9,7 @@ val rootDependencyDir = "${group}.dependencies" val dependencyDir = "${group}.bungee.dependencies" version = rootProject.version base { - archivesName.set("${rootProject.name}-Bungee") + archivesName.set("${rootProject.name}-bungee") } repositories { @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("cloud.commandframework:cloud-bungee:${VersionConstants.cloudVersion}") + implementation("org.zhdev.oblak:cloud-bungee:${VersionConstants.cloudVersion}") implementation("net.kyori:adventure-api:${VersionConstants.adventureVersion}") { exclude("net.kyori", "adventure-text-minimessage") } @@ -38,7 +38,7 @@ tasks.withType { } bungee { - name = "ServerUtils" + name = "Bukman" main = "net.frankheijden.serverutils.bungee.ServerUtils" description = "A server utility" softDepends = setOf("ServerUtilsUpdater") diff --git a/Common/build.gradle.kts b/Common/build.gradle.kts index 5290a6b..a73506d 100644 --- a/Common/build.gradle.kts +++ b/Common/build.gradle.kts @@ -7,7 +7,7 @@ plugins { group = rootProject.group version = "${rootProject.version}" base { - archivesName.set("${rootProject.name}-Common") + archivesName.set("${rootProject.name}-common") } repositories { diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java b/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java index 0af37a0..e0723bc 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.IntFunction; @@ -207,8 +208,13 @@ public abstract class CommandServerUtils dependingPlugins = getDependingPlugins(context, sender, plugins, "unloadplugin"); + if (!recursive) { + if (!dependingPlugins.isEmpty()) return; + } else { + plugins.addAll(0, dependingPlugins); } PluginResults

disableResults = plugin.getPluginManager().disablePlugins(plugins); @@ -232,7 +238,10 @@ public abstract class CommandServerUtils dependingPlugins = getDependingPlugins(context, sender, plugins, "reloadplugin"); + if (!recursive && !dependingPlugins.isEmpty()) { return; } @@ -240,50 +249,108 @@ public abstract class CommandServerUtils disableDependingResults = plugin.getPluginManager().disablePlugins(dependingPlugins); + for (PluginResult

disableResult : disableDependingResults.getResults()) { + if (!disableResult.isSuccess() && disableResult.getResult() != Result.ALREADY_DISABLED) { + disableResult.sendTo(sender, null); + return; + } + } + + CloseablePluginResults

unloadDependingResults = plugin.getPluginManager() + .unloadPlugins(dependingPlugins); + unloadDependingResults.tryClose(); + unloadDependingResults.sendTo(sender, MessageKey.UNLOADPLUGIN_RECURSIVELY); + } + PluginResults

reloadResults = plugin.getPluginManager().reloadPlugins(plugins); reloadResults.sendTo(sender, MessageKey.RELOADPLUGIN_SUCCESS); + + if (recursive && !dependingPlugins.isEmpty()) { + List pluginIds = new ArrayList<>(dependingPlugins.size()); + for (P p : dependingPlugins) { + pluginIds.add(plugin.getPluginManager().getPluginId(p)); + } + List pluginFiles = new ArrayList<>(dependingPlugins.size()); + for (String pluginId : pluginIds) { + Optional pluginFile = plugin.getPluginManager().getPluginFile(pluginId); + if (!pluginFile.isPresent()) { + new PluginResults

().addResult(pluginId, Result.FILE_DELETED).sendTo(sender, null); + continue; + } + pluginFiles.add(pluginFile.get()); + } + + PluginResults

loadDependingResults = plugin.getPluginManager().loadPlugins(pluginFiles); + if (!loadDependingResults.isSuccess()) { + PluginResult

failedResult = loadDependingResults.last(); + failedResult.sendTo(sender, null); + } + + PluginResults

enableResults = plugin.getPluginManager().enablePlugins(loadDependingResults.getPlugins()); + enableResults.sendTo(sender, MessageKey.LOADPLUGIN_RECURSIVELY); + } } protected boolean checkDependingPlugins(CommandContext context, C sender, List

plugins, String subcommand) { - if (context.flags().contains("force")) return false; + return !getDependingPlugins(context, sender, plugins, subcommand).isEmpty(); + } + + protected List

getDependingPlugins(CommandContext context, C sender, List

plugins, String subcommand) { + if (context.flags().contains("force")) return Collections.emptyList(); + + boolean recursive = context.flags().contains("recursive"); AbstractPluginManager pluginManager = plugin.getPluginManager(); MessagesResource messages = plugin.getMessagesResource(); + List

dependingPluginsAll = new ArrayList<>(); boolean hasDependingPlugins = false; for (P plugin : plugins) { String pluginId = pluginManager.getPluginId(plugin); List

dependingPlugins = pluginManager.getPluginsDependingOn(pluginId); if (!dependingPlugins.isEmpty()) { - TextComponent.Builder builder = Component.text(); - builder.append(messages.get(MessageKey.DEPENDING_PLUGINS_PREFIX).toComponent( - Template.of("plugin", pluginId) - )); - builder.append(ListComponentBuilder.create(dependingPlugins) - .format(p -> messages.get(MessageKey.DEPENDING_PLUGINS_FORMAT).toComponent( - Template.of("plugin", pluginManager.getPluginId(p)) - )) - .separator(messages.get(MessageKey.DEPENDING_PLUGINS_SEPARATOR).toComponent()) - .lastSeparator(messages.get(MessageKey.DEPENDING_PLUGINS_LAST_SEPARATOR).toComponent()) - .build()); - sender.sendMessage(builder.build()); + if (!recursive) { + TextComponent.Builder builder = Component.text(); + builder.append(messages.get(MessageKey.DEPENDING_PLUGINS_PREFIX).toComponent( + Template.of("plugin", pluginId) + )); + builder.append(ListComponentBuilder.create(dependingPlugins) + .format(p -> messages.get(MessageKey.DEPENDING_PLUGINS_FORMAT).toComponent( + Template.of("plugin", pluginManager.getPluginId(p)) + )) + .separator(messages.get(MessageKey.DEPENDING_PLUGINS_SEPARATOR).toComponent()) + .lastSeparator(messages.get(MessageKey.DEPENDING_PLUGINS_LAST_SEPARATOR).toComponent()) + .build()); + sender.sendMessage(builder.build()); + } + hasDependingPlugins = true; + dependingPluginsAll.addAll(dependingPlugins); } } - if (hasDependingPlugins) { - String flagPath = getRawPath(subcommand) + ".flags.force"; - String forceFlag = plugin.getCommandsResource().getAllFlagAliases(flagPath).stream() + if (!recursive && hasDependingPlugins) { + String forceFlagPath = getRawPath(subcommand) + ".flags.force"; + String forceFlag = plugin.getCommandsResource().getAllFlagAliases(forceFlagPath).stream() .min(Comparator.comparingInt(String::length)) .orElse("-f"); + String recursiveFlagPath = getRawPath(subcommand) + ".flags.recursive"; + String rescuriveFlag = plugin.getCommandsResource().getAllFlagAliases(recursiveFlagPath).stream() + .min(Comparator.comparingInt(String::length)) + .orElse("-r"); sender.sendMessage(messages.get(MessageKey.DEPENDING_PLUGINS_OVERRIDE).toComponent( Template.of("command", context.getRawInputJoined() + " " + forceFlag) )); + sender.sendMessage(messages.get(MessageKey.DEPENDING_PLUGINS_RECURSIVELY).toComponent( + Template.of("command", context.getRawInputJoined() + " " + rescuriveFlag) + )); } - return hasDependingPlugins; + return dependingPluginsAll; } protected boolean checkServerUtils(CommandContext context, C sender, List

plugins) { diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/commands/arguments/PluginsArgument.java b/Common/src/main/java/net/frankheijden/serverutils/common/commands/arguments/PluginsArgument.java index a47e1f2..7eabeaa 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/commands/arguments/PluginsArgument.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/commands/arguments/PluginsArgument.java @@ -7,6 +7,7 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.exceptions.parsing.NoInputProvidedException; import io.leangen.geantyref.TypeToken; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Queue; @@ -64,7 +65,9 @@ public class PluginsArgument, P> extends Comman return ArgumentParseResult.failure(new NoInputProvidedException(PluginsParser.class, context)); } - Set flags = plugin.getCommandsResource().getAllFlagAliases(commandConfigPath + ".flags.force"); + Set flags = new HashSet<>(); + flags.addAll(plugin.getCommandsResource().getAllFlagAliases(commandConfigPath + ".flags.force")); + flags.addAll(plugin.getCommandsResource().getAllFlagAliases(commandConfigPath + ".flags.recursive")); int queueSize = inputQueue.size(); List

plugins = new ArrayList<>(queueSize); diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/config/MessageKey.java b/Common/src/main/java/net/frankheijden/serverutils/common/config/MessageKey.java index c85f2df..db590c1 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/config/MessageKey.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/config/MessageKey.java @@ -6,7 +6,9 @@ public enum MessageKey implements PlaceholderConfigKey { RELOAD("reload", false), LOADPLUGIN("loadplugin"), + LOADPLUGIN_RECURSIVELY("loadplugin-recursively"), UNLOADPLUGIN("unloadplugin"), + UNLOADPLUGIN_RECURSIVELY("unloadplugin-recursively"), SERVERUTILS_UPDATER("serverutils-updater", false), RELOADPLUGIN_SUCCESS("reloadplugin.success"), RELOADPLUGIN_SERVERUTILS("reloadplugin.serverutils"), @@ -27,6 +29,7 @@ public enum MessageKey implements PlaceholderConfigKey { DEPENDING_PLUGINS_SEPARATOR("depending-plugins.separator", false), DEPENDING_PLUGINS_LAST_SEPARATOR("depending-plugins.last-separator", false), DEPENDING_PLUGINS_OVERRIDE("depending-plugins.override"), + DEPENDING_PLUGINS_RECURSIVELY("depending-plugins.recursively"), WATCHPLUGIN_START("watchplugin.start"), WATCHPLUGIN_CHANGE("watchplugin.change", false), WATCHPLUGIN_STOPPED("watchplugin.stopped"), 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 f32ef55..83735fe 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 @@ -37,6 +37,7 @@ public interface PluginProvider { try { pluginDescriptionOptional = getPluginDescription(file); } catch (InvalidPluginDescriptionException ex) { + ex.printStackTrace(); continue; } @@ -57,6 +58,7 @@ public interface PluginProvider { ServerUtilsPluginDescription description = getLoadedPluginDescription(loadedPlugin); if (description.getDependencies().contains(pluginId)) { plugins.add(loadedPlugin); + plugins.addAll(getPluginsDependingOn(description.getId())); } } 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 b69cf14..11bd745 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 @@ -34,7 +34,7 @@ public class UpdateCheckerTask, P> im private final boolean download; private final boolean install; - private static final String GITHUB_LINK = "https://api.github.com/repos/FrankHeijden/ServerUtils/releases/latest"; + private static final String GITHUB_LINK = "https://git.zhira.net/api/v1/repos/zhdev/bukman/releases/latest"; private static final String GITHUB_UPDATER_LINK = "https://api.github.com/repos/FrankHeijden/ServerUtilsUpdater" + "/releases/latest"; @@ -163,7 +163,7 @@ public class UpdateCheckerTask, P> im if (sender.isPlayer()) { broadcastDownloadStatus(githubVersion, false); } else { - plugin.getLogger().log(Level.INFO, DOWNLOADED, new Object[]{ "ServerUtils", githubVersion }); + plugin.getLogger().log(Level.INFO, DOWNLOADED, new Object[]{ "Bukman", githubVersion }); } return; } diff --git a/Common/src/main/resources/commands.json b/Common/src/main/resources/commands.json index 59f4d11..5a10e8b 100644 --- a/Common/src/main/resources/commands.json +++ b/Common/src/main/resources/commands.json @@ -73,6 +73,13 @@ "permission": "serverutils.unloadplugin", "description": "Force disable and unload the specified plugin(s).", "display-in-help": false + }, + "recursive": { + "main": "recursive", + "aliases": ["r"], + "permission": "serverutils.unloadplugin", + "description": "Recursively disable and unload the specified plugin(s).", + "display-in-help": false } } }, @@ -89,6 +96,13 @@ "permission": "serverutils.reloadplugin", "description": "Force reloads the specified plugin(s).", "display-in-help": false + }, + "recursive": { + "main": "recursive", + "aliases": ["r"], + "permission": "serverutils.reloadplugin", + "description": "Recursively reloads the specified plugin(s).", + "display-in-help": false } } }, diff --git a/Common/src/main/resources/messages.json b/Common/src/main/resources/messages.json index 7d7ad43..54736ea 100644 --- a/Common/src/main/resources/messages.json +++ b/Common/src/main/resources/messages.json @@ -18,7 +18,9 @@ "reload": "Successfully reloaded ServerUtils configurations!", "serverutils-updater": "Loaded and enabled ServerUtilsUpdater. Completion can be monitored from the console, attempting restart now...", "loadplugin": "Successfully loaded !", + "loadplugin-recursively": "Successfully recursively loaded !", "unloadplugin": "Successfully unloaded !", + "unloadplugin-recursively": "Successfully recursively unloaded !", "reloadplugin": { "success": "Successfully reloaded !", "serverutils": "Sorry, but you can't reload ServerUtils this way. Please restart using /." @@ -28,7 +30,8 @@ "format": "", "separator": ", ", "last-separator": " and ", - "override": "Use \"/\" to force command execution." + "override": "Use \"/\" to force command execution.", + "recursively": "Use \"/\" to recursively command execution." }, "watchplugin": { "start": "Started watching !", diff --git a/Velocity/build.gradle.kts b/Velocity/build.gradle.kts index c9499d6..ae56ff4 100644 --- a/Velocity/build.gradle.kts +++ b/Velocity/build.gradle.kts @@ -8,7 +8,7 @@ group = "${rootProject.group}" val dependencyDir = "${group}.velocity.dependencies" version = rootProject.version base { - archivesName.set("${rootProject.name}-Velocity") + archivesName.set("${rootProject.name}-velocity") } repositories { @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("cloud.commandframework:cloud-velocity:${VersionConstants.cloudVersion}") + implementation("org.zhdev.oblak:cloud-velocity:${VersionConstants.cloudVersion}") implementation("org.bstats:bstats-velocity:${VersionConstants.bstatsVersion}") implementation(project(":Common")) implementation("net.kyori:adventure-text-minimessage:${VersionConstants.adventureMinimessageVersion}") { diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/ServerUtils.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/ServerUtils.java index 532cdcb..11084a4 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/ServerUtils.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/ServerUtils.java @@ -19,12 +19,12 @@ import org.bstats.velocity.Metrics; import org.slf4j.Logger; @Plugin( - id = "serverutils", - name = "ServerUtils", + id = "bukman", + name = "Bukman", version = "{version}", description = "A server utility", - url = "https://github.com/FrankHeijden/ServerUtils", - authors = "FrankHeijden" + url = "https://git.zhira.net/zhdev/bukman", + authors = {"FrankHeijden", "ZhDev"} ) public class ServerUtils { @@ -47,7 +47,7 @@ public class ServerUtils { private Metrics.Factory metricsFactory; @Inject - @Named("serverutils") + @Named("bukman") private PluginContainer pluginContainer; private final VelocityPluginCommandManager pluginCommandManager; diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPluginDescription.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPluginDescription.java index 7506c50..cd5ccb2 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPluginDescription.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityPluginDescription.java @@ -24,9 +24,16 @@ public class VelocityPluginDescription implements ServerUtilsPluginDescription { this.description = description; Optional sourceOptional = description.getSource(); - if (!sourceOptional.isPresent()) throw new InvalidPluginDescriptionException("Source path is null"); + if (!sourceOptional.isPresent()) { + if (description.getId().equals("velocity")) { + this.file = null; + } else { + throw new InvalidPluginDescriptionException("Source path is null"); + } + } else { + this.file = sourceOptional.get().toFile(); + } - this.file = sourceOptional.get().toFile(); this.author = String.join(", ", description.getAuthors()); this.dependencies = description.getDependencies().stream() .map(PluginDependency::getId) diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityEventManager.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityEventManager.java index 0161b11..cfa2d24 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityEventManager.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityEventManager.java @@ -9,7 +9,6 @@ import dev.frankheijden.minecraftreflection.MinecraftReflection; import java.lang.reflect.Array; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; public class RVelocityEventManager { @@ -65,7 +64,7 @@ public class RVelocityEventManager { Object registrationsEmptyArray = Array.newInstance(RHandlerRegistration.reflection.getClazz(), 0); Class registrationsArrayClass = registrationsEmptyArray.getClass(); - ExecutorService executor = reflection.invoke(manager, "getAsyncExecutor"); + /*ExecutorService executor = reflection.invoke(manager, "getAsyncExecutor"); executor.execute(() -> reflection.invoke( manager, "fire", @@ -74,7 +73,16 @@ public class RVelocityEventManager { ClassObject.of(int.class, 0), ClassObject.of(boolean.class, true), ClassObject.of(registrationsArrayClass, registrations.toArray((Object[]) registrationsEmptyArray)) - )); + ));*/ + reflection.invoke( + manager, + "fire", + ClassObject.of(CompletableFuture.class, future), + ClassObject.of(Object.class, event), + ClassObject.of(int.class, 0), + ClassObject.of(boolean.class, true), + ClassObject.of(registrationsArrayClass, registrations.toArray((Object[]) registrationsEmptyArray)) + ); return future; } diff --git a/build.gradle.kts b/build.gradle.kts index 22f6c5c..f2be164 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { group = "net.frankheijden.serverutils" val dependencyDir = "${group}.dependencies" -version = "3.5.5-SNAPSHOT" +version = "3.5.6-SNAPSHOT" java { sourceCompatibility = JavaVersion.VERSION_1_8 @@ -27,17 +27,19 @@ subprojects { } repositories { + mavenLocal() mavenCentral() maven("https://jitpack.io") maven("https://oss.sonatype.org/content/repositories/snapshots") - maven("https://papermc.io/repo/repository/maven-public/") + maven("https://repo.papermc.io/repository/maven-public/") maven("https://libraries.minecraft.net") + maven("https://maven.zhira.net/repository/zhdev/") } dependencies { - implementation("cloud.commandframework:cloud-core:${VersionConstants.cloudVersion}") - implementation("cloud.commandframework:cloud-brigadier:${VersionConstants.cloudVersion}") - implementation("com.github.FrankHeijden:MinecraftReflection:1.0.0") + implementation("org.zhdev.oblak:cloud-core:${VersionConstants.cloudVersion}") + implementation("org.zhdev.oblak:cloud-brigadier:${VersionConstants.cloudVersion}") + implementation("org.zhdev:megareflection:1.0.2-SNAPSHOT") implementation("com.google.code.gson:gson:2.8.6") implementation("me.lucko:commodore:2.2") compileOnly("com.mojang:brigadier:1.0.18") @@ -93,6 +95,7 @@ subprojects { } relocate("net.kyori.adventure.text.minimessage", "${dependencyDir}.adventure.text.minimessage") relocate("dev.frankheijden.minecraftreflection", "${dependencyDir}.minecraftreflection") + relocate("org.zhdev", "${dependencyDir}.zhdev") } publishing { @@ -113,11 +116,11 @@ subprojects { } publications { - create("ServerUtils") { + create("bukman") { artifact(tasks["shadowJar"]) { classifier = "" } - artifactId = "ServerUtils-$artifactId" + artifactId = "bukman-$artifactId" } } } @@ -192,11 +195,11 @@ publishing { } publications { - create("ServerUtils") { + create("bukman") { artifact(tasks["shadowJar"]) { classifier = "" } - artifactId = "ServerUtils" + artifactId = "bukman" } } } diff --git a/buildSrc/src/main/kotlin/VersionConstants.kt b/buildSrc/src/main/kotlin/VersionConstants.kt index 3c4f43e..9cb5365 100644 --- a/buildSrc/src/main/kotlin/VersionConstants.kt +++ b/buildSrc/src/main/kotlin/VersionConstants.kt @@ -1,5 +1,5 @@ object VersionConstants { - const val cloudVersion = "1.8.0" + const val cloudVersion = "1.8.5-SNAPSHOT" const val adventureVersion = "4.11.0" const val adventurePlatformVersion = "4.1.2" const val adventureMinimessageVersion = "4.2.0-SNAPSHOT" diff --git a/settings.gradle.kts b/settings.gradle.kts index 8553f01..ab36bff 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "ServerUtils" +rootProject.name = "bukman" include("Common") include("Bukkit") include("Bungee")