From d4bdade00bd40ec1e10cb7aed1fb6af72b53c59b Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:37:20 +0200 Subject: [PATCH 01/26] Rework plugin config system --- .../config/CommentedConfigOption.java | 6 + .../commandapi/config/ConfigGenerator.java | 129 ++++++++++++++++ .../config/DefaultedBukkitConfig.java | 145 ++++++++++++++++++ .../dev/jorel/commandapi/CommandAPIMain.java | 39 +++++ .../src/main/resources/config.yml | 83 ---------- .../dev/jorel/commandapi/CommandAPIMain.java | 38 +++++ .../src/main/resources/config.yml | 83 ---------- 7 files changed, 357 insertions(+), 166 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/resources/config.yml delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/resources/config.yml diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java new file mode 100644 index 0000000000..9b7eae6942 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java @@ -0,0 +1,6 @@ +package dev.jorel.commandapi.config; + +import java.util.List; + +record CommentedConfigOption(List comment, String path, T option) { +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java new file mode 100644 index 0000000000..0d1854d0fe --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -0,0 +1,129 @@ +package dev.jorel.commandapi.config; + +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.ApiStatus; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +@ApiStatus.Internal +public class ConfigGenerator { + + private ConfigGenerator() {} + + public static YamlConfiguration generateDefaultConfig() throws InvalidConfigurationException { + YamlConfiguration config = new YamlConfiguration(); + Set sections = new HashSet<>(); + for (CommentedConfigOption commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS) { + String path = commentedConfigOption.path(); + + tryCreateSection(config, path, sections); + + config.set(path, commentedConfigOption.option()); + config.setComments(path, commentedConfigOption.comment()); + } + return process(config.saveToString()); + } + + public static YamlConfiguration generateWithNewValues(YamlConfiguration existingConfig) throws InvalidConfigurationException { + YamlConfiguration config = new YamlConfiguration(); + + boolean shouldRemoveValues = shouldRemoveOptions(existingConfig); + + boolean wasConfigUpdated = false; + Set sections = new HashSet<>(); + for (CommentedConfigOption commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS) { + String path = commentedConfigOption.path(); + + // Update config option + if (existingConfig.contains(path)) { + tryCreateSection(config, path, sections); + config.set(path, existingConfig.get(path)); + } else { + wasConfigUpdated = true; + tryCreateSection(config, path, sections); + config.set(path, commentedConfigOption.option()); + } + + // Update config option comments + // Comments are kinda stupid, some elements are apparently null elements + // Also, both, YamlConfiguration#getComments(String) and CommentedConfigOption#comments() return unmodifiable list + // which by itself apparently aren't able to be checked for equality by the equals() method + // As a result, we wrap them in new ArrayLists first to be able to compare them + List existingComment = new ArrayList<>(existingConfig.getComments(path)); + existingComment.removeIf(Objects::isNull); + List defaultComment = new ArrayList<>(commentedConfigOption.comment()); + + if (!existingComment.equals(defaultComment)) { + wasConfigUpdated = true; + } + config.setComments(path, commentedConfigOption.comment()); + } + if (shouldRemoveValues) { + wasConfigUpdated = true; + } + return (wasConfigUpdated) ? process(config.saveToString()) : null; + } + + private static YamlConfiguration process(String configAsString) throws InvalidConfigurationException { + String[] configStrings = configAsString.split("\n"); + StringBuilder configBuilder = new StringBuilder(); + for (String configString : configStrings) { + configBuilder.append(configString).append("\n"); + if (!configString.contains("#")) { + configBuilder.append("\n"); + } + } + YamlConfiguration config = new YamlConfiguration(); + config.loadFromString(configBuilder.toString()); + return config; + } + + private static void tryCreateSection(YamlConfiguration config, String path, Set existingSections) { + if (path.contains(".")) { + // We have to create a section, or multiple if applicable, first, if it doesn't exist already + String[] sectionNames = path.split("\\."); + // The last value is the config option + for (int i = 0; i < sectionNames.length - 1; i++) { + String sectionName = sectionNames[i]; + if (!existingSections.contains(sectionName)) { + config.createSection(sectionName); + for (CommentedConfigOption commentedSection : DefaultedBukkitConfig.ALL_SECTIONS) { + if (commentedSection.path().equals(sectionName)) { + config.setComments(sectionName, commentedSection.comment()); + } + } + } + existingSections.add(sectionName); + } + } + } + + private static boolean shouldRemoveOptions(YamlConfiguration config) { + Set configOptions = config.getKeys(true); + List sections = new ArrayList<>(); + for (String configOption : configOptions) { + ConfigurationSection section = config.getConfigurationSection(configOption); + if (section != null) { + sections.add(configOption); + } + } + for (String sectionName : sections) { + configOptions.remove(sectionName); + } + List defaultConfigOptions = DefaultedBukkitConfig.ALL_OPTIONS.stream().map(option -> option.path()).toList(); + List optionsToRemove = new ArrayList<>(); + for (String option : configOptions) { + if (!defaultConfigOptions.contains(option)) { + optionsToRemove.add(option); + } + } + return !optionsToRemove.isEmpty(); + } + +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java new file mode 100644 index 0000000000..9aa5aff75a --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java @@ -0,0 +1,145 @@ +package dev.jorel.commandapi.config; + +import java.util.ArrayList; +import java.util.List; + +/** + * Default config values for the plugin's config.yml file + */ +class DefaultedBukkitConfig { + + public static final CommentedConfigOption VERBOSE_OUTPUTS = new CommentedConfigOption<>( + List.of( + "Verbose outputs (default: false)", + "If \"true\", outputs command registration and unregistration logs in the console" + ), + "verbose-outputs", false + ); + + public static final CommentedConfigOption SILENT_LOGS = new CommentedConfigOption<>( + List.of( + "Silent logs (default: false)", + "If \"true\", turns off all logging from the CommandAPI, except for errors." + ), + "silent-logs", false + ); + + public static final CommentedConfigOption MISSING_EXECUTOR_IMPLEMENTATION = new CommentedConfigOption<>( + List.of( + "Missing executor implementation (default: \"This command has no implementations for %s\")", + "The message to display to senders when a command has no executor. Available", + "parameters are:", + " %s - the executor class (lowercase)", + " %S - the executor class (normal case)" + ), + "messages.missing-executor-implementation", "This command has no implementations for %s" + ); + + public static final CommentedConfigOption CREATE_DISPATCHER_JSON = new CommentedConfigOption<>( + List.of( + "Create dispatcher JSON (default: false)", + "If \"true\", the CommandAPI creates a command_registration.json file showing the", + "mapping of registered commands. This is designed to be used by developers -", + "setting this to \"false\" will improve command registration performance." + ), + "create-dispatcher-json", false + ); + + public static final CommentedConfigOption USE_LATEST_NMS_VERSION = new CommentedConfigOption<>( + List.of( + "Use latest version (default: false)", + "If \"true\", the CommandAPI will use the latest available NMS implementation", + "when the CommandAPI is used. This avoids all checks to see if the latest NMS", + "implementation is actually compatible with the current Minecraft version." + ), + "use-latest-nms-version", false + ); + + public static final CommentedConfigOption BE_LENIENT_FOR_MINOR_VERSIONS = new CommentedConfigOption<>( + List.of( + "Be lenient with version checks when loading for new minor Minecraft versions (default: false)", + "If \"true\", the CommandAPI loads NMS implementations for potentially unsupported Minecraft versions.", + "For example, this setting may allow updating from 1.21.1 to 1.21.2 as only the minor version is changing", + "but will not allow an update from 1.21.2 to 1.22.", + "Keep in mind that implementations may vary and actually updating the CommandAPI might be necessary." + ), + "be-lenient-for-minor-versions", false + ); + + public static final CommentedConfigOption SHOULD_HOOK_PAPER_RELOAD = new CommentedConfigOption<>( + List.of( + "Hook into Paper's ServerResourcesReloadedEvent (default: true)", + "If \"true\", and the CommandAPI detects it is running on a Paper server, it will", + "hook into Paper's ServerResourcesReloadedEvent to detect when /minecraft:reload is run.", + "This allows the CommandAPI to automatically call its custom datapack-reloading", + "function which allows CommandAPI commands to be used in datapacks.", + "If you set this to false, CommandAPI commands may not work inside datapacks after", + "reloading datapacks." + ), + "hook-paper-reload", false + ); + + public static final CommentedConfigOption SKIP_RELOAD_DATAPACKS = new CommentedConfigOption<>( + List.of( + "Skips the initial datapack reload when the server loads (default: false)", + "If \"true\", the CommandAPI will not reload datapacks when the server has finished", + "loading. Datapacks will still be reloaded if performed manually when \"hook-paper-reload\"", + "is set to \"true\" and /minecraft:reload is run." + ), + "skip-initial-datapack-reload", false + ); + + public static final CommentedConfigOption> PLUGINS_TO_CONVERT = new CommentedConfigOption<>( + List.of( + "Plugins to convert (default: [])", + "Controls the list of plugins to process for command conversion." + ), + "plugins-to-convert", new ArrayList<>() + ); + + public static final CommentedConfigOption> OTHER_COMMANDS_TO_CONVERT = new CommentedConfigOption<>( + List.of( + "Other commands to convert (default: [])", + "A list of other commands to convert. This should be used for commands which", + "are not declared in a plugin.yml file." + ), + "other-commands-to-convert", new ArrayList<>() + ); + + public static final CommentedConfigOption> SKIP_SENDER_PROXY = new CommentedConfigOption<>( + List.of( + "Skip sender proxy (default: [])", + "Determines whether the proxy sender should be skipped when converting a", + "command. If you are having issues with plugin command conversion, add the", + "plugin to this list." + ), + "skip-sender-proxy", new ArrayList<>() + ); + + public static final List> ALL_OPTIONS = List.of( + VERBOSE_OUTPUTS, + SILENT_LOGS, + MISSING_EXECUTOR_IMPLEMENTATION, + CREATE_DISPATCHER_JSON, + USE_LATEST_NMS_VERSION, + BE_LENIENT_FOR_MINOR_VERSIONS, + SHOULD_HOOK_PAPER_RELOAD, + SKIP_RELOAD_DATAPACKS, + PLUGINS_TO_CONVERT, + OTHER_COMMANDS_TO_CONVERT, + SKIP_SENDER_PROXY + ); + + public static final CommentedConfigOption SECTION_MESSAGE = new CommentedConfigOption<>( + List.of( + "Messages", + "Controls messages that the CommandAPI displays to players" + ), + "messages", null + ); + + public static final List> ALL_SECTIONS = List.of( + SECTION_MESSAGE + ); + +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index cb5a44eb15..c7eb667a9f 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -21,13 +21,16 @@ package dev.jorel.commandapi; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import dev.jorel.commandapi.config.ConfigGenerator; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -133,4 +136,40 @@ private JavaPlugin getAndValidatePlugin(String pluginName) { public void onEnable() { CommandAPI.onEnable(); } + + /** + * In contrast to the superclasses method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, + * this doesn't fail silently if the config.yml already exists but instead will update the config with + * new values if available. + *

+ * This should fail silently if all values are set already. + */ + @Override + public void saveDefaultConfig() { + File configFile = new File(getDataFolder(), "config.yml"); + if (!getDataFolder().exists()) { + getDataFolder().mkdir(); + try { + YamlConfiguration defaultConfig = ConfigGenerator.generateDefaultConfig(); + defaultConfig.save(configFile); + } catch (Exception e) { + getLogger().severe("Could not create default config file! This is (probably) a bug."); + getLogger().severe("Error message: " + e.getMessage()); + } + return; + } + // Update the config if necessary + YamlConfiguration existingConfig = YamlConfiguration.loadConfiguration(configFile); + try { + YamlConfiguration updatedConfig = ConfigGenerator.generateWithNewValues(existingConfig); + if (updatedConfig == null) { + return; + } + updatedConfig.save(configFile); + } catch (Exception e) { + getLogger().severe("Could not update config! This is (probably) a bug."); + getLogger().severe("Error message: " + e.getMessage()); + } + } + } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/resources/config.yml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/resources/config.yml deleted file mode 100644 index 324801b268..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/resources/config.yml +++ /dev/null @@ -1,83 +0,0 @@ -################################################################################ -# Logging # -################################################################################ - -# Verbose outputs (default: false) -# If "true", outputs command registration and unregistration logs in the console -verbose-outputs: false - -# Silent logs (default: false) -# If "true", turns off all logging from the CommandAPI, except for errors. -silent-logs: false - -################################################################################ -# Messages # -################################################################################ - -# Messages -# Controls messages that the CommandAPI displays to players -messages: - - # Missing executor implementation (default: "This command has no implementations for %s") - # The message to display to senders when a command has no executor. Available - # parameters are: - # %s - the executor class (lowercase) - # %S - the executor class (normal case) - missing-executor-implementation: "This command has no implementations for %s" - -################################################################################ -# Debugging # -################################################################################ - -# Create dispatcher JSON (default: false) -# If "true", the CommandAPI creates a command_registration.json file showing the -# mapping of registered commands. This is designed to be used by developers - -# setting this to "false" will improve command registration performance. -create-dispatcher-json: false - -# Use latest version (default: false) -# If "true", the CommandAPI will use the latest available NMS implementation -# when the CommandAPI is used. This avoids all checks to see if the latest NMS -# implementation is actually compatible with the current Minecraft version. -use-latest-nms-version: false - -# Be lenient with version checks when loading for new minor Minecraft versions (default: false) -# If "true", the CommandAPI loads NMS implementations for (potentially unsupported) Minecraft versions. -# For example, this setting may allow updating from 1.21.1 to 1.21.2 as only the minor version is changing -# but will not allow an update from 1.21.2 to 1.22. -# Keep in mind that implementations may vary and actually updating the CommandAPI might be necessary. -be-lenient-for-minor-versions: false - -# Hook into Paper's ServerResourcesReloadedEvent (default: true) -# If "true", and the CommandAPI detects it is running on a Paper server, it will -# hook into Paper's ServerResourcesReloadedEvent to detect when /minecraft:reload is run. -# This allows the CommandAPI to automatically call its custom datapack-reloading -# function which allows CommandAPI commands to be used in datapacks. -# If you set this to false, CommandAPI commands may not work inside datapacks after -# reloading datapacks. -hook-paper-reload: true - -# Skips the initial datapack reload when the server loads (default: false) -# If "true", the CommandAPI will not reload datapacks when the server has finished -# loading. Datapacks will still be reloaded if performed manually when "hook-paper-reload" -# is set to "true" and /minecraft:reload is run. -skip-initial-datapack-reload: false - -################################################################################ -# Command conversion # -################################################################################ - -# Plugins to convert (default: []) -# Controls the list of plugins to process for command conversion. -plugins-to-convert: [] - -# Other commands to convert (default: []) -# A list of other commands to convert. This should be used for commands which -# are not declared in a plugin.yml file. -other-commands-to-convert: [] - -# Skip sender proxy (default: []) -# Determines whether the proxy sender should be skipped when converting a -# command. If you are having issues with plugin command conversion, add the -# plugin to this list. -skip-sender-proxy: [] \ No newline at end of file diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index cb5a44eb15..b096b8c548 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -21,13 +21,16 @@ package dev.jorel.commandapi; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import dev.jorel.commandapi.config.ConfigGenerator; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -133,4 +136,39 @@ private JavaPlugin getAndValidatePlugin(String pluginName) { public void onEnable() { CommandAPI.onEnable(); } + + /** + * In contrast to the superclasses method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, + * this doesn't fail silently if the config.yml already exists but instead will update the config with + * new values if available. + *

+ * This should fail silently if all values are set already. + */ + @Override + public void saveDefaultConfig() { + File configFile = new File(getDataFolder(), "config.yml"); + if (!getDataFolder().exists()) { + getDataFolder().mkdir(); + try { + YamlConfiguration defaultConfig = ConfigGenerator.generateDefaultConfig(); + defaultConfig.save(configFile); + } catch (Exception e) { + getLogger().severe("Could not create default config file! This is (probably) a bug."); + getLogger().severe("Error message: " + e.getMessage()); + } + return; + } + // Update the config if necessary + YamlConfiguration existingConfig = YamlConfiguration.loadConfiguration(configFile); + try { + YamlConfiguration updatedConfig = ConfigGenerator.generateWithNewValues(existingConfig); + if (updatedConfig == null) { + return; + } + updatedConfig.save(configFile); + } catch (Exception e) { + getLogger().severe("Could not update config! This is (probably) a bug."); + getLogger().severe("Error message: " + e.getMessage()); + } + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/resources/config.yml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/resources/config.yml deleted file mode 100644 index 324801b268..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/resources/config.yml +++ /dev/null @@ -1,83 +0,0 @@ -################################################################################ -# Logging # -################################################################################ - -# Verbose outputs (default: false) -# If "true", outputs command registration and unregistration logs in the console -verbose-outputs: false - -# Silent logs (default: false) -# If "true", turns off all logging from the CommandAPI, except for errors. -silent-logs: false - -################################################################################ -# Messages # -################################################################################ - -# Messages -# Controls messages that the CommandAPI displays to players -messages: - - # Missing executor implementation (default: "This command has no implementations for %s") - # The message to display to senders when a command has no executor. Available - # parameters are: - # %s - the executor class (lowercase) - # %S - the executor class (normal case) - missing-executor-implementation: "This command has no implementations for %s" - -################################################################################ -# Debugging # -################################################################################ - -# Create dispatcher JSON (default: false) -# If "true", the CommandAPI creates a command_registration.json file showing the -# mapping of registered commands. This is designed to be used by developers - -# setting this to "false" will improve command registration performance. -create-dispatcher-json: false - -# Use latest version (default: false) -# If "true", the CommandAPI will use the latest available NMS implementation -# when the CommandAPI is used. This avoids all checks to see if the latest NMS -# implementation is actually compatible with the current Minecraft version. -use-latest-nms-version: false - -# Be lenient with version checks when loading for new minor Minecraft versions (default: false) -# If "true", the CommandAPI loads NMS implementations for (potentially unsupported) Minecraft versions. -# For example, this setting may allow updating from 1.21.1 to 1.21.2 as only the minor version is changing -# but will not allow an update from 1.21.2 to 1.22. -# Keep in mind that implementations may vary and actually updating the CommandAPI might be necessary. -be-lenient-for-minor-versions: false - -# Hook into Paper's ServerResourcesReloadedEvent (default: true) -# If "true", and the CommandAPI detects it is running on a Paper server, it will -# hook into Paper's ServerResourcesReloadedEvent to detect when /minecraft:reload is run. -# This allows the CommandAPI to automatically call its custom datapack-reloading -# function which allows CommandAPI commands to be used in datapacks. -# If you set this to false, CommandAPI commands may not work inside datapacks after -# reloading datapacks. -hook-paper-reload: true - -# Skips the initial datapack reload when the server loads (default: false) -# If "true", the CommandAPI will not reload datapacks when the server has finished -# loading. Datapacks will still be reloaded if performed manually when "hook-paper-reload" -# is set to "true" and /minecraft:reload is run. -skip-initial-datapack-reload: false - -################################################################################ -# Command conversion # -################################################################################ - -# Plugins to convert (default: []) -# Controls the list of plugins to process for command conversion. -plugins-to-convert: [] - -# Other commands to convert (default: []) -# A list of other commands to convert. This should be used for commands which -# are not declared in a plugin.yml file. -other-commands-to-convert: [] - -# Skip sender proxy (default: []) -# Determines whether the proxy sender should be skipped when converting a -# command. If you are having issues with plugin command conversion, add the -# plugin to this list. -skip-sender-proxy: [] \ No newline at end of file From 2c698f816261f531542332af7c8ac2d83a3bd554 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Wed, 21 Aug 2024 11:14:57 +0200 Subject: [PATCH 02/26] Use a loop instead of a Stream --- .../java/dev/jorel/commandapi/config/ConfigGenerator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index 0d1854d0fe..b68b6665e3 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -116,7 +116,10 @@ private static boolean shouldRemoveOptions(YamlConfiguration config) { for (String sectionName : sections) { configOptions.remove(sectionName); } - List defaultConfigOptions = DefaultedBukkitConfig.ALL_OPTIONS.stream().map(option -> option.path()).toList(); + Set defaultConfigOptions = new HashSet<>(); + for (CommentedConfigOption defaultConfigOption : DefaultedBukkitConfig.ALL_OPTIONS) { + defaultConfigOptions.add(defaultConfigOption.path()); + } List optionsToRemove = new ArrayList<>(); for (String option : configOptions) { if (!defaultConfigOptions.contains(option)) { From 9ca2efe7b2009d191e6c9a691be7ec7d839a2687 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:48:22 +0200 Subject: [PATCH 03/26] We want stacktraces --- .../main/java/dev/jorel/commandapi/CommandAPIMain.java | 9 +++++++++ .../main/java/dev/jorel/commandapi/CommandAPIMain.java | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index c7eb667a9f..4a4869187a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -155,6 +156,10 @@ public void saveDefaultConfig() { } catch (Exception e) { getLogger().severe("Could not create default config file! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); + getLogger().severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + getLogger().severe(element.toString()); + } } return; } @@ -169,6 +174,10 @@ public void saveDefaultConfig() { } catch (Exception e) { getLogger().severe("Could not update config! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); + getLogger().severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + getLogger().severe(element.toString()); + } } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index b096b8c548..0f96af1e82 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -155,6 +155,10 @@ public void saveDefaultConfig() { } catch (Exception e) { getLogger().severe("Could not create default config file! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); + getLogger().severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + getLogger().severe(element.toString()); + } } return; } @@ -169,6 +173,10 @@ public void saveDefaultConfig() { } catch (Exception e) { getLogger().severe("Could not update config! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); + getLogger().severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + getLogger().severe(element.toString()); + } } } } From 77029d254ede1d49c9995c26fdbcf6dd3ecee125 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:20:35 +0200 Subject: [PATCH 04/26] Include generated config.yml in the documentation This doesn't happen anymore since the included config.yml files were deleted. --- docssrc/src/config.md | 68 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/docssrc/src/config.md b/docssrc/src/config.md index 2536fab9de..d759819a70 100644 --- a/docssrc/src/config.md +++ b/docssrc/src/config.md @@ -10,7 +10,73 @@ The default `config.yml` is shown below:

config.yml ```yaml -{{#include ../../commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/resources/config.yml}} +# Verbose outputs (default: false) +# If "true", outputs command registration and unregistration logs in the console +verbose-outputs: false + +# Silent logs (default: false) +# If "true", turns off all logging from the CommandAPI, except for errors. +silent-logs: false + +# Messages +# Controls messages that the CommandAPI displays to players +messages: + + # Missing executor implementation (default: "This command has no implementations for %s") + # The message to display to senders when a command has no executor. Available + # parameters are: + # %s - the executor class (lowercase) + # %S - the executor class (normal case) + missing-executor-implementation: This command has no implementations for %s + +# Create dispatcher JSON (default: false) +# If "true", the CommandAPI creates a command_registration.json file showing the +# mapping of registered commands. This is designed to be used by developers - +# setting this to "false" will improve command registration performance. +create-dispatcher-json: false + +# Use latest version (default: false) +# If "true", the CommandAPI will use the latest available NMS implementation +# when the CommandAPI is used. This avoids all checks to see if the latest NMS +# implementation is actually compatible with the current Minecraft version. +use-latest-nms-version: false + +# Be lenient with version checks when loading for new minor Minecraft versions (default: false) +# If "true", the CommandAPI loads NMS implementations for potentially unsupported Minecraft versions. +# For example, this setting may allow updating from 1.21.1 to 1.21.2 as only the minor version is changing +# but will not allow an update from 1.21.2 to 1.22. +# Keep in mind that implementations may vary and actually updating the CommandAPI might be necessary. +be-lenient-for-minor-versions: false + +# Hook into Paper's ServerResourcesReloadedEvent (default: true) +# If "true", and the CommandAPI detects it is running on a Paper server, it will +# hook into Paper's ServerResourcesReloadedEvent to detect when /minecraft:reload is run. +# This allows the CommandAPI to automatically call its custom datapack-reloading +# function which allows CommandAPI commands to be used in datapacks. +# If you set this to false, CommandAPI commands may not work inside datapacks after +# reloading datapacks. +hook-paper-reload: false + +# Skips the initial datapack reload when the server loads (default: false) +# If "true", the CommandAPI will not reload datapacks when the server has finished +# loading. Datapacks will still be reloaded if performed manually when "hook-paper-reload" +# is set to "true" and /minecraft:reload is run. +skip-initial-datapack-reload: false + +# Plugins to convert (default: []) +# Controls the list of plugins to process for command conversion. +plugins-to-convert: [] + +# Other commands to convert (default: []) +# A list of other commands to convert. This should be used for commands which +# are not declared in a plugin.yml file. +other-commands-to-convert: [] + +# Skip sender proxy (default: []) +# Determines whether the proxy sender should be skipped when converting a +# command. If you are having issues with plugin command conversion, add the +# plugin to this list. +skip-sender-proxy: [] ``` From 6bdc2fd977390cde072cc6a61b1bc930cca95872 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Thu, 5 Sep 2024 07:48:34 +0200 Subject: [PATCH 05/26] Address code review This could also help with further rewriting to aid development for multiple platforms. --- .../config/CommentedConfigOption.java | 2 +- .../commandapi/config/ConfigGenerator.java | 51 +++++-------- .../config/DefaultedBukkitConfig.java | 71 +++++++++---------- 3 files changed, 52 insertions(+), 72 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java index 9b7eae6942..7e09b311ce 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java @@ -2,5 +2,5 @@ import java.util.List; -record CommentedConfigOption(List comment, String path, T option) { +record CommentedConfigOption(List comment, T option) { } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index b68b6665e3..1843e390e6 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -1,6 +1,5 @@ package dev.jorel.commandapi.config; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.ApiStatus; @@ -8,6 +7,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; @@ -19,13 +19,13 @@ private ConfigGenerator() {} public static YamlConfiguration generateDefaultConfig() throws InvalidConfigurationException { YamlConfiguration config = new YamlConfiguration(); Set sections = new HashSet<>(); - for (CommentedConfigOption commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS) { - String path = commentedConfigOption.path(); + for (Map.Entry> commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS.entrySet()) { + String path = commentedConfigOption.getKey(); tryCreateSection(config, path, sections); - config.set(path, commentedConfigOption.option()); - config.setComments(path, commentedConfigOption.comment()); + config.set(path, commentedConfigOption.getValue().option()); + config.setComments(path, commentedConfigOption.getValue().comment()); } return process(config.saveToString()); } @@ -37,8 +37,8 @@ public static YamlConfiguration generateWithNewValues(YamlConfiguration existing boolean wasConfigUpdated = false; Set sections = new HashSet<>(); - for (CommentedConfigOption commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS) { - String path = commentedConfigOption.path(); + for (Map.Entry> commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS.entrySet()) { + String path = commentedConfigOption.getKey(); // Update config option if (existingConfig.contains(path)) { @@ -47,7 +47,7 @@ public static YamlConfiguration generateWithNewValues(YamlConfiguration existing } else { wasConfigUpdated = true; tryCreateSection(config, path, sections); - config.set(path, commentedConfigOption.option()); + config.set(path, commentedConfigOption.getValue().option()); } // Update config option comments @@ -57,12 +57,12 @@ public static YamlConfiguration generateWithNewValues(YamlConfiguration existing // As a result, we wrap them in new ArrayLists first to be able to compare them List existingComment = new ArrayList<>(existingConfig.getComments(path)); existingComment.removeIf(Objects::isNull); - List defaultComment = new ArrayList<>(commentedConfigOption.comment()); + List defaultComment = new ArrayList<>(commentedConfigOption.getValue().comment()); if (!existingComment.equals(defaultComment)) { wasConfigUpdated = true; } - config.setComments(path, commentedConfigOption.comment()); + config.setComments(path, commentedConfigOption.getValue().comment()); } if (shouldRemoveValues) { wasConfigUpdated = true; @@ -93,11 +93,7 @@ private static void tryCreateSection(YamlConfiguration config, String path, Set< String sectionName = sectionNames[i]; if (!existingSections.contains(sectionName)) { config.createSection(sectionName); - for (CommentedConfigOption commentedSection : DefaultedBukkitConfig.ALL_SECTIONS) { - if (commentedSection.path().equals(sectionName)) { - config.setComments(sectionName, commentedSection.comment()); - } - } + config.setComments(sectionName, DefaultedBukkitConfig.ALL_SECTIONS.get(sectionName).comment()); } existingSections.add(sectionName); } @@ -106,27 +102,18 @@ private static void tryCreateSection(YamlConfiguration config, String path, Set< private static boolean shouldRemoveOptions(YamlConfiguration config) { Set configOptions = config.getKeys(true); - List sections = new ArrayList<>(); - for (String configOption : configOptions) { - ConfigurationSection section = config.getConfigurationSection(configOption); - if (section != null) { - sections.add(configOption); - } - } - for (String sectionName : sections) { - configOptions.remove(sectionName); - } - Set defaultConfigOptions = new HashSet<>(); - for (CommentedConfigOption defaultConfigOption : DefaultedBukkitConfig.ALL_OPTIONS) { - defaultConfigOptions.add(defaultConfigOption.path()); - } - List optionsToRemove = new ArrayList<>(); + configOptions.removeIf(config::isConfigurationSection); + + Set defaultConfigOptions = DefaultedBukkitConfig.ALL_OPTIONS.keySet(); + + boolean shouldRemoveOptions = false; for (String option : configOptions) { if (!defaultConfigOptions.contains(option)) { - optionsToRemove.add(option); + shouldRemoveOptions = true; + break; } } - return !optionsToRemove.isEmpty(); + return shouldRemoveOptions; } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java index 9aa5aff75a..6e000d10a2 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java @@ -1,27 +1,30 @@ package dev.jorel.commandapi.config; +import org.jetbrains.annotations.ApiStatus; + import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * Default config values for the plugin's config.yml file */ -class DefaultedBukkitConfig { +@SuppressWarnings("ClassEscapesDefinedScope") +@ApiStatus.Internal +public class DefaultedBukkitConfig { public static final CommentedConfigOption VERBOSE_OUTPUTS = new CommentedConfigOption<>( List.of( "Verbose outputs (default: false)", "If \"true\", outputs command registration and unregistration logs in the console" - ), - "verbose-outputs", false + ), false ); public static final CommentedConfigOption SILENT_LOGS = new CommentedConfigOption<>( List.of( "Silent logs (default: false)", "If \"true\", turns off all logging from the CommandAPI, except for errors." - ), - "silent-logs", false + ), false ); public static final CommentedConfigOption MISSING_EXECUTOR_IMPLEMENTATION = new CommentedConfigOption<>( @@ -31,8 +34,7 @@ class DefaultedBukkitConfig { "parameters are:", " %s - the executor class (lowercase)", " %S - the executor class (normal case)" - ), - "messages.missing-executor-implementation", "This command has no implementations for %s" + ), "This command has no implementations for %s" ); public static final CommentedConfigOption CREATE_DISPATCHER_JSON = new CommentedConfigOption<>( @@ -41,8 +43,7 @@ class DefaultedBukkitConfig { "If \"true\", the CommandAPI creates a command_registration.json file showing the", "mapping of registered commands. This is designed to be used by developers -", "setting this to \"false\" will improve command registration performance." - ), - "create-dispatcher-json", false + ), false ); public static final CommentedConfigOption USE_LATEST_NMS_VERSION = new CommentedConfigOption<>( @@ -51,8 +52,7 @@ class DefaultedBukkitConfig { "If \"true\", the CommandAPI will use the latest available NMS implementation", "when the CommandAPI is used. This avoids all checks to see if the latest NMS", "implementation is actually compatible with the current Minecraft version." - ), - "use-latest-nms-version", false + ), false ); public static final CommentedConfigOption BE_LENIENT_FOR_MINOR_VERSIONS = new CommentedConfigOption<>( @@ -62,8 +62,7 @@ class DefaultedBukkitConfig { "For example, this setting may allow updating from 1.21.1 to 1.21.2 as only the minor version is changing", "but will not allow an update from 1.21.2 to 1.22.", "Keep in mind that implementations may vary and actually updating the CommandAPI might be necessary." - ), - "be-lenient-for-minor-versions", false + ), false ); public static final CommentedConfigOption SHOULD_HOOK_PAPER_RELOAD = new CommentedConfigOption<>( @@ -75,8 +74,7 @@ class DefaultedBukkitConfig { "function which allows CommandAPI commands to be used in datapacks.", "If you set this to false, CommandAPI commands may not work inside datapacks after", "reloading datapacks." - ), - "hook-paper-reload", false + ), false ); public static final CommentedConfigOption SKIP_RELOAD_DATAPACKS = new CommentedConfigOption<>( @@ -85,16 +83,14 @@ class DefaultedBukkitConfig { "If \"true\", the CommandAPI will not reload datapacks when the server has finished", "loading. Datapacks will still be reloaded if performed manually when \"hook-paper-reload\"", "is set to \"true\" and /minecraft:reload is run." - ), - "skip-initial-datapack-reload", false + ), false ); public static final CommentedConfigOption> PLUGINS_TO_CONVERT = new CommentedConfigOption<>( List.of( "Plugins to convert (default: [])", "Controls the list of plugins to process for command conversion." - ), - "plugins-to-convert", new ArrayList<>() + ), new ArrayList<>() ); public static final CommentedConfigOption> OTHER_COMMANDS_TO_CONVERT = new CommentedConfigOption<>( @@ -102,8 +98,7 @@ class DefaultedBukkitConfig { "Other commands to convert (default: [])", "A list of other commands to convert. This should be used for commands which", "are not declared in a plugin.yml file." - ), - "other-commands-to-convert", new ArrayList<>() + ), new ArrayList<>() ); public static final CommentedConfigOption> SKIP_SENDER_PROXY = new CommentedConfigOption<>( @@ -112,34 +107,32 @@ class DefaultedBukkitConfig { "Determines whether the proxy sender should be skipped when converting a", "command. If you are having issues with plugin command conversion, add the", "plugin to this list." - ), - "skip-sender-proxy", new ArrayList<>() + ), new ArrayList<>() ); - public static final List> ALL_OPTIONS = List.of( - VERBOSE_OUTPUTS, - SILENT_LOGS, - MISSING_EXECUTOR_IMPLEMENTATION, - CREATE_DISPATCHER_JSON, - USE_LATEST_NMS_VERSION, - BE_LENIENT_FOR_MINOR_VERSIONS, - SHOULD_HOOK_PAPER_RELOAD, - SKIP_RELOAD_DATAPACKS, - PLUGINS_TO_CONVERT, - OTHER_COMMANDS_TO_CONVERT, - SKIP_SENDER_PROXY + public static final Map> ALL_OPTIONS = Map.ofEntries( + Map.entry("verbose-outputs", VERBOSE_OUTPUTS), + Map.entry("silent-logs", SILENT_LOGS), + Map.entry("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION), + Map.entry("create-dispatcher-json", CREATE_DISPATCHER_JSON), + Map.entry("use-latest-nms-version", USE_LATEST_NMS_VERSION), + Map.entry("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS), + Map.entry("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD), + Map.entry("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS), + Map.entry("plugins-to-convert", PLUGINS_TO_CONVERT), + Map.entry("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT), + Map.entry("skip-sender-proxy", SKIP_SENDER_PROXY) ); public static final CommentedConfigOption SECTION_MESSAGE = new CommentedConfigOption<>( List.of( "Messages", "Controls messages that the CommandAPI displays to players" - ), - "messages", null + ), null ); - public static final List> ALL_SECTIONS = List.of( - SECTION_MESSAGE + public static final Map> ALL_SECTIONS = Map.of( + "messages", SECTION_MESSAGE ); } From 86b3f275ad3a551884e0eab90b04c9e0718d3e05 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Thu, 5 Sep 2024 08:08:45 +0200 Subject: [PATCH 06/26] Use a LinkedHashMap for config options --- .../config/CommentedConfigOption.java | 0 .../config/DefaultedBukkitConfig.java | 34 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) rename {commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core => commandapi-core}/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java (100%) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java rename to commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java index 6e000d10a2..e3a4133920 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java @@ -3,6 +3,7 @@ import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -110,19 +111,8 @@ public class DefaultedBukkitConfig { ), new ArrayList<>() ); - public static final Map> ALL_OPTIONS = Map.ofEntries( - Map.entry("verbose-outputs", VERBOSE_OUTPUTS), - Map.entry("silent-logs", SILENT_LOGS), - Map.entry("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION), - Map.entry("create-dispatcher-json", CREATE_DISPATCHER_JSON), - Map.entry("use-latest-nms-version", USE_LATEST_NMS_VERSION), - Map.entry("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS), - Map.entry("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD), - Map.entry("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS), - Map.entry("plugins-to-convert", PLUGINS_TO_CONVERT), - Map.entry("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT), - Map.entry("skip-sender-proxy", SKIP_SENDER_PROXY) - ); + public static final Map> ALL_OPTIONS = new LinkedHashMap<>(); + public static final Map> ALL_SECTIONS = new LinkedHashMap<>(); public static final CommentedConfigOption SECTION_MESSAGE = new CommentedConfigOption<>( List.of( @@ -131,8 +121,20 @@ public class DefaultedBukkitConfig { ), null ); - public static final Map> ALL_SECTIONS = Map.of( - "messages", SECTION_MESSAGE - ); + static { + ALL_OPTIONS.put("verbose-outputs", VERBOSE_OUTPUTS); + ALL_OPTIONS.put("silent-logs", SILENT_LOGS); + ALL_OPTIONS.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); + ALL_OPTIONS.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); + ALL_OPTIONS.put("use-latest-nms-version", USE_LATEST_NMS_VERSION); + ALL_OPTIONS.put("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS); + ALL_OPTIONS.put("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD); + ALL_OPTIONS.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); + ALL_OPTIONS.put("plugins-to-convert", PLUGINS_TO_CONVERT); + ALL_OPTIONS.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); + ALL_OPTIONS.put("skip-sender-proxy", SKIP_SENDER_PROXY); + + ALL_SECTIONS.put("messages", SECTION_MESSAGE); + } } From 3140b2368c7407d663bdf57d0562da8fd3b206da Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sat, 7 Sep 2024 16:52:29 +0200 Subject: [PATCH 07/26] First iteration of an extendable and testable config system --- commandapi-core/pom.xml | 6 ++ .../commandapi/config/CommentedSection.java | 6 ++ .../commandapi/config/DefaultedConfig.java | 49 ++++++++++ .../commandapi/config/ConfigGenerator.java | 39 ++++++-- .../config/DefaultedBukkitConfig.java | 91 ++++++++----------- .../dev/jorel/commandapi/CommandAPIMain.java | 5 +- .../dev/jorel/commandapi/CommandAPIMain.java | 5 +- 7 files changed, 134 insertions(+), 67 deletions(-) create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java diff --git a/commandapi-core/pom.xml b/commandapi-core/pom.xml index 379d3f2610..25f7e2958f 100644 --- a/commandapi-core/pom.xml +++ b/commandapi-core/pom.xml @@ -65,6 +65,12 @@ ${project.version} provided + + org.jetbrains + annotations + 24.1.0 + provided + diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java new file mode 100644 index 0000000000..88dae173f5 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java @@ -0,0 +1,6 @@ +package dev.jorel.commandapi.config; + +import java.util.List; + +record CommentedSection(List comment) { +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java new file mode 100644 index 0000000000..a1c1105233 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java @@ -0,0 +1,49 @@ +package dev.jorel.commandapi.config; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@SuppressWarnings("ClassEscapesDefinedScope") +@ApiStatus.Internal +public abstract class DefaultedConfig { + + final Map> allOptions = new LinkedHashMap<>(); + final Map allSections = new LinkedHashMap<>(); + + public static final CommentedConfigOption VERBOSE_OUTPUTS = new CommentedConfigOption<>( + List.of( + "Verbose outputs (default: false)", + "If \"true\", outputs command registration and unregistration logs in the console" + ), false + ); + + public static final CommentedConfigOption SILENT_LOGS = new CommentedConfigOption<>( + List.of( + "Silent logs (default: false)", + "If \"true\", turns off all logging from the CommandAPI, except for errors." + ), false + ); + + public static final CommentedConfigOption MISSING_EXECUTOR_IMPLEMENTATION = new CommentedConfigOption<>( + List.of( + "Missing executor implementation (default: \"This command has no implementations for %s\")", + "The message to display to senders when a command has no executor. Available", + "parameters are:", + " %s - the executor class (lowercase)", + " %S - the executor class (normal case)" + ), "This command has no implementations for %s" + ); + + public static final CommentedConfigOption CREATE_DISPATCHER_JSON = new CommentedConfigOption<>( + List.of( + "Create dispatcher JSON (default: false)", + "If \"true\", the CommandAPI creates a command_registration.json file showing the", + "mapping of registered commands. This is designed to be used by developers -", + "setting this to \"false\" will improve command registration performance." + ), false + ); + +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index 1843e390e6..38e7925757 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -14,12 +14,28 @@ @ApiStatus.Internal public class ConfigGenerator { - private ConfigGenerator() {} + private final DefaultedBukkitConfig defaultedBukkitConfig; - public static YamlConfiguration generateDefaultConfig() throws InvalidConfigurationException { + private ConfigGenerator() { + this.defaultedBukkitConfig = DefaultedBukkitConfig.createDefault(); + } + + private ConfigGenerator(DefaultedBukkitConfig defaultedBukkitConfig) { + this.defaultedBukkitConfig = defaultedBukkitConfig; + } + + public static ConfigGenerator createNew() { + return new ConfigGenerator(); + } + + public static ConfigGenerator createNew(DefaultedBukkitConfig defaultedBukkitConfig) { + return new ConfigGenerator(defaultedBukkitConfig); + } + + public YamlConfiguration generateDefaultConfig() throws InvalidConfigurationException { YamlConfiguration config = new YamlConfiguration(); Set sections = new HashSet<>(); - for (Map.Entry> commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS.entrySet()) { + for (Map.Entry> commentedConfigOption : defaultedBukkitConfig.getAllOptions().entrySet()) { String path = commentedConfigOption.getKey(); tryCreateSection(config, path, sections); @@ -30,14 +46,14 @@ public static YamlConfiguration generateDefaultConfig() throws InvalidConfigurat return process(config.saveToString()); } - public static YamlConfiguration generateWithNewValues(YamlConfiguration existingConfig) throws InvalidConfigurationException { + public YamlConfiguration generateWithNewValues(YamlConfiguration existingConfig) throws InvalidConfigurationException { YamlConfiguration config = new YamlConfiguration(); boolean shouldRemoveValues = shouldRemoveOptions(existingConfig); boolean wasConfigUpdated = false; Set sections = new HashSet<>(); - for (Map.Entry> commentedConfigOption : DefaultedBukkitConfig.ALL_OPTIONS.entrySet()) { + for (Map.Entry> commentedConfigOption : defaultedBukkitConfig.getAllOptions().entrySet()) { String path = commentedConfigOption.getKey(); // Update config option @@ -70,7 +86,7 @@ public static YamlConfiguration generateWithNewValues(YamlConfiguration existing return (wasConfigUpdated) ? process(config.saveToString()) : null; } - private static YamlConfiguration process(String configAsString) throws InvalidConfigurationException { + private YamlConfiguration process(String configAsString) throws InvalidConfigurationException { String[] configStrings = configAsString.split("\n"); StringBuilder configBuilder = new StringBuilder(); for (String configString : configStrings) { @@ -84,7 +100,7 @@ private static YamlConfiguration process(String configAsString) throws InvalidCo return config; } - private static void tryCreateSection(YamlConfiguration config, String path, Set existingSections) { + private void tryCreateSection(YamlConfiguration config, String path, Set existingSections) { if (path.contains(".")) { // We have to create a section, or multiple if applicable, first, if it doesn't exist already String[] sectionNames = path.split("\\."); @@ -93,18 +109,21 @@ private static void tryCreateSection(YamlConfiguration config, String path, Set< String sectionName = sectionNames[i]; if (!existingSections.contains(sectionName)) { config.createSection(sectionName); - config.setComments(sectionName, DefaultedBukkitConfig.ALL_SECTIONS.get(sectionName).comment()); + List comment = defaultedBukkitConfig.getAllSections().get(sectionName).comment(); + if (comment != null) { + config.setComments(sectionName, comment); + } } existingSections.add(sectionName); } } } - private static boolean shouldRemoveOptions(YamlConfiguration config) { + private boolean shouldRemoveOptions(YamlConfiguration config) { Set configOptions = config.getKeys(true); configOptions.removeIf(config::isConfigurationSection); - Set defaultConfigOptions = DefaultedBukkitConfig.ALL_OPTIONS.keySet(); + Set defaultConfigOptions = defaultedBukkitConfig.getAllOptions().keySet(); boolean shouldRemoveOptions = false; for (String option : configOptions) { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java index e3a4133920..847873168a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java @@ -12,40 +12,7 @@ */ @SuppressWarnings("ClassEscapesDefinedScope") @ApiStatus.Internal -public class DefaultedBukkitConfig { - - public static final CommentedConfigOption VERBOSE_OUTPUTS = new CommentedConfigOption<>( - List.of( - "Verbose outputs (default: false)", - "If \"true\", outputs command registration and unregistration logs in the console" - ), false - ); - - public static final CommentedConfigOption SILENT_LOGS = new CommentedConfigOption<>( - List.of( - "Silent logs (default: false)", - "If \"true\", turns off all logging from the CommandAPI, except for errors." - ), false - ); - - public static final CommentedConfigOption MISSING_EXECUTOR_IMPLEMENTATION = new CommentedConfigOption<>( - List.of( - "Missing executor implementation (default: \"This command has no implementations for %s\")", - "The message to display to senders when a command has no executor. Available", - "parameters are:", - " %s - the executor class (lowercase)", - " %S - the executor class (normal case)" - ), "This command has no implementations for %s" - ); - - public static final CommentedConfigOption CREATE_DISPATCHER_JSON = new CommentedConfigOption<>( - List.of( - "Create dispatcher JSON (default: false)", - "If \"true\", the CommandAPI creates a command_registration.json file showing the", - "mapping of registered commands. This is designed to be used by developers -", - "setting this to \"false\" will improve command registration performance." - ), false - ); +public class DefaultedBukkitConfig extends DefaultedConfig { public static final CommentedConfigOption USE_LATEST_NMS_VERSION = new CommentedConfigOption<>( List.of( @@ -111,30 +78,48 @@ public class DefaultedBukkitConfig { ), new ArrayList<>() ); - public static final Map> ALL_OPTIONS = new LinkedHashMap<>(); - public static final Map> ALL_SECTIONS = new LinkedHashMap<>(); - - public static final CommentedConfigOption SECTION_MESSAGE = new CommentedConfigOption<>( + public static final CommentedSection SECTION_MESSAGE = new CommentedSection( List.of( "Messages", "Controls messages that the CommandAPI displays to players" - ), null + ) ); - static { - ALL_OPTIONS.put("verbose-outputs", VERBOSE_OUTPUTS); - ALL_OPTIONS.put("silent-logs", SILENT_LOGS); - ALL_OPTIONS.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); - ALL_OPTIONS.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); - ALL_OPTIONS.put("use-latest-nms-version", USE_LATEST_NMS_VERSION); - ALL_OPTIONS.put("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS); - ALL_OPTIONS.put("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD); - ALL_OPTIONS.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); - ALL_OPTIONS.put("plugins-to-convert", PLUGINS_TO_CONVERT); - ALL_OPTIONS.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); - ALL_OPTIONS.put("skip-sender-proxy", SKIP_SENDER_PROXY); - - ALL_SECTIONS.put("messages", SECTION_MESSAGE); + private DefaultedBukkitConfig() {} + + public static DefaultedBukkitConfig createDefault() { + DefaultedBukkitConfig config = new DefaultedBukkitConfig(); + config.allOptions.put("verbose-outputs", VERBOSE_OUTPUTS); + config.allOptions.put("silent-logs", SILENT_LOGS); + config.allOptions.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); + config.allOptions.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); + config.allOptions.put("use-latest-nms-version", USE_LATEST_NMS_VERSION); + config.allOptions.put("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS); + config.allOptions.put("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD); + config.allOptions.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); + config.allOptions.put("plugins-to-convert", PLUGINS_TO_CONVERT); + config.allOptions.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); + config.allOptions.put("skip-sender-proxy", SKIP_SENDER_PROXY); + + config.allSections.put("messages", SECTION_MESSAGE); + + return config; } + public static DefaultedBukkitConfig create(Map> options, Map sections) { + DefaultedBukkitConfig config = new DefaultedBukkitConfig(); + + config.allOptions.putAll(options); + config.allSections.putAll(sections); + + return config; + } + + public Map> getAllOptions() { + return allOptions; + } + + public Map getAllSections() { + return allSections; + } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 4a4869187a..81d28e47bd 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -148,10 +148,11 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); + ConfigGenerator configGenerator = ConfigGenerator.createNew(); if (!getDataFolder().exists()) { getDataFolder().mkdir(); try { - YamlConfiguration defaultConfig = ConfigGenerator.generateDefaultConfig(); + YamlConfiguration defaultConfig = configGenerator.generateDefaultConfig(); defaultConfig.save(configFile); } catch (Exception e) { getLogger().severe("Could not create default config file! This is (probably) a bug."); @@ -166,7 +167,7 @@ public void saveDefaultConfig() { // Update the config if necessary YamlConfiguration existingConfig = YamlConfiguration.loadConfiguration(configFile); try { - YamlConfiguration updatedConfig = ConfigGenerator.generateWithNewValues(existingConfig); + YamlConfiguration updatedConfig = configGenerator.generateWithNewValues(existingConfig); if (updatedConfig == null) { return; } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 0f96af1e82..0598289227 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -147,10 +147,11 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); + ConfigGenerator configGenerator = ConfigGenerator.createNew(); if (!getDataFolder().exists()) { getDataFolder().mkdir(); try { - YamlConfiguration defaultConfig = ConfigGenerator.generateDefaultConfig(); + YamlConfiguration defaultConfig = configGenerator.generateDefaultConfig(); defaultConfig.save(configFile); } catch (Exception e) { getLogger().severe("Could not create default config file! This is (probably) a bug."); @@ -165,7 +166,7 @@ public void saveDefaultConfig() { // Update the config if necessary YamlConfiguration existingConfig = YamlConfiguration.loadConfiguration(configFile); try { - YamlConfiguration updatedConfig = ConfigGenerator.generateWithNewValues(existingConfig); + YamlConfiguration updatedConfig = configGenerator.generateWithNewValues(existingConfig); if (updatedConfig == null) { return; } From 78b1f7c29bdc6034cd165eacb629dabc17e27e9f Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:49:47 +0200 Subject: [PATCH 08/26] Update config system to be platform agnostic --- commandapi-core/pom.xml | 8 + .../commandapi/config/ConfigGenerator.java | 79 ++++++++++ .../config/ConfigurationAdapter.java | 28 ++++ .../commandapi/config/DefaultedConfig.java | 19 ++- .../config/BukkitConfigurationAdapter.java | 103 +++++++++++++ .../commandapi/config/ConfigGenerator.java | 138 ------------------ .../config/DefaultedBukkitConfig.java | 52 +++---- .../dev/jorel/commandapi/CommandAPIMain.java | 31 ++-- .../dev/jorel/commandapi/CommandAPIMain.java | 17 ++- .../dev/jorel/commandapi/CommandAPIMain.java | 38 ++++- .../config/DefaultedVelocityConfig.java | 36 +++++ .../config/VelocityConfigurationAdapter.java | 100 +++++++++++++ 12 files changed, 450 insertions(+), 199 deletions(-) create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java create mode 100644 commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java create mode 100644 commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java create mode 100644 commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java diff --git a/commandapi-core/pom.xml b/commandapi-core/pom.xml index 25f7e2958f..099f1a69a5 100644 --- a/commandapi-core/pom.xml +++ b/commandapi-core/pom.xml @@ -65,12 +65,20 @@ ${project.version} provided + + org.jetbrains annotations 24.1.0 provided + + org.spongepowered + configurate-yaml + 4.1.2 + provided + diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java new file mode 100644 index 0000000000..53dd09ec99 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -0,0 +1,79 @@ +package dev.jorel.commandapi.config; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.Arrays; +import java.util.Map; +import java.util.Set; + +@ApiStatus.Internal +public class ConfigGenerator { + + private final DefaultedConfig defaultedConfig; + + private ConfigGenerator(DefaultedConfig defaultedConfig) { + this.defaultedConfig = defaultedConfig; + } + + public static ConfigGenerator createNew(DefaultedConfig defaultedConfig) { + return new ConfigGenerator(defaultedConfig); + } + + public void populateDefaultConfig(ConfigurationAdapter adapter) { + for (Map.Entry> commentedConfigOption : defaultedConfig.getAllOptions().entrySet()) { + adapter.setValue(commentedConfigOption.getKey(), commentedConfigOption.getValue().option()); + adapter.setComment(commentedConfigOption.getKey(), commentedConfigOption.getValue().comment().toArray(new String[0])); + } + } + + @SuppressWarnings("unchecked") + public ConfigurationAdapter generateWithNewValues(ConfigurationAdapter existingConfig) { + ConfigurationAdapter updatedConfig = existingConfig.createNew(); + + boolean shouldRemoveValues = shouldRemoveOptions(existingConfig); + + boolean wasConfigUpdated = false; + for (Map.Entry> commentedConfigOption : defaultedConfig.getAllOptions().entrySet()) { + String path = commentedConfigOption.getKey(); + + // Update config option + if (existingConfig.contains(path)) { + updatedConfig.tryCreateSection(path, (C) defaultedConfig); + updatedConfig.setValue(path, existingConfig.getValue(path)); + } else { + wasConfigUpdated = true; + updatedConfig.tryCreateSection(path, (C) defaultedConfig); + updatedConfig.setValue(path, commentedConfigOption.getValue().option()); + } + + // Update config option comment + String[] defaultComment = commentedConfigOption.getValue().comment().toArray(new String[0]); + String[] configComment = existingConfig.getComment(path); + + if (!Arrays.equals(defaultComment, configComment)) { + wasConfigUpdated = true; + } + + updatedConfig.setComment(path, commentedConfigOption.getValue().comment().toArray(new String[0])); + } + if (shouldRemoveValues) { + wasConfigUpdated = true; + } + return (wasConfigUpdated) ? updatedConfig : null; + } + + private boolean shouldRemoveOptions(ConfigurationAdapter config) { + Set configOptions = config.getKeys(); + Set defaultConfigOptions = defaultedConfig.getAllOptions().keySet(); + + boolean shouldRemoveOptions = false; + for (String option : configOptions) { + if (!defaultConfigOptions.contains(option)) { + shouldRemoveOptions = true; + break; + } + } + return shouldRemoveOptions; + } + +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java new file mode 100644 index 0000000000..1815a8d219 --- /dev/null +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java @@ -0,0 +1,28 @@ +package dev.jorel.commandapi.config; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.Set; + +@ApiStatus.Internal +public interface ConfigurationAdapter { + + void setValue(String key, Object value); + + void setComment(String key, String[] comment); + + Object getValue(String key); + + String[] getComment(String key); + + Set getKeys(); + + boolean contains(String key); + + void tryCreateSection(String key, DefaultConfiguration defaultConfiguration); + + Configuration config(); + + ConfigurationAdapter createNew(); + +} diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java index a1c1105233..c8cc709c1b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java @@ -10,8 +10,8 @@ @ApiStatus.Internal public abstract class DefaultedConfig { - final Map> allOptions = new LinkedHashMap<>(); - final Map allSections = new LinkedHashMap<>(); + protected final Map> allOptions = new LinkedHashMap<>(); + protected final Map allSections = new LinkedHashMap<>(); public static final CommentedConfigOption VERBOSE_OUTPUTS = new CommentedConfigOption<>( List.of( @@ -46,4 +46,19 @@ public abstract class DefaultedConfig { ), false ); + public static final CommentedSection SECTION_MESSAGE = new CommentedSection( + List.of( + "Messages", + "Controls messages that the CommandAPI displays to players" + ) + ); + + public final Map> getAllOptions() { + return allOptions; + } + + public final Map getAllSections() { + return allSections; + } + } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java new file mode 100644 index 0000000000..888c087ec5 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -0,0 +1,103 @@ +package dev.jorel.commandapi.config; + +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.ApiStatus; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +@ApiStatus.Internal +public record BukkitConfigurationAdapter(YamlConfiguration config) implements ConfigurationAdapter { + + @Override + public void setValue(String key, Object value) { + config.set(key, value); + } + + @Override + public void setComment(String key, String[] comment) { + config.setComments(key, Arrays.asList(comment)); + } + + @Override + public Object getValue(String key) { + return config.get(key); + } + + @Override + public String[] getComment(String key) { + List comments = config.getStringList(key); + comments.removeIf(Objects::isNull); + return comments.toArray(new String[0]); + } + + @Override + public Set getKeys() { + return config.getKeys(false); + } + + @Override + public boolean contains(String key) { + return config.contains(key); + } + + @Override + public void tryCreateSection(String key, DefaultedBukkitConfig defaultedBukkitConfig) { + if (!key.contains(".")) { + return; + } + + // Collect config keys + Set keys = getKeys(); + keys.removeIf(k -> !config.isConfigurationSection(k)); + + // Collect sections + String[] paths = key.split("\\."); + List sectionCandidates = new ArrayList<>(Arrays.asList(paths).subList(0, paths.length - 1)); + + // Create new sections + ConfigurationSection root = null; + StringBuilder pathSoFar = new StringBuilder(); + for (String sectionCandidate : sectionCandidates) { + if (pathSoFar.isEmpty()) { + pathSoFar.append(sectionCandidate); + } else { + pathSoFar.append(".").append(sectionCandidate); + } + if (keys.contains(sectionCandidate) && root == null) { + root = config.getConfigurationSection(sectionCandidate); + } else if (root == null) { + root = config.createSection(sectionCandidate); + root.setComments(sectionCandidate, defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); + } else { + ConfigurationSection section = root.getConfigurationSection(sectionCandidate); + if (section == null) { + root = root.createSection(sectionCandidate); + root.setComments(sectionCandidate, defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); + } else { + root = section; + } + } + } + } + + @Override + public ConfigurationAdapter createNew() { + return new BukkitConfigurationAdapter(new YamlConfiguration()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BukkitConfigurationAdapter that = (BukkitConfigurationAdapter) o; + String thisConfigString = config.saveToString(); + String thatConfigString = that.config.saveToString(); + return thisConfigString.equals(thatConfigString); + } + +} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java deleted file mode 100644 index 38e7925757..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ /dev/null @@ -1,138 +0,0 @@ -package dev.jorel.commandapi.config; - -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.jetbrains.annotations.ApiStatus; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -@ApiStatus.Internal -public class ConfigGenerator { - - private final DefaultedBukkitConfig defaultedBukkitConfig; - - private ConfigGenerator() { - this.defaultedBukkitConfig = DefaultedBukkitConfig.createDefault(); - } - - private ConfigGenerator(DefaultedBukkitConfig defaultedBukkitConfig) { - this.defaultedBukkitConfig = defaultedBukkitConfig; - } - - public static ConfigGenerator createNew() { - return new ConfigGenerator(); - } - - public static ConfigGenerator createNew(DefaultedBukkitConfig defaultedBukkitConfig) { - return new ConfigGenerator(defaultedBukkitConfig); - } - - public YamlConfiguration generateDefaultConfig() throws InvalidConfigurationException { - YamlConfiguration config = new YamlConfiguration(); - Set sections = new HashSet<>(); - for (Map.Entry> commentedConfigOption : defaultedBukkitConfig.getAllOptions().entrySet()) { - String path = commentedConfigOption.getKey(); - - tryCreateSection(config, path, sections); - - config.set(path, commentedConfigOption.getValue().option()); - config.setComments(path, commentedConfigOption.getValue().comment()); - } - return process(config.saveToString()); - } - - public YamlConfiguration generateWithNewValues(YamlConfiguration existingConfig) throws InvalidConfigurationException { - YamlConfiguration config = new YamlConfiguration(); - - boolean shouldRemoveValues = shouldRemoveOptions(existingConfig); - - boolean wasConfigUpdated = false; - Set sections = new HashSet<>(); - for (Map.Entry> commentedConfigOption : defaultedBukkitConfig.getAllOptions().entrySet()) { - String path = commentedConfigOption.getKey(); - - // Update config option - if (existingConfig.contains(path)) { - tryCreateSection(config, path, sections); - config.set(path, existingConfig.get(path)); - } else { - wasConfigUpdated = true; - tryCreateSection(config, path, sections); - config.set(path, commentedConfigOption.getValue().option()); - } - - // Update config option comments - // Comments are kinda stupid, some elements are apparently null elements - // Also, both, YamlConfiguration#getComments(String) and CommentedConfigOption#comments() return unmodifiable list - // which by itself apparently aren't able to be checked for equality by the equals() method - // As a result, we wrap them in new ArrayLists first to be able to compare them - List existingComment = new ArrayList<>(existingConfig.getComments(path)); - existingComment.removeIf(Objects::isNull); - List defaultComment = new ArrayList<>(commentedConfigOption.getValue().comment()); - - if (!existingComment.equals(defaultComment)) { - wasConfigUpdated = true; - } - config.setComments(path, commentedConfigOption.getValue().comment()); - } - if (shouldRemoveValues) { - wasConfigUpdated = true; - } - return (wasConfigUpdated) ? process(config.saveToString()) : null; - } - - private YamlConfiguration process(String configAsString) throws InvalidConfigurationException { - String[] configStrings = configAsString.split("\n"); - StringBuilder configBuilder = new StringBuilder(); - for (String configString : configStrings) { - configBuilder.append(configString).append("\n"); - if (!configString.contains("#")) { - configBuilder.append("\n"); - } - } - YamlConfiguration config = new YamlConfiguration(); - config.loadFromString(configBuilder.toString()); - return config; - } - - private void tryCreateSection(YamlConfiguration config, String path, Set existingSections) { - if (path.contains(".")) { - // We have to create a section, or multiple if applicable, first, if it doesn't exist already - String[] sectionNames = path.split("\\."); - // The last value is the config option - for (int i = 0; i < sectionNames.length - 1; i++) { - String sectionName = sectionNames[i]; - if (!existingSections.contains(sectionName)) { - config.createSection(sectionName); - List comment = defaultedBukkitConfig.getAllSections().get(sectionName).comment(); - if (comment != null) { - config.setComments(sectionName, comment); - } - } - existingSections.add(sectionName); - } - } - } - - private boolean shouldRemoveOptions(YamlConfiguration config) { - Set configOptions = config.getKeys(true); - configOptions.removeIf(config::isConfigurationSection); - - Set defaultConfigOptions = defaultedBukkitConfig.getAllOptions().keySet(); - - boolean shouldRemoveOptions = false; - for (String option : configOptions) { - if (!defaultConfigOptions.contains(option)) { - shouldRemoveOptions = true; - break; - } - } - return shouldRemoveOptions; - } - -} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java index 847873168a..2f21db861e 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java @@ -78,32 +78,28 @@ public class DefaultedBukkitConfig extends DefaultedConfig { ), new ArrayList<>() ); - public static final CommentedSection SECTION_MESSAGE = new CommentedSection( - List.of( - "Messages", - "Controls messages that the CommandAPI displays to players" - ) - ); - - private DefaultedBukkitConfig() {} + private DefaultedBukkitConfig() { + } public static DefaultedBukkitConfig createDefault() { - DefaultedBukkitConfig config = new DefaultedBukkitConfig(); - config.allOptions.put("verbose-outputs", VERBOSE_OUTPUTS); - config.allOptions.put("silent-logs", SILENT_LOGS); - config.allOptions.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); - config.allOptions.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); - config.allOptions.put("use-latest-nms-version", USE_LATEST_NMS_VERSION); - config.allOptions.put("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS); - config.allOptions.put("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD); - config.allOptions.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); - config.allOptions.put("plugins-to-convert", PLUGINS_TO_CONVERT); - config.allOptions.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); - config.allOptions.put("skip-sender-proxy", SKIP_SENDER_PROXY); - - config.allSections.put("messages", SECTION_MESSAGE); - - return config; + return DefaultedBukkitConfig.create( + Map.ofEntries( + Map.entry("verbose-outputs", VERBOSE_OUTPUTS), + Map.entry("silent-logs", SILENT_LOGS), + Map.entry("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION), + Map.entry("create-dispatcher-json", CREATE_DISPATCHER_JSON), + Map.entry("use-latest-nms-version", USE_LATEST_NMS_VERSION), + Map.entry("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS), + Map.entry("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD), + Map.entry("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS), + Map.entry("plugins-to-convert", PLUGINS_TO_CONVERT), + Map.entry("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT), + Map.entry("skip-sender-proxy", SKIP_SENDER_PROXY) + ), + Map.ofEntries( + Map.entry("messages", SECTION_MESSAGE) + ) + ); } public static DefaultedBukkitConfig create(Map> options, Map sections) { @@ -114,12 +110,4 @@ public static DefaultedBukkitConfig create(Map> return config; } - - public Map> getAllOptions() { - return allOptions; - } - - public Map getAllSections() { - return allSections; - } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 81d28e47bd..066b49c254 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -20,15 +20,10 @@ *******************************************************************************/ package dev.jorel.commandapi; -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - +import dev.jorel.commandapi.config.BukkitConfigurationAdapter; import dev.jorel.commandapi.config.ConfigGenerator; +import dev.jorel.commandapi.config.ConfigurationAdapter; +import dev.jorel.commandapi.config.DefaultedBukkitConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -36,6 +31,12 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + /** * Main CommandAPI plugin entrypoint */ @@ -148,12 +149,13 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); - ConfigGenerator configGenerator = ConfigGenerator.createNew(); + ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultedBukkitConfig.createDefault()); if (!getDataFolder().exists()) { getDataFolder().mkdir(); try { - YamlConfiguration defaultConfig = configGenerator.generateDefaultConfig(); - defaultConfig.save(configFile); + ConfigurationAdapter bukkitConfigurationAdapter = new BukkitConfigurationAdapter(new YamlConfiguration()); + configGenerator.populateDefaultConfig(bukkitConfigurationAdapter); + bukkitConfigurationAdapter.config().save(configFile); } catch (Exception e) { getLogger().severe("Could not create default config file! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); @@ -165,13 +167,14 @@ public void saveDefaultConfig() { return; } // Update the config if necessary - YamlConfiguration existingConfig = YamlConfiguration.loadConfiguration(configFile); try { - YamlConfiguration updatedConfig = configGenerator.generateWithNewValues(existingConfig); + YamlConfiguration existingYamlConfig = YamlConfiguration.loadConfiguration(configFile); + ConfigurationAdapter existingConfig = new BukkitConfigurationAdapter(existingYamlConfig); + ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); if (updatedConfig == null) { return; } - updatedConfig.save(configFile); + updatedConfig.config().save(configFile); } catch (Exception e) { getLogger().severe("Could not update config! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 0598289227..14be512bb0 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -27,7 +27,10 @@ import java.util.Map; import java.util.Map.Entry; +import dev.jorel.commandapi.config.BukkitConfigurationAdapter; import dev.jorel.commandapi.config.ConfigGenerator; +import dev.jorel.commandapi.config.ConfigurationAdapter; +import dev.jorel.commandapi.config.DefaultedBukkitConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -147,12 +150,13 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); - ConfigGenerator configGenerator = ConfigGenerator.createNew(); + ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultedBukkitConfig.createDefault()); if (!getDataFolder().exists()) { getDataFolder().mkdir(); try { - YamlConfiguration defaultConfig = configGenerator.generateDefaultConfig(); - defaultConfig.save(configFile); + ConfigurationAdapter bukkitConfigurationAdapter = new BukkitConfigurationAdapter(new YamlConfiguration()); + configGenerator.populateDefaultConfig(bukkitConfigurationAdapter); + bukkitConfigurationAdapter.config().save(configFile); } catch (Exception e) { getLogger().severe("Could not create default config file! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); @@ -164,13 +168,14 @@ public void saveDefaultConfig() { return; } // Update the config if necessary - YamlConfiguration existingConfig = YamlConfiguration.loadConfiguration(configFile); try { - YamlConfiguration updatedConfig = configGenerator.generateWithNewValues(existingConfig); + YamlConfiguration existingYamlConfig = YamlConfiguration.loadConfiguration(configFile); + ConfigurationAdapter existingConfig = new BukkitConfigurationAdapter(existingYamlConfig); + ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); if (updatedConfig == null) { return; } - updatedConfig.save(configFile); + updatedConfig.config().save(configFile); } catch (Exception e) { getLogger().severe("Could not update config! This is (probably) a bug."); getLogger().severe("Error message: " + e.getMessage()); diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 8b19495dfd..8f5c838f2e 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -8,12 +8,17 @@ import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import dev.jorel.commandapi.config.ConfigGenerator; +import dev.jorel.commandapi.config.ConfigurationAdapter; +import dev.jorel.commandapi.config.DefaultedVelocityConfig; +import dev.jorel.commandapi.config.VelocityConfigurationAdapter; +import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurationNode; +import org.spongepowered.configurate.yaml.NodeStyle; import org.spongepowered.configurate.yaml.YamlConfigurationLoader; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.logging.Logger; @@ -34,16 +39,35 @@ public class CommandAPIMain { public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { // Try to find the config file Path configFile = dataDirectory.resolve("config.yml"); + YamlConfigurationLoader loader = YamlConfigurationLoader.builder() + .nodeStyle(NodeStyle.BLOCK) + .path(configFile) + .build(); // If the config doesn't exist, load it from the resources - if(!Files.exists(configFile)) { + ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultedVelocityConfig.createDefault()); + if (!Files.exists(configFile)) { try { Files.createDirectories(configFile.getParent()); } catch (IOException ignored) { } - try (InputStream defaultConfig = getClass().getClassLoader().getResourceAsStream("config.yml")) { - Files.copy(defaultConfig, configFile); + try { + ConfigurationAdapter velocityConfigurationAdapter = new VelocityConfigurationAdapter(loader, loader.createNode()); + configGenerator.populateDefaultConfig(velocityConfigurationAdapter); + loader.save(velocityConfigurationAdapter.config()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + try { + // If the config does exist, update it if necessary + CommentedConfigurationNode existingYamlConfig = loader.load(); + ConfigurationAdapter existingConfig = new VelocityConfigurationAdapter(loader, existingYamlConfig); + ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); + if (updatedConfig != null) { + loader.save(updatedConfig.config()); + } } catch (IOException e) { throw new RuntimeException(e); } @@ -52,7 +76,7 @@ public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dat // Load the file as a yaml node ConfigurationNode configYAML; try { - configYAML = YamlConfigurationLoader.builder().path(configFile).build().load(); + configYAML = loader.load(); } catch (IOException e) { throw new RuntimeException(e); } @@ -74,13 +98,13 @@ public void onProxyInitialization(ProxyInitializeEvent event) { // Enable CommandAPI.onEnable(); } - + @Subscribe public void onProxyShutdown(ProxyShutdownEvent event) { // Shut down CommandAPI.onDisable(); } - + // On /velocity reload @Subscribe public void onProxyReload(ProxyReloadEvent event) { diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java new file mode 100644 index 0000000000..5027a5a2a6 --- /dev/null +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java @@ -0,0 +1,36 @@ +package dev.jorel.commandapi.config; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.Map; + +@SuppressWarnings("ClassEscapesDefinedScope") +@ApiStatus.Internal +public class DefaultedVelocityConfig extends DefaultedConfig { + + private DefaultedVelocityConfig() {} + + public static DefaultedVelocityConfig createDefault() { + return DefaultedVelocityConfig.create( + Map.ofEntries( + Map.entry("verbose-outputs", VERBOSE_OUTPUTS), + Map.entry("silent-logs", SILENT_LOGS), + Map.entry("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION), + Map.entry("create-dispatcher-json", CREATE_DISPATCHER_JSON) + ), + Map.ofEntries( + Map.entry("messages", SECTION_MESSAGE) + ) + ); + } + + public static DefaultedVelocityConfig create(Map> options, Map sections) { + DefaultedVelocityConfig config = new DefaultedVelocityConfig(); + + config.allOptions.putAll(options); + config.allSections.putAll(sections); + + return config; + } + +} diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java new file mode 100644 index 0000000000..240c81d50a --- /dev/null +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -0,0 +1,100 @@ +package dev.jorel.commandapi.config; + +import org.spongepowered.configurate.CommentedConfigurationNode; +import org.spongepowered.configurate.ConfigurationNode; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.yaml.YamlConfigurationLoader; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@SuppressWarnings("ConfusingArgumentToVarargsMethod") +public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config) implements ConfigurationAdapter { + + @Override + public void setValue(String key, Object value) { + setValue0(key, value); + } + + @Override + public void setComment(String key, String[] comment) { + config.node(key.split("\\.")).comment(String.join("\n", comment)); + } + + @Override + public Object getValue(String key) { + return getValue0(key); + } + + @SuppressWarnings("DataFlowIssue") + @Override + public String[] getComment(String key) { + return config.node(key.split("\\.")).comment().split("\n"); + } + + @Override + public Set getKeys() { + Set keys = new HashSet<>(); + for (Object key : config.childrenMap().keySet()) { + keys.add((String) key); + } + return keys; + } + + @Override + public boolean contains(String key) { + return !config.node(key.split("\\.")).virtual(); + } + + @Override + public void tryCreateSection(String key, DefaultedVelocityConfig defaultedVelocityConfig) { + if (!key.contains(".")) { + return; + } + String[] path = key.split("\\."); + List sectionCandidates = new ArrayList<>(Arrays.asList(path).subList(0, path.length - 1)); + + StringBuilder pathSoFar = new StringBuilder(); + for (String section : sectionCandidates) { + if (pathSoFar.isEmpty()) { + pathSoFar.append(section); + } else { + pathSoFar.append(".").append(section); + } + if (config.node(pathSoFar.toString().split("\\.")).comment() == null) { + config.node(pathSoFar.toString().split("\\.")).comment(String.join("\n", defaultedVelocityConfig.getAllSections().get(pathSoFar.toString()).comment())); + } + } + } + + @Override + public CommentedConfigurationNode config() { + return config; + } + + @Override + public ConfigurationAdapter createNew() { + return new VelocityConfigurationAdapter(loader, loader.createNode()); + } + + private void setValue0(String key, Object value) { + try { + config.node(key.split("\\.")).set(value); + } catch (SerializationException e) { + e.printStackTrace(System.err); + } + } + + private Object getValue0(String key) { + try { + return config.node(key.split("\\.")).get(Object.class); + } catch (SerializationException e) { + e.printStackTrace(System.err); + return null; + } + } + +} From a21e635e5122adbfad164af35e892f9d3396fecd Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:58:43 +0200 Subject: [PATCH 09/26] Clean up dependencies --- commandapi-core/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/commandapi-core/pom.xml b/commandapi-core/pom.xml index 099f1a69a5..ca29abb284 100644 --- a/commandapi-core/pom.xml +++ b/commandapi-core/pom.xml @@ -73,12 +73,6 @@ 24.1.0 provided - - org.spongepowered - configurate-yaml - 4.1.2 - provided - From a0bd0efe813eb72e04d7d7681d4ca8381d740de4 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sun, 22 Sep 2024 18:04:40 +0200 Subject: [PATCH 10/26] Fix stuff --- .../config/CommentedConfigOption.java | 4 +- .../commandapi/config/ConfigGenerator.java | 11 ++-- .../config/ConfigurationAdapter.java | 2 + .../commandapi/config/DefaultedConfig.java | 16 ++--- .../config/BukkitConfigurationAdapter.java | 57 ++++++++++------- .../config/DefaultedBukkitConfig.java | 62 ++++++++++--------- .../config/DefaultedVelocityConfig.java | 21 ++++--- .../config/VelocityConfigurationAdapter.java | 5 ++ 8 files changed, 102 insertions(+), 76 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java index 7e09b311ce..472e1dd495 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java @@ -1,6 +1,4 @@ package dev.jorel.commandapi.config; -import java.util.List; - -record CommentedConfigOption(List comment, T option) { +record CommentedConfigOption(String[] comment, T option) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index 53dd09ec99..83bf93418d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -3,6 +3,7 @@ import org.jetbrains.annotations.ApiStatus; import java.util.Arrays; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -22,7 +23,7 @@ public static ConfigGenerator createNew(DefaultedConfig defaultedConfig) { public void populateDefaultConfig(ConfigurationAdapter adapter) { for (Map.Entry> commentedConfigOption : defaultedConfig.getAllOptions().entrySet()) { adapter.setValue(commentedConfigOption.getKey(), commentedConfigOption.getValue().option()); - adapter.setComment(commentedConfigOption.getKey(), commentedConfigOption.getValue().comment().toArray(new String[0])); + adapter.setComment(commentedConfigOption.getKey(), commentedConfigOption.getValue().comment()); } } @@ -47,23 +48,25 @@ public ConfigurationAdapter generateWithNew } // Update config option comment - String[] defaultComment = commentedConfigOption.getValue().comment().toArray(new String[0]); + String[] defaultComment = commentedConfigOption.getValue().comment(); String[] configComment = existingConfig.getComment(path); if (!Arrays.equals(defaultComment, configComment)) { wasConfigUpdated = true; } - updatedConfig.setComment(path, commentedConfigOption.getValue().comment().toArray(new String[0])); + updatedConfig.setComment(path, commentedConfigOption.getValue().comment()); } if (shouldRemoveValues) { wasConfigUpdated = true; } - return (wasConfigUpdated) ? updatedConfig : null; + System.out.println(wasConfigUpdated); + return (wasConfigUpdated) ? updatedConfig.complete() : null; } private boolean shouldRemoveOptions(ConfigurationAdapter config) { Set configOptions = config.getKeys(); + configOptions.forEach(System.out::println); Set defaultConfigOptions = defaultedConfig.getAllOptions().keySet(); boolean shouldRemoveOptions = false; diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java index 1815a8d219..da5f1b9574 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java @@ -21,6 +21,8 @@ public interface ConfigurationAdapter complete(); + Configuration config(); ConfigurationAdapter createNew(); diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java index c8cc709c1b..d0612e89b8 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java @@ -14,36 +14,36 @@ public abstract class DefaultedConfig { protected final Map allSections = new LinkedHashMap<>(); public static final CommentedConfigOption VERBOSE_OUTPUTS = new CommentedConfigOption<>( - List.of( + new String[]{ "Verbose outputs (default: false)", "If \"true\", outputs command registration and unregistration logs in the console" - ), false + }, false ); public static final CommentedConfigOption SILENT_LOGS = new CommentedConfigOption<>( - List.of( + new String[] { "Silent logs (default: false)", "If \"true\", turns off all logging from the CommandAPI, except for errors." - ), false + }, false ); public static final CommentedConfigOption MISSING_EXECUTOR_IMPLEMENTATION = new CommentedConfigOption<>( - List.of( + new String[]{ "Missing executor implementation (default: \"This command has no implementations for %s\")", "The message to display to senders when a command has no executor. Available", "parameters are:", " %s - the executor class (lowercase)", " %S - the executor class (normal case)" - ), "This command has no implementations for %s" + }, "This command has no implementations for %s" ); public static final CommentedConfigOption CREATE_DISPATCHER_JSON = new CommentedConfigOption<>( - List.of( + new String[]{ "Create dispatcher JSON (default: false)", "If \"true\", the CommandAPI creates a command_registration.json file showing the", "mapping of registered commands. This is designed to be used by developers -", "setting this to \"false\" will improve command registration performance." - ), false + }, false ); public static final CommentedSection SECTION_MESSAGE = new CommentedSection( diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java index 888c087ec5..417ef2d68d 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -1,11 +1,13 @@ package dev.jorel.commandapi.config; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; @@ -30,14 +32,16 @@ public Object getValue(String key) { @Override public String[] getComment(String key) { - List comments = config.getStringList(key); + List comments = new ArrayList<>(config.getComments(key)); comments.removeIf(Objects::isNull); return comments.toArray(new String[0]); } @Override public Set getKeys() { - return config.getKeys(false); + Set keys = new HashSet<>(config.getKeys(true)); + keys.removeIf(config::isConfigurationSection); + return keys; } @Override @@ -60,7 +64,7 @@ public void tryCreateSection(String key, DefaultedBukkitConfig defaultedBukkitCo List sectionCandidates = new ArrayList<>(Arrays.asList(paths).subList(0, paths.length - 1)); // Create new sections - ConfigurationSection root = null; + ConfigurationSection section = null; StringBuilder pathSoFar = new StringBuilder(); for (String sectionCandidate : sectionCandidates) { if (pathSoFar.isEmpty()) { @@ -68,36 +72,45 @@ public void tryCreateSection(String key, DefaultedBukkitConfig defaultedBukkitCo } else { pathSoFar.append(".").append(sectionCandidate); } - if (keys.contains(sectionCandidate) && root == null) { - root = config.getConfigurationSection(sectionCandidate); - } else if (root == null) { - root = config.createSection(sectionCandidate); - root.setComments(sectionCandidate, defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); + + if (keys.contains(sectionCandidate) && section == null) { + section = config.getConfigurationSection(sectionCandidate); + } else if (section == null) { + section = config.createSection(sectionCandidate); + config.setComments(pathSoFar.toString(), defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); } else { - ConfigurationSection section = root.getConfigurationSection(sectionCandidate); - if (section == null) { - root = root.createSection(sectionCandidate); - root.setComments(sectionCandidate, defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); + ConfigurationSection currentSection = section.getConfigurationSection(sectionCandidate); + if (currentSection == null) { + section = section.createSection(sectionCandidate); + config.setComments(pathSoFar.toString(), defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); } else { - root = section; + section = currentSection; } } } } @Override - public ConfigurationAdapter createNew() { - return new BukkitConfigurationAdapter(new YamlConfiguration()); + public ConfigurationAdapter complete() { + String[] configStrings = config.saveToString().split("\n"); + StringBuilder configBuilder = new StringBuilder(); + for (String configString : configStrings) { + configBuilder.append(configString).append("\n"); + if (!configString.contains("#")) { + configBuilder.append("\n"); + } + } + try { + config.loadFromString(configBuilder.toString()); + } catch (InvalidConfigurationException e) { + e.printStackTrace(System.err); + } + return this; } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - BukkitConfigurationAdapter that = (BukkitConfigurationAdapter) o; - String thisConfigString = config.saveToString(); - String thatConfigString = that.config.saveToString(); - return thisConfigString.equals(thatConfigString); + public ConfigurationAdapter createNew() { + return new BukkitConfigurationAdapter(new YamlConfiguration()); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java index 2f21db861e..0bdf4db037 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java @@ -15,26 +15,26 @@ public class DefaultedBukkitConfig extends DefaultedConfig { public static final CommentedConfigOption USE_LATEST_NMS_VERSION = new CommentedConfigOption<>( - List.of( + new String[] { "Use latest version (default: false)", "If \"true\", the CommandAPI will use the latest available NMS implementation", "when the CommandAPI is used. This avoids all checks to see if the latest NMS", "implementation is actually compatible with the current Minecraft version." - ), false + }, false ); public static final CommentedConfigOption BE_LENIENT_FOR_MINOR_VERSIONS = new CommentedConfigOption<>( - List.of( + new String[] { "Be lenient with version checks when loading for new minor Minecraft versions (default: false)", "If \"true\", the CommandAPI loads NMS implementations for potentially unsupported Minecraft versions.", "For example, this setting may allow updating from 1.21.1 to 1.21.2 as only the minor version is changing", "but will not allow an update from 1.21.2 to 1.22.", "Keep in mind that implementations may vary and actually updating the CommandAPI might be necessary." - ), false + }, false ); public static final CommentedConfigOption SHOULD_HOOK_PAPER_RELOAD = new CommentedConfigOption<>( - List.of( + new String[] { "Hook into Paper's ServerResourcesReloadedEvent (default: true)", "If \"true\", and the CommandAPI detects it is running on a Paper server, it will", "hook into Paper's ServerResourcesReloadedEvent to detect when /minecraft:reload is run.", @@ -42,63 +42,65 @@ public class DefaultedBukkitConfig extends DefaultedConfig { "function which allows CommandAPI commands to be used in datapacks.", "If you set this to false, CommandAPI commands may not work inside datapacks after", "reloading datapacks." - ), false + }, false ); public static final CommentedConfigOption SKIP_RELOAD_DATAPACKS = new CommentedConfigOption<>( - List.of( + new String[] { "Skips the initial datapack reload when the server loads (default: false)", "If \"true\", the CommandAPI will not reload datapacks when the server has finished", "loading. Datapacks will still be reloaded if performed manually when \"hook-paper-reload\"", "is set to \"true\" and /minecraft:reload is run." - ), false + }, false ); public static final CommentedConfigOption> PLUGINS_TO_CONVERT = new CommentedConfigOption<>( - List.of( + new String[] { "Plugins to convert (default: [])", "Controls the list of plugins to process for command conversion." - ), new ArrayList<>() + }, new ArrayList<>() ); public static final CommentedConfigOption> OTHER_COMMANDS_TO_CONVERT = new CommentedConfigOption<>( - List.of( + new String[] { "Other commands to convert (default: [])", "A list of other commands to convert. This should be used for commands which", "are not declared in a plugin.yml file." - ), new ArrayList<>() + }, new ArrayList<>() ); public static final CommentedConfigOption> SKIP_SENDER_PROXY = new CommentedConfigOption<>( - List.of( + new String[] { "Skip sender proxy (default: [])", "Determines whether the proxy sender should be skipped when converting a", "command. If you are having issues with plugin command conversion, add the", "plugin to this list." - ), new ArrayList<>() + }, new ArrayList<>() ); private DefaultedBukkitConfig() { } public static DefaultedBukkitConfig createDefault() { + Map> options = new LinkedHashMap<>(); + options.put("verbose-outputs", VERBOSE_OUTPUTS); + options.put("silent-logs", SILENT_LOGS); + options.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); + options.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); + options.put("use-latest-nms-version", USE_LATEST_NMS_VERSION); + options.put("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS); + options.put("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD); + options.put("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS); + options.put("plugins-to-convert", PLUGINS_TO_CONVERT); + options.put("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT); + options.put("skip-sender-proxy", SKIP_SENDER_PROXY); + + Map sections = new LinkedHashMap<>(); + sections.put("messages", SECTION_MESSAGE); + return DefaultedBukkitConfig.create( - Map.ofEntries( - Map.entry("verbose-outputs", VERBOSE_OUTPUTS), - Map.entry("silent-logs", SILENT_LOGS), - Map.entry("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION), - Map.entry("create-dispatcher-json", CREATE_DISPATCHER_JSON), - Map.entry("use-latest-nms-version", USE_LATEST_NMS_VERSION), - Map.entry("be-lenient-for-minor-versions", BE_LENIENT_FOR_MINOR_VERSIONS), - Map.entry("hook-paper-reload", SHOULD_HOOK_PAPER_RELOAD), - Map.entry("skip-initial-datapack-reload", SKIP_RELOAD_DATAPACKS), - Map.entry("plugins-to-convert", PLUGINS_TO_CONVERT), - Map.entry("other-commands-to-convert", OTHER_COMMANDS_TO_CONVERT), - Map.entry("skip-sender-proxy", SKIP_SENDER_PROXY) - ), - Map.ofEntries( - Map.entry("messages", SECTION_MESSAGE) - ) + options, + sections ); } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java index 5027a5a2a6..924ea95336 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.ApiStatus; +import java.util.LinkedHashMap; import java.util.Map; @SuppressWarnings("ClassEscapesDefinedScope") @@ -11,16 +12,18 @@ public class DefaultedVelocityConfig extends DefaultedConfig { private DefaultedVelocityConfig() {} public static DefaultedVelocityConfig createDefault() { + Map> options = new LinkedHashMap<>(); + options.put("verbose-outputs", VERBOSE_OUTPUTS); + options.put("silent-logs", SILENT_LOGS); + options.put("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION); + options.put("create-dispatcher-json", CREATE_DISPATCHER_JSON); + + Map sections = new LinkedHashMap<>(); + sections.put("messages", SECTION_MESSAGE); + return DefaultedVelocityConfig.create( - Map.ofEntries( - Map.entry("verbose-outputs", VERBOSE_OUTPUTS), - Map.entry("silent-logs", SILENT_LOGS), - Map.entry("messages.missing-executor-implementation", MISSING_EXECUTOR_IMPLEMENTATION), - Map.entry("create-dispatcher-json", CREATE_DISPATCHER_JSON) - ), - Map.ofEntries( - Map.entry("messages", SECTION_MESSAGE) - ) + options, + sections ); } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 240c81d50a..379a47f4b2 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -75,6 +75,11 @@ public CommentedConfigurationNode config() { return config; } + @Override + public ConfigurationAdapter complete() { + return this; + } + @Override public ConfigurationAdapter createNew() { return new VelocityConfigurationAdapter(loader, loader.createNode()); From 90fac612d8f5c21a45f00b03e3afb9476e5c0ff2 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sun, 22 Sep 2024 19:22:24 +0200 Subject: [PATCH 11/26] Annotations --- .../dev/jorel/commandapi/config/CommentedConfigOption.java | 3 +++ .../java/dev/jorel/commandapi/config/CommentedSection.java | 3 +++ .../jorel/commandapi/config/VelocityConfigurationAdapter.java | 2 ++ 3 files changed, 8 insertions(+) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java index 472e1dd495..edec8b043b 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java @@ -1,4 +1,7 @@ package dev.jorel.commandapi.config; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal record CommentedConfigOption(String[] comment, T option) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java index 88dae173f5..65c1e7f142 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java @@ -1,6 +1,9 @@ package dev.jorel.commandapi.config; +import org.jetbrains.annotations.ApiStatus; + import java.util.List; +@ApiStatus.Internal record CommentedSection(List comment) { } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 379a47f4b2..534089ade0 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -1,5 +1,6 @@ package dev.jorel.commandapi.config; +import org.jetbrains.annotations.ApiStatus; import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.serialize.SerializationException; @@ -12,6 +13,7 @@ import java.util.Set; @SuppressWarnings("ConfusingArgumentToVarargsMethod") +@ApiStatus.Internal public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config) implements ConfigurationAdapter { @Override From 5b8886aa66d10e9ef46e48723e780433e26a630c Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sun, 22 Sep 2024 19:45:43 +0200 Subject: [PATCH 12/26] Fix Annotations --- .../dev/jorel/commandapi/config/DefaultedVelocityConfig.java | 3 --- .../jorel/commandapi/config/VelocityConfigurationAdapter.java | 2 -- 2 files changed, 5 deletions(-) diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java index 924ea95336..1608f2edf0 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java @@ -1,12 +1,9 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - import java.util.LinkedHashMap; import java.util.Map; @SuppressWarnings("ClassEscapesDefinedScope") -@ApiStatus.Internal public class DefaultedVelocityConfig extends DefaultedConfig { private DefaultedVelocityConfig() {} diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 534089ade0..379a47f4b2 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -1,6 +1,5 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.serialize.SerializationException; @@ -13,7 +12,6 @@ import java.util.Set; @SuppressWarnings("ConfusingArgumentToVarargsMethod") -@ApiStatus.Internal public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config) implements ConfigurationAdapter { @Override From 460a466c84d71a336e99c570e63b81dfca42c47b Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:49:04 +0200 Subject: [PATCH 13/26] Fix more stuff --- .../config/CommentedConfigOption.java | 2 +- .../commandapi/config/CommentedSection.java | 4 +- .../commandapi/config/ConfigGenerator.java | 44 +++++----- .../config/ConfigurationAdapter.java | 12 ++- ...efaultedConfig.java => DefaultConfig.java} | 8 +- .../config/BukkitConfigurationAdapter.java | 54 +++++++++++-- ...itConfig.java => DefaultBukkitConfig.java} | 18 ++--- .../dev/jorel/commandapi/CommandAPIMain.java | 39 +-------- .../dev/jorel/commandapi/CommandAPIMain.java | 40 +-------- .../dev/jorel/commandapi/CommandAPIMain.java | 30 +------ ...Config.java => DefaultVelocityConfig.java} | 13 ++- .../config/VelocityConfigurationAdapter.java | 81 +++++++++++++------ 12 files changed, 164 insertions(+), 181 deletions(-) rename commandapi-core/src/main/java/dev/jorel/commandapi/config/{DefaultedConfig.java => DefaultConfig.java} (94%) rename commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/{DefaultedBukkitConfig.java => DefaultBukkitConfig.java} (89%) rename commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/{DefaultedVelocityConfig.java => DefaultVelocityConfig.java} (59%) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java index edec8b043b..36d73baf2d 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java @@ -3,5 +3,5 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal -record CommentedConfigOption(String[] comment, T option) { +public record CommentedConfigOption(String[] comment, T option) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java index 65c1e7f142..70b99feb21 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java @@ -2,8 +2,6 @@ import org.jetbrains.annotations.ApiStatus; -import java.util.List; - @ApiStatus.Internal -record CommentedSection(List comment) { +public record CommentedSection(String[] comment) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index 83bf93418d..ace243b503 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -3,47 +3,47 @@ import org.jetbrains.annotations.ApiStatus; import java.util.Arrays; -import java.util.HashSet; import java.util.Map; import java.util.Set; @ApiStatus.Internal public class ConfigGenerator { - private final DefaultedConfig defaultedConfig; + private final DefaultConfig defaultConfig; - private ConfigGenerator(DefaultedConfig defaultedConfig) { - this.defaultedConfig = defaultedConfig; + private ConfigGenerator(DefaultConfig defaultConfig) { + this.defaultConfig = defaultConfig; } - public static ConfigGenerator createNew(DefaultedConfig defaultedConfig) { - return new ConfigGenerator(defaultedConfig); + public static ConfigGenerator createNew(DefaultConfig defaultConfig) { + return new ConfigGenerator(defaultConfig); } - public void populateDefaultConfig(ConfigurationAdapter adapter) { - for (Map.Entry> commentedConfigOption : defaultedConfig.getAllOptions().entrySet()) { + public void populateDefaultConfig(ConfigurationAdapter adapter) { + for (Map.Entry> commentedConfigOption : defaultConfig.getAllOptions().entrySet()) { + adapter.tryCreateSection(commentedConfigOption.getKey(), defaultConfig); adapter.setValue(commentedConfigOption.getKey(), commentedConfigOption.getValue().option()); adapter.setComment(commentedConfigOption.getKey(), commentedConfigOption.getValue().comment()); } + adapter.complete(); } - @SuppressWarnings("unchecked") - public ConfigurationAdapter generateWithNewValues(ConfigurationAdapter existingConfig) { - ConfigurationAdapter updatedConfig = existingConfig.createNew(); + public ConfigurationAdapter generateWithNewValues(ConfigurationAdapter existingConfig) { + ConfigurationAdapter updatedConfig = existingConfig.createNew(); boolean shouldRemoveValues = shouldRemoveOptions(existingConfig); boolean wasConfigUpdated = false; - for (Map.Entry> commentedConfigOption : defaultedConfig.getAllOptions().entrySet()) { + for (Map.Entry> commentedConfigOption : defaultConfig.getAllOptions().entrySet()) { String path = commentedConfigOption.getKey(); // Update config option if (existingConfig.contains(path)) { - updatedConfig.tryCreateSection(path, (C) defaultedConfig); + updatedConfig.tryCreateSection(path, defaultConfig); updatedConfig.setValue(path, existingConfig.getValue(path)); } else { wasConfigUpdated = true; - updatedConfig.tryCreateSection(path, (C) defaultedConfig); + updatedConfig.tryCreateSection(path, defaultConfig); updatedConfig.setValue(path, commentedConfigOption.getValue().option()); } @@ -57,17 +57,25 @@ public ConfigurationAdapter generateWithNew updatedConfig.setComment(path, commentedConfigOption.getValue().comment()); } + for (Map.Entry commentedSection : defaultConfig.getAllSections().entrySet()) { + String[] defaultComment = commentedSection.getValue().comment(); + String[] configComment = existingConfig.getComment(commentedSection.getKey()); + + if (!Arrays.equals(defaultComment, configComment)) { + wasConfigUpdated = true; + } + + updatedConfig.setComment(commentedSection.getKey(), commentedSection.getValue().comment()); + } if (shouldRemoveValues) { wasConfigUpdated = true; } - System.out.println(wasConfigUpdated); return (wasConfigUpdated) ? updatedConfig.complete() : null; } - private boolean shouldRemoveOptions(ConfigurationAdapter config) { + private boolean shouldRemoveOptions(ConfigurationAdapter config) { Set configOptions = config.getKeys(); - configOptions.forEach(System.out::println); - Set defaultConfigOptions = defaultedConfig.getAllOptions().keySet(); + Set defaultConfigOptions = defaultConfig.getAllOptions().keySet(); boolean shouldRemoveOptions = false; for (String option : configOptions) { diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java index da5f1b9574..953bb56925 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java @@ -2,10 +2,12 @@ import org.jetbrains.annotations.ApiStatus; +import java.io.File; import java.util.Set; +import java.util.logging.Logger; @ApiStatus.Internal -public interface ConfigurationAdapter { +public interface ConfigurationAdapter { void setValue(String key, Object value); @@ -19,12 +21,14 @@ public interface ConfigurationAdapter complete(); + ConfigurationAdapter complete(); Configuration config(); - ConfigurationAdapter createNew(); + ConfigurationAdapter createNew(); + + void saveDefaultConfig(File directory, File configFile, Logger logger); } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java similarity index 94% rename from commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java rename to commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java index d0612e89b8..d88d4eea4c 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultedConfig.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java @@ -3,12 +3,10 @@ import org.jetbrains.annotations.ApiStatus; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; -@SuppressWarnings("ClassEscapesDefinedScope") @ApiStatus.Internal -public abstract class DefaultedConfig { +public abstract class DefaultConfig { protected final Map> allOptions = new LinkedHashMap<>(); protected final Map allSections = new LinkedHashMap<>(); @@ -47,10 +45,10 @@ public abstract class DefaultedConfig { ); public static final CommentedSection SECTION_MESSAGE = new CommentedSection( - List.of( + new String[]{ "Messages", "Controls messages that the CommandAPI displays to players" - ) + } ); public final Map> getAllOptions() { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java index 417ef2d68d..c247cdd958 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -5,15 +5,17 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.ApiStatus; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.logging.Logger; @ApiStatus.Internal -public record BukkitConfigurationAdapter(YamlConfiguration config) implements ConfigurationAdapter { +public record BukkitConfigurationAdapter(YamlConfiguration config) implements ConfigurationAdapter { @Override public void setValue(String key, Object value) { @@ -50,7 +52,7 @@ public boolean contains(String key) { } @Override - public void tryCreateSection(String key, DefaultedBukkitConfig defaultedBukkitConfig) { + public void tryCreateSection(String key, DefaultConfig defaultedBukkitConfig) { if (!key.contains(".")) { return; } @@ -77,12 +79,12 @@ public void tryCreateSection(String key, DefaultedBukkitConfig defaultedBukkitCo section = config.getConfigurationSection(sectionCandidate); } else if (section == null) { section = config.createSection(sectionCandidate); - config.setComments(pathSoFar.toString(), defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); + config.setComments(pathSoFar.toString(), Arrays.asList(defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment())); } else { ConfigurationSection currentSection = section.getConfigurationSection(sectionCandidate); if (currentSection == null) { section = section.createSection(sectionCandidate); - config.setComments(pathSoFar.toString(), defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment()); + config.setComments(pathSoFar.toString(), Arrays.asList(defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment())); } else { section = currentSection; } @@ -91,7 +93,7 @@ public void tryCreateSection(String key, DefaultedBukkitConfig defaultedBukkitCo } @Override - public ConfigurationAdapter complete() { + public ConfigurationAdapter complete() { String[] configStrings = config.saveToString().split("\n"); StringBuilder configBuilder = new StringBuilder(); for (String configString : configStrings) { @@ -109,8 +111,46 @@ public ConfigurationAdapter complete() } @Override - public ConfigurationAdapter createNew() { + public ConfigurationAdapter createNew() { return new BukkitConfigurationAdapter(new YamlConfiguration()); } -} + @Override + public void saveDefaultConfig(File directory, File configFile, Logger logger) { + ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultBukkitConfig.createDefault()); + if (!directory.exists()) { + directory.mkdir(); + try { + ConfigurationAdapter bukkitConfigurationAdapter = new BukkitConfigurationAdapter(new YamlConfiguration()); + configGenerator.populateDefaultConfig(bukkitConfigurationAdapter); + bukkitConfigurationAdapter.config().save(configFile); + } catch (Exception e) { + logger.severe("Could not create default config file! This is (probably) a bug."); + logger.severe("Error message: " + e.getMessage()); + logger.severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + logger.severe(element.toString()); + } + } + return; + } + // Update the config if necessary + try { + YamlConfiguration existingYamlConfig = YamlConfiguration.loadConfiguration(configFile); + ConfigurationAdapter existingConfig = new BukkitConfigurationAdapter(existingYamlConfig); + ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); + if (updatedConfig == null) { + return; + } + updatedConfig.config().save(configFile); + } catch (Exception e) { + logger.severe("Could not update config! This is (probably) a bug."); + logger.severe("Error message: " + e.getMessage()); + logger.severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + logger.severe(element.toString()); + } + } + } + +} \ No newline at end of file diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java similarity index 89% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java index 0bdf4db037..dc64330fde 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultedBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java @@ -7,12 +7,8 @@ import java.util.List; import java.util.Map; -/** - * Default config values for the plugin's config.yml file - */ -@SuppressWarnings("ClassEscapesDefinedScope") @ApiStatus.Internal -public class DefaultedBukkitConfig extends DefaultedConfig { +public class DefaultBukkitConfig extends DefaultConfig { public static final CommentedConfigOption USE_LATEST_NMS_VERSION = new CommentedConfigOption<>( new String[] { @@ -42,7 +38,7 @@ public class DefaultedBukkitConfig extends DefaultedConfig { "function which allows CommandAPI commands to be used in datapacks.", "If you set this to false, CommandAPI commands may not work inside datapacks after", "reloading datapacks." - }, false + }, true ); public static final CommentedConfigOption SKIP_RELOAD_DATAPACKS = new CommentedConfigOption<>( @@ -78,10 +74,10 @@ public class DefaultedBukkitConfig extends DefaultedConfig { }, new ArrayList<>() ); - private DefaultedBukkitConfig() { + private DefaultBukkitConfig() { } - public static DefaultedBukkitConfig createDefault() { + public static DefaultBukkitConfig createDefault() { Map> options = new LinkedHashMap<>(); options.put("verbose-outputs", VERBOSE_OUTPUTS); options.put("silent-logs", SILENT_LOGS); @@ -98,14 +94,14 @@ public static DefaultedBukkitConfig createDefault() { Map sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); - return DefaultedBukkitConfig.create( + return DefaultBukkitConfig.create( options, sections ); } - public static DefaultedBukkitConfig create(Map> options, Map sections) { - DefaultedBukkitConfig config = new DefaultedBukkitConfig(); + public static DefaultBukkitConfig create(Map> options, Map sections) { + DefaultBukkitConfig config = new DefaultBukkitConfig(); config.allOptions.putAll(options); config.allSections.putAll(sections); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 066b49c254..e3b0288df2 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -23,7 +23,7 @@ import dev.jorel.commandapi.config.BukkitConfigurationAdapter; import dev.jorel.commandapi.config.ConfigGenerator; import dev.jorel.commandapi.config.ConfigurationAdapter; -import dev.jorel.commandapi.config.DefaultedBukkitConfig; +import dev.jorel.commandapi.config.DefaultBukkitConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -140,7 +140,7 @@ public void onEnable() { } /** - * In contrast to the superclasses method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, + * In contrast to the superclass' method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, * this doesn't fail silently if the config.yml already exists but instead will update the config with * new values if available. *

@@ -149,40 +149,7 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); - ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultedBukkitConfig.createDefault()); - if (!getDataFolder().exists()) { - getDataFolder().mkdir(); - try { - ConfigurationAdapter bukkitConfigurationAdapter = new BukkitConfigurationAdapter(new YamlConfiguration()); - configGenerator.populateDefaultConfig(bukkitConfigurationAdapter); - bukkitConfigurationAdapter.config().save(configFile); - } catch (Exception e) { - getLogger().severe("Could not create default config file! This is (probably) a bug."); - getLogger().severe("Error message: " + e.getMessage()); - getLogger().severe("Stacktrace:"); - for (StackTraceElement element : e.getStackTrace()) { - getLogger().severe(element.toString()); - } - } - return; - } - // Update the config if necessary - try { - YamlConfiguration existingYamlConfig = YamlConfiguration.loadConfiguration(configFile); - ConfigurationAdapter existingConfig = new BukkitConfigurationAdapter(existingYamlConfig); - ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); - if (updatedConfig == null) { - return; - } - updatedConfig.config().save(configFile); - } catch (Exception e) { - getLogger().severe("Could not update config! This is (probably) a bug."); - getLogger().severe("Error message: " + e.getMessage()); - getLogger().severe("Stacktrace:"); - for (StackTraceElement element : e.getStackTrace()) { - getLogger().severe(element.toString()); - } - } + new BukkitConfigurationAdapter(null).saveDefaultConfig(getDataFolder(), configFile, getLogger()); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 14be512bb0..0e24913283 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -21,7 +21,6 @@ package dev.jorel.commandapi; import java.io.File; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,7 +29,7 @@ import dev.jorel.commandapi.config.BukkitConfigurationAdapter; import dev.jorel.commandapi.config.ConfigGenerator; import dev.jorel.commandapi.config.ConfigurationAdapter; -import dev.jorel.commandapi.config.DefaultedBukkitConfig; +import dev.jorel.commandapi.config.DefaultBukkitConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -141,7 +140,7 @@ public void onEnable() { } /** - * In contrast to the superclasses method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, + * In contrast to the superclass' method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, * this doesn't fail silently if the config.yml already exists but instead will update the config with * new values if available. *

@@ -150,39 +149,6 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); - ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultedBukkitConfig.createDefault()); - if (!getDataFolder().exists()) { - getDataFolder().mkdir(); - try { - ConfigurationAdapter bukkitConfigurationAdapter = new BukkitConfigurationAdapter(new YamlConfiguration()); - configGenerator.populateDefaultConfig(bukkitConfigurationAdapter); - bukkitConfigurationAdapter.config().save(configFile); - } catch (Exception e) { - getLogger().severe("Could not create default config file! This is (probably) a bug."); - getLogger().severe("Error message: " + e.getMessage()); - getLogger().severe("Stacktrace:"); - for (StackTraceElement element : e.getStackTrace()) { - getLogger().severe(element.toString()); - } - } - return; - } - // Update the config if necessary - try { - YamlConfiguration existingYamlConfig = YamlConfiguration.loadConfiguration(configFile); - ConfigurationAdapter existingConfig = new BukkitConfigurationAdapter(existingYamlConfig); - ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); - if (updatedConfig == null) { - return; - } - updatedConfig.config().save(configFile); - } catch (Exception e) { - getLogger().severe("Could not update config! This is (probably) a bug."); - getLogger().severe("Error message: " + e.getMessage()); - getLogger().severe("Stacktrace:"); - for (StackTraceElement element : e.getStackTrace()) { - getLogger().severe(element.toString()); - } - } + new BukkitConfigurationAdapter(null).saveDefaultConfig(getDataFolder(), configFile, getLogger()); } } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 8f5c838f2e..ea55a8e6c0 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -10,7 +10,7 @@ import com.velocitypowered.api.proxy.ProxyServer; import dev.jorel.commandapi.config.ConfigGenerator; import dev.jorel.commandapi.config.ConfigurationAdapter; -import dev.jorel.commandapi.config.DefaultedVelocityConfig; +import dev.jorel.commandapi.config.DefaultVelocityConfig; import dev.jorel.commandapi.config.VelocityConfigurationAdapter; import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurationNode; @@ -44,34 +44,10 @@ public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dat .path(configFile) .build(); + new VelocityConfigurationAdapter(null, null).saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); + // If the config doesn't exist, load it from the resources - ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultedVelocityConfig.createDefault()); - if (!Files.exists(configFile)) { - try { - Files.createDirectories(configFile.getParent()); - } catch (IOException ignored) { - } - try { - ConfigurationAdapter velocityConfigurationAdapter = new VelocityConfigurationAdapter(loader, loader.createNode()); - configGenerator.populateDefaultConfig(velocityConfigurationAdapter); - loader.save(velocityConfigurationAdapter.config()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } else { - try { - // If the config does exist, update it if necessary - CommentedConfigurationNode existingYamlConfig = loader.load(); - ConfigurationAdapter existingConfig = new VelocityConfigurationAdapter(loader, existingYamlConfig); - ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); - if (updatedConfig != null) { - loader.save(updatedConfig.config()); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } // Load the file as a yaml node ConfigurationNode configYAML; diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java similarity index 59% rename from commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java rename to commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java index 1608f2edf0..ebe7af72c7 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultedVelocityConfig.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java @@ -3,12 +3,11 @@ import java.util.LinkedHashMap; import java.util.Map; -@SuppressWarnings("ClassEscapesDefinedScope") -public class DefaultedVelocityConfig extends DefaultedConfig { +public class DefaultVelocityConfig extends DefaultConfig { - private DefaultedVelocityConfig() {} + private DefaultVelocityConfig() {} - public static DefaultedVelocityConfig createDefault() { + public static DefaultVelocityConfig createDefault() { Map> options = new LinkedHashMap<>(); options.put("verbose-outputs", VERBOSE_OUTPUTS); options.put("silent-logs", SILENT_LOGS); @@ -18,14 +17,14 @@ public static DefaultedVelocityConfig createDefault() { Map sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); - return DefaultedVelocityConfig.create( + return DefaultVelocityConfig.create( options, sections ); } - public static DefaultedVelocityConfig create(Map> options, Map sections) { - DefaultedVelocityConfig config = new DefaultedVelocityConfig(); + public static DefaultVelocityConfig create(Map> options, Map sections) { + DefaultVelocityConfig config = new DefaultVelocityConfig(); config.allOptions.putAll(options); config.allSections.putAll(sections); diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 379a47f4b2..26ad2ec3de 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -3,36 +3,47 @@ import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.yaml.NodeStyle; import org.spongepowered.configurate.yaml.YamlConfigurationLoader; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.logging.Logger; -@SuppressWarnings("ConfusingArgumentToVarargsMethod") -public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config) implements ConfigurationAdapter { +public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config) implements ConfigurationAdapter { @Override public void setValue(String key, Object value) { - setValue0(key, value); + try { + node(key).set(value); + } catch (SerializationException e) { + e.printStackTrace(System.err); + } } @Override public void setComment(String key, String[] comment) { - config.node(key.split("\\.")).comment(String.join("\n", comment)); } @Override public Object getValue(String key) { - return getValue0(key); + try { + return node(key).get(Object.class); + } catch (SerializationException e) { + e.printStackTrace(System.err); + return null; + } } - @SuppressWarnings("DataFlowIssue") @Override public String[] getComment(String key) { - return config.node(key.split("\\.")).comment().split("\n"); + return new String[0]; } @Override @@ -46,11 +57,11 @@ public Set getKeys() { @Override public boolean contains(String key) { - return !config.node(key.split("\\.")).virtual(); + return !node(key).virtual(); } @Override - public void tryCreateSection(String key, DefaultedVelocityConfig defaultedVelocityConfig) { + public void tryCreateSection(String key, DefaultConfig defaultedVelocityConfig) { if (!key.contains(".")) { return; } @@ -64,8 +75,8 @@ public void tryCreateSection(String key, DefaultedVelocityConfig defaultedVeloci } else { pathSoFar.append(".").append(section); } - if (config.node(pathSoFar.toString().split("\\.")).comment() == null) { - config.node(pathSoFar.toString().split("\\.")).comment(String.join("\n", defaultedVelocityConfig.getAllSections().get(pathSoFar.toString()).comment())); + if (node(pathSoFar.toString()).comment() == null) { + node(pathSoFar.toString()).comment(String.join("\n", defaultedVelocityConfig.getAllSections().get(pathSoFar.toString()).comment())); } } } @@ -76,30 +87,50 @@ public CommentedConfigurationNode config() { } @Override - public ConfigurationAdapter complete() { + public ConfigurationAdapter complete() { return this; } @Override - public ConfigurationAdapter createNew() { + public ConfigurationAdapter createNew() { return new VelocityConfigurationAdapter(loader, loader.createNode()); } - private void setValue0(String key, Object value) { - try { - config.node(key.split("\\.")).set(value); - } catch (SerializationException e) { - e.printStackTrace(System.err); + @Override + public void saveDefaultConfig(File directory, File configFile, Logger logger) { + YamlConfigurationLoader configLoader = YamlConfigurationLoader.builder() + .nodeStyle(NodeStyle.BLOCK) + .file(configFile) + .build(); + ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultVelocityConfig.createDefault()); + if (!directory.exists()) { + directory.mkdirs(); + + try { + ConfigurationAdapter velocityConfigurationAdapter = new VelocityConfigurationAdapter(configLoader, configLoader.createNode()); + configGenerator.populateDefaultConfig(velocityConfigurationAdapter); + configLoader.save(velocityConfigurationAdapter.config()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + try { + // If the config does exist, update it if necessary + CommentedConfigurationNode existingYamlConfig = configLoader.load(); + ConfigurationAdapter existingConfig = new VelocityConfigurationAdapter(configLoader, existingYamlConfig); + ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); + if (updatedConfig != null) { + configLoader.save(updatedConfig.config()); + } + } catch (IOException e) { + throw new RuntimeException(e); + } } } - private Object getValue0(String key) { - try { - return config.node(key.split("\\.")).get(Object.class); - } catch (SerializationException e) { - e.printStackTrace(System.err); - return null; - } + @SuppressWarnings("ConfusingArgumentToVarargsMethod") + private CommentedConfigurationNode node(String path) { + return config.node(path.split("\\.")); } } From 25b040e03233572141df2270cbd43a7cd939d6c7 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:53:07 +0200 Subject: [PATCH 14/26] Fix defaults in config.md --- docssrc/src/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docssrc/src/config.md b/docssrc/src/config.md index d759819a70..0adc184a1e 100644 --- a/docssrc/src/config.md +++ b/docssrc/src/config.md @@ -55,7 +55,7 @@ be-lenient-for-minor-versions: false # function which allows CommandAPI commands to be used in datapacks. # If you set this to false, CommandAPI commands may not work inside datapacks after # reloading datapacks. -hook-paper-reload: false +hook-paper-reload: true # Skips the initial datapack reload when the server loads (default: false) # If "true", the CommandAPI will not reload datapacks when the server has finished From 7d2ef1eaa9a123bb379d2e153595aaec6094ae54 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 23 Sep 2024 15:58:11 +0200 Subject: [PATCH 15/26] Simplify a thing --- .../dev/jorel/commandapi/config/ConfigGenerator.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index ace243b503..77820bf1d0 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -77,14 +77,7 @@ private boolean shouldRemoveOptions(ConfigurationAdapter config) { Set configOptions = config.getKeys(); Set defaultConfigOptions = defaultConfig.getAllOptions().keySet(); - boolean shouldRemoveOptions = false; - for (String option : configOptions) { - if (!defaultConfigOptions.contains(option)) { - shouldRemoveOptions = true; - break; - } - } - return shouldRemoveOptions; + return !defaultConfigOptions.containsAll(configOptions); } } From beeca43647e9abab2281e0a2b80ddf9c128edac0 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:15:27 +0200 Subject: [PATCH 16/26] Fix VelocityConfigurationAdapter#getKeys() --- .../config/VelocityConfigurationAdapter.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 26ad2ec3de..d1821b8f57 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -48,11 +48,7 @@ public String[] getComment(String key) { @Override public Set getKeys() { - Set keys = new HashSet<>(); - for (Object key : config.childrenMap().keySet()) { - keys.add((String) key); - } - return keys; + return new HashSet<>(nestedOptions(config)); } @Override @@ -133,4 +129,19 @@ private CommentedConfigurationNode node(String path) { return config.node(path.split("\\.")); } + private Set nestedOptions(ConfigurationNode node) { + Set keys = new HashSet<>(); + for (Object key : node.childrenMap().keySet()) { + ConfigurationNode nestedNode = node.childrenMap().get(key); + if (nestedNode.childrenMap().isEmpty()) { + keys.add((String) key); + } else { + for (String nestedKey : nestedOptions(nestedNode)) { + keys.add(key + "." + nestedKey); + } + } + } + return keys; + } + } From 32b7eedea9b94cb6ba5fcd965fd665bbb7677a9e Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:40:39 +0200 Subject: [PATCH 17/26] Don't update the Velocity config if not necessary --- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../config/VelocityConfigurationAdapter.java | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index ea55a8e6c0..3dbd56ea98 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -44,7 +44,7 @@ public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dat .path(configFile) .build(); - new VelocityConfigurationAdapter(null, null).saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); + new VelocityConfigurationAdapter(null, null, null).saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); // If the config doesn't exist, load it from the resources diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index d1821b8f57..41f674a15c 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -11,12 +11,14 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Logger; -public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config) implements ConfigurationAdapter { +public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config, DefaultVelocityConfig defaultVelocityConfig) implements ConfigurationAdapter { @Override public void setValue(String key, Object value) { @@ -43,7 +45,9 @@ public Object getValue(String key) { @Override public String[] getComment(String key) { - return new String[0]; + CommentedConfigOption option = defaultVelocityConfig.getAllOptions().get(key); + CommentedSection section = defaultVelocityConfig.getAllSections().get(key); + return option != null ? option.comment() : section.comment(); } @Override @@ -89,7 +93,7 @@ public ConfigurationAdapter complete() { @Override public ConfigurationAdapter createNew() { - return new VelocityConfigurationAdapter(loader, loader.createNode()); + return new VelocityConfigurationAdapter(loader, loader.createNode(), DefaultVelocityConfig.createDefault()); } @Override @@ -98,12 +102,13 @@ public void saveDefaultConfig(File directory, File configFile, Logger logger) { .nodeStyle(NodeStyle.BLOCK) .file(configFile) .build(); - ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultVelocityConfig.createDefault()); + DefaultVelocityConfig defaultConfig = DefaultVelocityConfig.createDefault(); + ConfigGenerator configGenerator = ConfigGenerator.createNew(defaultConfig); if (!directory.exists()) { directory.mkdirs(); try { - ConfigurationAdapter velocityConfigurationAdapter = new VelocityConfigurationAdapter(configLoader, configLoader.createNode()); + ConfigurationAdapter velocityConfigurationAdapter = new VelocityConfigurationAdapter(configLoader, configLoader.createNode(), defaultConfig); configGenerator.populateDefaultConfig(velocityConfigurationAdapter); configLoader.save(velocityConfigurationAdapter.config()); } catch (IOException e) { @@ -113,7 +118,7 @@ public void saveDefaultConfig(File directory, File configFile, Logger logger) { try { // If the config does exist, update it if necessary CommentedConfigurationNode existingYamlConfig = configLoader.load(); - ConfigurationAdapter existingConfig = new VelocityConfigurationAdapter(configLoader, existingYamlConfig); + ConfigurationAdapter existingConfig = new VelocityConfigurationAdapter(configLoader, existingYamlConfig, defaultConfig); ConfigurationAdapter updatedConfig = configGenerator.generateWithNewValues(existingConfig); if (updatedConfig != null) { configLoader.save(updatedConfig.config()); From e1c35d7d43e955ae0490a53da27366f7f47f269e Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:16:23 +0200 Subject: [PATCH 18/26] Clean up Velocity plugin class --- .../java/dev/jorel/commandapi/CommandAPIMain.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 3dbd56ea98..976f0a91ac 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -39,19 +39,17 @@ public class CommandAPIMain { public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { // Try to find the config file Path configFile = dataDirectory.resolve("config.yml"); - YamlConfigurationLoader loader = YamlConfigurationLoader.builder() - .nodeStyle(NodeStyle.BLOCK) - .path(configFile) - .build(); + // Create or update config new VelocityConfigurationAdapter(null, null, null).saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); - // If the config doesn't exist, load it from the resources - - // Load the file as a yaml node ConfigurationNode configYAML; try { + YamlConfigurationLoader loader = YamlConfigurationLoader.builder() + .nodeStyle(NodeStyle.BLOCK) + .path(configFile) + .build(); configYAML = loader.load(); } catch (IOException e) { throw new RuntimeException(e); From be6dfa38897202da15da71c056faadc8f7dd9335 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:51:52 +0200 Subject: [PATCH 19/26] Create static method to create a dummy instance --- .../config/BukkitConfigurationAdapter.java | 4 ++++ .../dev/jorel/commandapi/CommandAPIMain.java | 6 +----- .../dev/jorel/commandapi/CommandAPIMain.java | 18 +++++++----------- .../dev/jorel/commandapi/CommandAPIMain.java | 7 +------ .../config/VelocityConfigurationAdapter.java | 7 ++++--- 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java index c247cdd958..d330ba7708 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -17,6 +17,10 @@ @ApiStatus.Internal public record BukkitConfigurationAdapter(YamlConfiguration config) implements ConfigurationAdapter { + public static BukkitConfigurationAdapter createDummyInstance() { + return new BukkitConfigurationAdapter(null); + } + @Override public void setValue(String key, Object value) { config.set(key, value); diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index e3b0288df2..abc040c258 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -21,12 +21,8 @@ package dev.jorel.commandapi; import dev.jorel.commandapi.config.BukkitConfigurationAdapter; -import dev.jorel.commandapi.config.ConfigGenerator; -import dev.jorel.commandapi.config.ConfigurationAdapter; -import dev.jorel.commandapi.config.DefaultBukkitConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -149,7 +145,7 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); - new BukkitConfigurationAdapter(null).saveDefaultConfig(getDataFolder(), configFile, getLogger()); + BukkitConfigurationAdapter.createDummyInstance().saveDefaultConfig(getDataFolder(), configFile, getLogger()); } } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 0e24913283..55395579d0 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -20,23 +20,19 @@ *******************************************************************************/ package dev.jorel.commandapi; -import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import dev.jorel.commandapi.config.BukkitConfigurationAdapter; -import dev.jorel.commandapi.config.ConfigGenerator; -import dev.jorel.commandapi.config.ConfigurationAdapter; -import dev.jorel.commandapi.config.DefaultBukkitConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + /** * Main CommandAPI plugin entrypoint */ @@ -149,6 +145,6 @@ public void onEnable() { @Override public void saveDefaultConfig() { File configFile = new File(getDataFolder(), "config.yml"); - new BukkitConfigurationAdapter(null).saveDefaultConfig(getDataFolder(), configFile, getLogger()); + BukkitConfigurationAdapter.createDummyInstance().saveDefaultConfig(getDataFolder(), configFile, getLogger()); } } diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 976f0a91ac..2cdf9ba31d 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -8,18 +8,13 @@ import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; -import dev.jorel.commandapi.config.ConfigGenerator; -import dev.jorel.commandapi.config.ConfigurationAdapter; -import dev.jorel.commandapi.config.DefaultVelocityConfig; import dev.jorel.commandapi.config.VelocityConfigurationAdapter; -import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.yaml.NodeStyle; import org.spongepowered.configurate.yaml.YamlConfigurationLoader; import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.logging.Logger; @@ -41,7 +36,7 @@ public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dat Path configFile = dataDirectory.resolve("config.yml"); // Create or update config - new VelocityConfigurationAdapter(null, null, null).saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); + VelocityConfigurationAdapter.createDummyInstance().saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); // Load the file as a yaml node ConfigurationNode configYAML; diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 41f674a15c..a8dd6a8d67 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -8,18 +8,19 @@ import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.logging.Logger; public record VelocityConfigurationAdapter(YamlConfigurationLoader loader, CommentedConfigurationNode config, DefaultVelocityConfig defaultVelocityConfig) implements ConfigurationAdapter { + public static VelocityConfigurationAdapter createDummyInstance() { + return new VelocityConfigurationAdapter(null, null, null); + } + @Override public void setValue(String key, Object value) { try { From 0e0d2d5d37c30adc4c9e6aff57374a8466f14bdc Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:59:32 +0200 Subject: [PATCH 20/26] Remove Velocity config file --- .../src/main/resources/config.yml | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/resources/config.yml diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/resources/config.yml b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/resources/config.yml deleted file mode 100644 index 38da46fdaa..0000000000 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/resources/config.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# Logging # -################################################################################ - -# Verbose outputs (default: false) -# If "true", outputs command registration and unregistration logs in the console -verbose-outputs: false - -# Silent logs (default: false) -# If "true", turns off all logging from the CommandAPI, except for errors. -silent-logs: false - -################################################################################ -# Messages # -################################################################################ - -# Messages -# Controls messages that the CommandAPI displays to players -messages: - - # Missing executor implementation (default: "This command has no implementations for %s") - # The message to display to senders when a command has no executor. Available - # parameters are: - # %s - the executor class (lowercase) - # %S - the executor class (normal case) - missing-executor-implementation: "This command has no implementations for %s" - -################################################################################ -# Debugging # -################################################################################ - -# Create dispatcher JSON (default: false) -# If "true", the CommandAPI creates a command_registration.json file showing the -# mapping of registered commands. This is designed to be used by developers - -# setting this to "false" will improve command registration performance. -create-dispatcher-json: false \ No newline at end of file From 26985206bc95dd734451c1375626a7ac4d8ff5a0 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Thu, 26 Sep 2024 13:48:43 +0200 Subject: [PATCH 21/26] Introduce common modules to not include config classes in API modules --- .../commandapi-bukkit-plugin-common/pom.xml | 74 +++++++++++++++++++ .../config/BukkitConfigurationAdapter.java | 2 - .../config/DefaultBukkitConfig.java | 3 - .../pom.xml | 5 ++ .../commandapi-bukkit-plugin/pom.xml | 5 ++ .../commandapi-bukkit/pom.xml | 3 + .../commandapi-velocity-plugin/pom.xml | 5 ++ commandapi-plugin/pom.xml | 50 +++++++++++++ .../config/CommentedConfigOption.java | 3 - .../commandapi/config/CommentedSection.java | 3 - .../commandapi/config/ConfigGenerator.java | 3 - .../config/ConfigurationAdapter.java | 3 - .../commandapi/config/DefaultConfig.java | 3 - pom.xml | 3 + 14 files changed, 145 insertions(+), 20 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml rename commandapi-platforms/commandapi-bukkit/{commandapi-bukkit-core => commandapi-bukkit-plugin-common}/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java (98%) rename commandapi-platforms/commandapi-bukkit/{commandapi-bukkit-core => commandapi-bukkit-plugin-common}/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java (98%) create mode 100644 commandapi-plugin/pom.xml rename {commandapi-core => commandapi-plugin}/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java (62%) rename {commandapi-core => commandapi-plugin}/src/main/java/dev/jorel/commandapi/config/CommentedSection.java (58%) rename {commandapi-core => commandapi-plugin}/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java (97%) rename {commandapi-core => commandapi-plugin}/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java (91%) rename {commandapi-core => commandapi-plugin}/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java (96%) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml new file mode 100644 index 0000000000..2312a824ed --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + dev.jorel + commandapi-bukkit + 9.6.0-SNAPSHOT + + + commandapi-bukkit-plugin-common + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -Xlint + + + + + org.jacoco + jacoco-maven-plugin + + + + default-prepare-agent + + prepare-agent + + + + + report + verify + + report + + + + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + io.papermc.paper + paper-api + 1.21.1-R0.1-SNAPSHOT + provided + + + dev.jorel + commandapi-plugin + ${project.version} + + + diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java similarity index 98% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java index d330ba7708..53668ffebd 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -3,7 +3,6 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; -import org.jetbrains.annotations.ApiStatus; import java.io.File; import java.util.ArrayList; @@ -14,7 +13,6 @@ import java.util.Set; import java.util.logging.Logger; -@ApiStatus.Internal public record BukkitConfigurationAdapter(YamlConfiguration config) implements ConfigurationAdapter { public static BukkitConfigurationAdapter createDummyInstance() { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java similarity index 98% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java index dc64330fde..21fd408658 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-core/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java @@ -1,13 +1,10 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@ApiStatus.Internal public class DefaultBukkitConfig extends DefaultConfig { public static final CommentedConfigOption USE_LATEST_NMS_VERSION = new CommentedConfigOption<>( diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/pom.xml index c34cb71f7e..bf0b595932 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/pom.xml @@ -85,6 +85,11 @@ ${paper.version} provided + + dev.jorel + commandapi-bukkit-plugin-common + ${project.version} + diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/pom.xml index b328d3984f..4e664d311a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/pom.xml @@ -78,6 +78,11 @@ ${paper.version} provided + + dev.jorel + commandapi-bukkit-plugin-common + ${project.version} + diff --git a/commandapi-platforms/commandapi-bukkit/pom.xml b/commandapi-platforms/commandapi-bukkit/pom.xml index 6f0d717809..c517e16a70 100644 --- a/commandapi-platforms/commandapi-bukkit/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/pom.xml @@ -24,6 +24,9 @@ commandapi-bukkit-vh commandapi-bukkit-mojang-mapped + + commandapi-bukkit-plugin-common + commandapi-bukkit-plugin commandapi-bukkit-shade diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/pom.xml b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/pom.xml index 4a4df888b3..bd946a75b9 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/pom.xml +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/pom.xml @@ -40,6 +40,11 @@ ${project.version} compile + + dev.jorel + commandapi-plugin + ${project.version} + diff --git a/commandapi-plugin/pom.xml b/commandapi-plugin/pom.xml new file mode 100644 index 0000000000..02e8f915a7 --- /dev/null +++ b/commandapi-plugin/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + dev.jorel + commandapi + 9.6.0-SNAPSHOT + + + commandapi-plugin + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -Xlint + + + + + org.jacoco + jacoco-maven-plugin + + + + default-prepare-agent + + prepare-agent + + + + + report + verify + + report + + + + + + + + diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java similarity index 62% rename from commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java rename to commandapi-plugin/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java index 36d73baf2d..fc14820fcb 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/CommentedConfigOption.java @@ -1,7 +1,4 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal public record CommentedConfigOption(String[] comment, T option) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/CommentedSection.java similarity index 58% rename from commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java rename to commandapi-plugin/src/main/java/dev/jorel/commandapi/config/CommentedSection.java index 70b99feb21..f30c43fa64 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/CommentedSection.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/CommentedSection.java @@ -1,7 +1,4 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal public record CommentedSection(String[] comment) { } diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java similarity index 97% rename from commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java rename to commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index 77820bf1d0..3b4b562016 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -1,12 +1,9 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - import java.util.Arrays; import java.util.Map; import java.util.Set; -@ApiStatus.Internal public class ConfigGenerator { private final DefaultConfig defaultConfig; diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java similarity index 91% rename from commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java rename to commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java index 953bb56925..88c171a30a 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java @@ -1,12 +1,9 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - import java.io.File; import java.util.Set; import java.util.logging.Logger; -@ApiStatus.Internal public interface ConfigurationAdapter { void setValue(String key, Object value); diff --git a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java similarity index 96% rename from commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java rename to commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java index d88d4eea4c..67216db0eb 100644 --- a/commandapi-core/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/DefaultConfig.java @@ -1,11 +1,8 @@ package dev.jorel.commandapi.config; -import org.jetbrains.annotations.ApiStatus; - import java.util.LinkedHashMap; import java.util.Map; -@ApiStatus.Internal public abstract class DefaultConfig { protected final Map> allOptions = new LinkedHashMap<>(); diff --git a/pom.xml b/pom.xml index bb76fa5e3d..0ef4604bf4 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,9 @@ commandapi-core + + commandapi-plugin + commandapi-platforms commandapi-kotlin From aa0d9778c442db72a350bdeaf82f58bdcfb27fc4 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sat, 28 Sep 2024 16:29:00 +0200 Subject: [PATCH 22/26] Remove unnecessary dependency --- commandapi-core/pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/commandapi-core/pom.xml b/commandapi-core/pom.xml index ca29abb284..379d3f2610 100644 --- a/commandapi-core/pom.xml +++ b/commandapi-core/pom.xml @@ -65,14 +65,6 @@ ${project.version} provided - - - - org.jetbrains - annotations - 24.1.0 - provided - From bff49cd3d0079d071e66f3b040f250e31f64afd5 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sat, 28 Sep 2024 16:40:43 +0200 Subject: [PATCH 23/26] Move more common classes into the common module --- .../commandapi-bukkit-plugin-common/pom.xml | 6 + .../jorel/commandapi/AdvancedConverter.java | 0 .../exceptions/InvalidNumberException.java | 0 .../exceptions/UnknownArgumentException.java | 0 .../jorel/commandapi/AdvancedConverter.java | 317 ------------------ .../exceptions/InvalidNumberException.java | 46 --- .../exceptions/UnknownArgumentException.java | 37 -- 7 files changed, 6 insertions(+), 400 deletions(-) rename commandapi-platforms/commandapi-bukkit/{commandapi-bukkit-plugin-mojang-mapped => commandapi-bukkit-plugin-common}/src/main/java/dev/jorel/commandapi/AdvancedConverter.java (100%) rename commandapi-platforms/commandapi-bukkit/{commandapi-bukkit-plugin-mojang-mapped => commandapi-bukkit-plugin-common}/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java (100%) rename commandapi-platforms/commandapi-bukkit/{commandapi-bukkit-plugin-mojang-mapped => commandapi-bukkit-plugin-common}/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java (100%) delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/AdvancedConverter.java delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml index 2312a824ed..1fa3606079 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/pom.xml @@ -70,5 +70,11 @@ commandapi-plugin ${project.version} + + dev.jorel + commandapi-bukkit-core + ${project.version} + provided + diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/AdvancedConverter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/AdvancedConverter.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/AdvancedConverter.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/AdvancedConverter.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/AdvancedConverter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/AdvancedConverter.java deleted file mode 100644 index ee37b92115..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/AdvancedConverter.java +++ /dev/null @@ -1,317 +0,0 @@ -/******************************************************************************* - * Copyright 2018, 2021 Jorel Ali (Skepter) - MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *******************************************************************************/ -package dev.jorel.commandapi; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.bukkit.plugin.java.JavaPlugin; - -import dev.jorel.commandapi.arguments.AdvancementArgument; -import dev.jorel.commandapi.arguments.AdventureChatArgument; -import dev.jorel.commandapi.arguments.AdventureChatComponentArgument; -import dev.jorel.commandapi.arguments.AngleArgument; -import dev.jorel.commandapi.arguments.Argument; -import dev.jorel.commandapi.arguments.AxisArgument; -import dev.jorel.commandapi.arguments.BiomeArgument; -import dev.jorel.commandapi.arguments.BlockPredicateArgument; -import dev.jorel.commandapi.arguments.BlockStateArgument; -import dev.jorel.commandapi.arguments.BooleanArgument; -import dev.jorel.commandapi.arguments.ChatArgument; -import dev.jorel.commandapi.arguments.ChatColorArgument; -import dev.jorel.commandapi.arguments.ChatComponentArgument; -import dev.jorel.commandapi.arguments.CommandAPIArgumentType; -import dev.jorel.commandapi.arguments.CommandArgument; -import dev.jorel.commandapi.arguments.DoubleArgument; -import dev.jorel.commandapi.arguments.EnchantmentArgument; -import dev.jorel.commandapi.arguments.EntitySelectorArgument; -import dev.jorel.commandapi.arguments.EntityTypeArgument; -import dev.jorel.commandapi.arguments.FloatArgument; -import dev.jorel.commandapi.arguments.FloatRangeArgument; -import dev.jorel.commandapi.arguments.FunctionArgument; -import dev.jorel.commandapi.arguments.GreedyStringArgument; -import dev.jorel.commandapi.arguments.IntegerArgument; -import dev.jorel.commandapi.arguments.IntegerRangeArgument; -import dev.jorel.commandapi.arguments.ItemStackArgument; -import dev.jorel.commandapi.arguments.ItemStackPredicateArgument; -import dev.jorel.commandapi.arguments.Location2DArgument; -import dev.jorel.commandapi.arguments.LocationArgument; -import dev.jorel.commandapi.arguments.LocationType; -import dev.jorel.commandapi.arguments.LongArgument; -import dev.jorel.commandapi.arguments.LootTableArgument; -import dev.jorel.commandapi.arguments.MathOperationArgument; -import dev.jorel.commandapi.arguments.MultiLiteralArgument; -import dev.jorel.commandapi.arguments.NBTCompoundArgument; -import dev.jorel.commandapi.arguments.NamespacedKeyArgument; -import dev.jorel.commandapi.arguments.ObjectiveArgument; -import dev.jorel.commandapi.arguments.ObjectiveCriteriaArgument; -import dev.jorel.commandapi.arguments.OfflinePlayerArgument; -import dev.jorel.commandapi.arguments.ParticleArgument; -import dev.jorel.commandapi.arguments.PlayerArgument; -import dev.jorel.commandapi.arguments.PotionEffectArgument; -import dev.jorel.commandapi.arguments.RecipeArgument; -import dev.jorel.commandapi.arguments.RotationArgument; -import dev.jorel.commandapi.arguments.ScoreHolderArgument; -import dev.jorel.commandapi.arguments.ScoreboardSlotArgument; -import dev.jorel.commandapi.arguments.SoundArgument; -import dev.jorel.commandapi.arguments.StringArgument; -import dev.jorel.commandapi.arguments.TeamArgument; -import dev.jorel.commandapi.arguments.TextArgument; -import dev.jorel.commandapi.arguments.TimeArgument; -import dev.jorel.commandapi.arguments.UUIDArgument; -import dev.jorel.commandapi.exceptions.InvalidNumberException; -import dev.jorel.commandapi.exceptions.UnknownArgumentException; - -/** - * A command parsing system that converts string arguments into something way - * more useful - */ -class AdvancedConverter { - - /** - * Pattern for arguments, which are of the form {@code [type]} - *

    - *
  • {@code node_name} is a standard node name.
  • - *
  • {@code type} is either a namespaced key representing the argument - * (described in {@code conversionforownerssingleargs.md} in the main - * documentation), or a numerical range of the form {@code n..n}, {@code ..n} or - * {@code n..} where {@code n} is a constant integer or floating point - * number
  • - *
- */ - private static final Pattern ARGUMENT_PATTERN = Pattern.compile("<(\\w+)>\\[([a-z:_]+|(?:[0-9\\.]+)?\\.\\.(?:[0-9\\.]+)?)\\]"); - - /** - * Pattern for literal, of the form {@code (node_name)}. It also supports - * multiple node names of the form - * {@code (node_name_1|node_name_2|...|node_name_n)} - */ - private static final Pattern LITERAL_PATTERN = Pattern.compile("\\(\\w+(\\|\\w+)*+\\)"); - - private final JavaPlugin plugin; - private final String command; - private int argumentIndex = 1; - - public AdvancedConverter(JavaPlugin plugin, String command) { - this.plugin = plugin; - this.command = command; - } - - public AdvancedConverter(String command) { - this.plugin = null; - this.command = command; - } - - public void convert() { - String commandName = command.split(" ")[0]; - List> arguments; - try { - arguments = parseArguments(command); - } catch (UnknownArgumentException | InvalidNumberException e) { - CommandAPI.logError(e.getMessage()); - return; - } - if (arguments.isEmpty()) { - Converter.convert(plugin, commandName); - } else { - Converter.convert(plugin, commandName, arguments); - } - - } - - public void convertCommand() { - String commandName = command.split(" ")[0]; - List> arguments; - try { - arguments = parseArguments(command); - } catch (UnknownArgumentException | InvalidNumberException e) { - CommandAPI.logError(e.getMessage()); - return; - } - if (arguments.isEmpty()) { - Converter.convert(commandName); - } else { - Converter.convert(commandName, arguments); - } - } - - /** - *
-	 * plugins-to-convert: 
-	 *   - Essentials: 
-	 *     - speed [0..10]
-	 *     - speed [minecraft:game_profile]
-	 *     - speed (walk|fly) [0..10]
-	 *     - speed (walk|fly) [0..10] [minecraft:game_profile]
-	 * 
- */ - private List> parseArguments(String command) throws UnknownArgumentException, InvalidNumberException { - List> arguments = new ArrayList<>(); - String[] parts = command.split(" "); - for (argumentIndex = 1; argumentIndex < parts.length; argumentIndex++) { - arguments.add(parseArgument(parts[argumentIndex])); - } - return arguments; - } - - private boolean isRangeAnInteger(double value) { - return value == (long) value; - } - - private double parseValue(String bound) throws InvalidNumberException { - try { - return Double.parseDouble(bound); - } catch (NumberFormatException e) { - throw new InvalidNumberException(bound, command, argumentIndex); - } - } - - private Argument parseRange(String nodeName, String[] bounds) throws InvalidNumberException { - if (bounds.length == 1) { - // x.. - double value = parseValue(bounds[0]); - if (isRangeAnInteger(value)) { - return new LongArgument(nodeName, (long) value); - } else { - return new DoubleArgument(nodeName, value); - } - } else if (bounds[0].length() == 0) { - // ..x - double value = parseValue(bounds[1]); - if (isRangeAnInteger(value)) { - return new LongArgument(nodeName, Long.MIN_VALUE, (long) value); - } else { - return new DoubleArgument(nodeName, -Double.MAX_VALUE, value); - } - } else { - // x..x - double value0 = parseValue(bounds[0]); - double value1 = parseValue(bounds[1]); - if (!isRangeAnInteger(value0) || !isRangeAnInteger(value1)) { - return new DoubleArgument(nodeName, value0, value1); - } else { - return new LongArgument(nodeName, (long) value0, (long) value1); - } - } - } - - /* - * CodeFactor will always complain about this method because it's really bulky - * and adding a generator (i.e. Function>) inside the - * CommandAPIArgumentType class would be better, EXCEPT in practice, this is - * worse because then CommandAPIArgumentType would have to depend on every - * argument and every argument depends on CommandAPIArgumentType, so that would - * mean every argument would always have to be packaged in the CommandAPI - jar - * minimisation wouldn't be able to minimise this as best as it could. - * - * Additionally, we only need this for the plugin version of the CommandAPI, not - * the main API. - */ - @SuppressWarnings("rawtypes") - private Argument parseDefinedArgumentType(String argumentType, String nodeName) throws UnknownArgumentException { - return switch (CommandAPIArgumentType.fromInternal(argumentType)) { - case ADVANCEMENT -> new AdvancementArgument(nodeName); - case ADVENTURE_CHAT -> new AdventureChatArgument(nodeName); - case ADVENTURE_CHAT_COMPONENT -> new AdventureChatComponentArgument(nodeName); - case ANGLE -> new AngleArgument(nodeName); - case AXIS -> new AxisArgument(nodeName); - case BIOME -> new BiomeArgument(nodeName); - case BLOCKSTATE -> new BlockStateArgument(nodeName); - case BLOCK_PREDICATE -> new BlockPredicateArgument(nodeName); - case CHAT -> new ChatArgument(nodeName); - case CHATCOLOR -> new ChatColorArgument(nodeName); - case CHAT_COMPONENT -> new ChatComponentArgument(nodeName); - case COMMAND -> new CommandArgument(nodeName); - case ENCHANTMENT -> new EnchantmentArgument(nodeName); - case ENTITY_SELECTOR -> new EntitySelectorArgument.OneEntity(nodeName); - case ENTITY_TYPE -> new EntityTypeArgument(nodeName); - case FLOAT_RANGE -> new FloatRangeArgument(nodeName); - case FUNCTION -> new FunctionArgument(nodeName); - case INT_RANGE -> new IntegerRangeArgument(nodeName); - case ITEMSTACK -> new ItemStackArgument(nodeName); - case ITEMSTACK_PREDICATE -> new ItemStackPredicateArgument(nodeName); - case LOCATION -> new LocationArgument(nodeName, LocationType.BLOCK_POSITION); - case LOCATION_2D -> new Location2DArgument(nodeName, LocationType.BLOCK_POSITION); - case LOOT_TABLE -> new LootTableArgument(nodeName); - case MATH_OPERATION -> new MathOperationArgument(nodeName); - case NAMESPACED_KEY -> new NamespacedKeyArgument(nodeName); - case NBT_COMPOUND -> new NBTCompoundArgument(nodeName); - case OBJECTIVE -> new ObjectiveArgument(nodeName); - case OBJECTIVE_CRITERIA -> new ObjectiveCriteriaArgument(nodeName); - case OFFLINE_PLAYER -> new OfflinePlayerArgument(nodeName); - case PARTICLE -> new ParticleArgument(nodeName); - case PLAYER -> new PlayerArgument(nodeName); - case POTION_EFFECT -> new PotionEffectArgument(nodeName); - case RECIPE -> new RecipeArgument(nodeName); - case ROTATION -> new RotationArgument(nodeName); - case SCOREBOARD_SLOT -> new ScoreboardSlotArgument(nodeName); - case SCORE_HOLDER -> new ScoreHolderArgument.Single(nodeName); - case SOUND -> new SoundArgument(nodeName); - case TEAM -> new TeamArgument(nodeName); - case TIME -> new TimeArgument(nodeName); - case UUID -> new UUIDArgument(nodeName); - case PRIMITIVE_BOOLEAN -> new BooleanArgument(nodeName); - case PRIMITIVE_DOUBLE -> new DoubleArgument(nodeName); - case PRIMITIVE_FLOAT -> new FloatArgument(nodeName); - case PRIMITIVE_GREEDY_STRING -> new GreedyStringArgument(nodeName); - case PRIMITIVE_INTEGER -> new IntegerArgument(nodeName); - case PRIMITIVE_LONG -> new LongArgument(nodeName); - case PRIMITIVE_STRING -> new StringArgument(nodeName); - case PRIMITIVE_TEXT -> new TextArgument(nodeName); - case LITERAL, MULTI_LITERAL, CUSTOM -> throw new UnknownArgumentException(argumentType); - default -> throw new UnknownArgumentException(argumentType); - }; - } - - private Argument parseArgument(String argument) throws UnknownArgumentException, InvalidNumberException { - Matcher literalMatcher = LITERAL_PATTERN.matcher(argument); - Matcher argumentMatcher = ARGUMENT_PATTERN.matcher(argument); - if (literalMatcher.matches()) { - // Parse literals - return new MultiLiteralArgument("literals", literalMatcher.group().substring(1, literalMatcher.group().length() - 1).split("\\|")); - } else if (argumentMatcher.matches()) { - // Parse arguments - String nodeName = argumentMatcher.group(1); - String argumentType = argumentMatcher.group(2); - - if (argumentType.contains("..")) { - // Parse ranges - return parseRange(nodeName, argumentType.split("\\.\\.")); - } else { - // We have a few edge cases to handle - return switch (argumentType) { - case "api:entity" -> new EntitySelectorArgument.OneEntity(nodeName); - case "api:entities" -> new EntitySelectorArgument.ManyEntities(nodeName); - case "api:player" -> new EntitySelectorArgument.OnePlayer(nodeName); - case "api:players" -> new EntitySelectorArgument.ManyPlayers(nodeName); - case "minecraft:vec3" -> new LocationArgument(nodeName, LocationType.PRECISE_POSITION); - case "minecraft:vec2" -> new Location2DArgument(nodeName, LocationType.PRECISE_POSITION); - default -> parseDefinedArgumentType(argumentType, nodeName); - }; - } - } else { - throw new UnknownArgumentException(argument); - } - } - -} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java deleted file mode 100644 index 5f7e7417a1..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/InvalidNumberException.java +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* - * Copyright 2018, 2020 Jorel Ali (Skepter) - MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *******************************************************************************/ -package dev.jorel.commandapi.exceptions; - -/** - * An exception caused when a number is not a number - */ -@SuppressWarnings("serial") -public class InvalidNumberException extends Exception { - - /** - * An exception caused when a number is not a number - * @param input the full command input - * @param command the name of the command - * @param index the index where the number was invalid - */ - public InvalidNumberException(String input, String command, int index) { - super(format(input, command, index)); - } - - private static String format(String input, String command, int index) { - String[] parts = command.split(" "); - parts[index] = parts[index] + "<--[HERE]"; - return "Invalid number found in command '" + String.join(" ", parts) + - "': '" + input + "' is not a valid number!"; - } - -} diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java deleted file mode 100644 index 1038f8ca81..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/exceptions/UnknownArgumentException.java +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************************* - * Copyright 2018, 2020 Jorel Ali (Skepter) - MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *******************************************************************************/ -package dev.jorel.commandapi.exceptions; - -/** - * An exception caused when an unknown argument type is provided - */ -@SuppressWarnings("serial") -public class UnknownArgumentException extends Exception { - - /** - * An exception caused when an unknown argument type is provided - * @param argument the argument that wasn't recognised - */ - public UnknownArgumentException(String argument) { - super("The argument type '" + argument + "' is not recognized!"); - } - -} From 677d54585051160e073b1c5971166836cca0dba5 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:25:15 +0200 Subject: [PATCH 24/26] Inline some stuff --- .../dev/jorel/commandapi/config/DefaultBukkitConfig.java | 5 +---- .../dev/jorel/commandapi/config/DefaultVelocityConfig.java | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java index 21fd408658..fb4a8e4011 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/DefaultBukkitConfig.java @@ -91,10 +91,7 @@ public static DefaultBukkitConfig createDefault() { Map sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); - return DefaultBukkitConfig.create( - options, - sections - ); + return DefaultBukkitConfig.create(options, sections); } public static DefaultBukkitConfig create(Map> options, Map sections) { diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java index ebe7af72c7..99ad76b490 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/DefaultVelocityConfig.java @@ -17,10 +17,7 @@ public static DefaultVelocityConfig createDefault() { Map sections = new LinkedHashMap<>(); sections.put("messages", SECTION_MESSAGE); - return DefaultVelocityConfig.create( - options, - sections - ); + return DefaultVelocityConfig.create(options, sections); } public static DefaultVelocityConfig create(Map> options, Map sections) { From f66e16cbaa2058df7055a35a7955306920adb017 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 7 Oct 2024 06:59:31 +0200 Subject: [PATCH 25/26] Address code review --- .../dev/jorel/commandapi/CommandAPIMain.java | 0 .../config/BukkitConfigurationAdapter.java | 17 +- .../dev/jorel/commandapi/CommandAPIMain.java | 150 ------------------ .../config/VelocityConfigurationAdapter.java | 29 ++-- .../commandapi/config/ConfigGenerator.java | 6 +- .../config/ConfigurationAdapter.java | 2 +- 6 files changed, 18 insertions(+), 186 deletions(-) rename commandapi-platforms/commandapi-bukkit/{commandapi-bukkit-plugin-mojang-mapped => commandapi-bukkit-plugin-common}/src/main/java/dev/jorel/commandapi/CommandAPIMain.java (100%) delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/CommandAPIMain.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-mojang-mapped/src/main/java/dev/jorel/commandapi/CommandAPIMain.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/CommandAPIMain.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java index 53668ffebd..8e4a477b50 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -54,39 +54,30 @@ public boolean contains(String key) { } @Override - public void tryCreateSection(String key, DefaultConfig defaultedBukkitConfig) { + public void tryCreateSection(String key) { if (!key.contains(".")) { return; } // Collect config keys - Set keys = getKeys(); + Set keys = config.getKeys(true); keys.removeIf(k -> !config.isConfigurationSection(k)); // Collect sections - String[] paths = key.split("\\."); - List sectionCandidates = new ArrayList<>(Arrays.asList(paths).subList(0, paths.length - 1)); + String[] sectionCandidates = key.split("\\."); + sectionCandidates = Arrays.copyOf(sectionCandidates, sectionCandidates.length - 1); // Create new sections ConfigurationSection section = null; - StringBuilder pathSoFar = new StringBuilder(); for (String sectionCandidate : sectionCandidates) { - if (pathSoFar.isEmpty()) { - pathSoFar.append(sectionCandidate); - } else { - pathSoFar.append(".").append(sectionCandidate); - } - if (keys.contains(sectionCandidate) && section == null) { section = config.getConfigurationSection(sectionCandidate); } else if (section == null) { section = config.createSection(sectionCandidate); - config.setComments(pathSoFar.toString(), Arrays.asList(defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment())); } else { ConfigurationSection currentSection = section.getConfigurationSection(sectionCandidate); if (currentSection == null) { section = section.createSection(sectionCandidate); - config.setComments(pathSoFar.toString(), Arrays.asList(defaultedBukkitConfig.getAllSections().get(pathSoFar.toString()).comment())); } else { section = currentSection; } diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java deleted file mode 100644 index 55395579d0..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ /dev/null @@ -1,150 +0,0 @@ -/******************************************************************************* - * Copyright 2018, 2021 Jorel Ali (Skepter) - MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - *******************************************************************************/ -package dev.jorel.commandapi; - -import dev.jorel.commandapi.config.BukkitConfigurationAdapter; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.plugin.InvalidPluginException; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * Main CommandAPI plugin entrypoint - */ -public class CommandAPIMain extends JavaPlugin { - - private static final String PLUGINS_TO_CONVERT = "plugins-to-convert"; - - @Override - public void onLoad() { - // Read config file - saveDefaultConfig(); - FileConfiguration fileConfig = getConfig(); - CommandAPIBukkitConfig config = new CommandAPIBukkitConfig(this) - .verboseOutput(fileConfig.getBoolean("verbose-outputs")) - .silentLogs(fileConfig.getBoolean("silent-logs")) - .useLatestNMSVersion(fileConfig.getBoolean("use-latest-nms-version")) - .missingExecutorImplementationMessage(fileConfig.getString("messages.missing-executor-implementation")) - .dispatcherFile(fileConfig.getBoolean("create-dispatcher-json") ? new File(getDataFolder(), "command_registration.json") : null) - .shouldHookPaperReload(fileConfig.getBoolean("hook-paper-reload")) - .skipReloadDatapacks(fileConfig.getBoolean("skip-initial-datapack-reload")) - .beLenientForMinorVersions(fileConfig.getBoolean("be-lenient-for-minor-versions")); - - for (String pluginName : fileConfig.getStringList("skip-sender-proxy")) { - if (Bukkit.getPluginManager().getPlugin(pluginName) != null) { - config.addSkipSenderProxy(pluginName); - } else { - new InvalidPluginException("Could not find a plugin " + pluginName + "! Has it been loaded properly?") - .printStackTrace(); - } - } - - // Main CommandAPI loading - CommandAPI.setLogger(CommandAPILogger.fromJavaLogger(getLogger())); - CommandAPI.onLoad(config); - - // Convert all plugins to be converted - if (!fileConfig.getList(PLUGINS_TO_CONVERT).isEmpty() - && fileConfig.getMapList(PLUGINS_TO_CONVERT).isEmpty()) { - CommandAPI.logError("plugins-to-convert has an invalid type. Did you miss a colon (:) after a plugin name?"); - } - - convertCommands(fileConfig); - } - - private void convertCommands(FileConfiguration fileConfig) { - // Load all plugins at the same time - Map pluginsToConvert = new HashMap<>(); - for (Map map : fileConfig.getMapList(PLUGINS_TO_CONVERT)) { - String[] pluginCommands; - if (map.values().size() == 1 && map.values().iterator().next() == null) { - pluginCommands = new String[0]; - } else { - @SuppressWarnings("unchecked") - List commands = (List) map.values().iterator().next(); - pluginCommands = commands.toArray(new String[0]); - } - - // Get the plugin, if it doesn't exist, scream in the console (but - // don't crash, we want to continue!) - final JavaPlugin plugin = getAndValidatePlugin((String) map.keySet().iterator().next()); - if (plugin != null) { - pluginsToConvert.put(plugin, pluginCommands); - } - } - - // Convert plugin commands - for (Entry pluginToConvert : pluginsToConvert.entrySet()) { - if (pluginToConvert.getValue().length == 0) { - Converter.convert(pluginToConvert.getKey()); - } else { - for (String command : pluginToConvert.getValue()) { - new AdvancedConverter(pluginToConvert.getKey(), command).convert(); - } - } - } - - // Convert all arbitrary commands - for (String commandName : fileConfig.getStringList("other-commands-to-convert")) { - new AdvancedConverter(commandName).convertCommand(); - } - } - - private JavaPlugin getAndValidatePlugin(String pluginName) { - Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName); - if (plugin != null) { - if (plugin instanceof JavaPlugin javaPlugin) { - return javaPlugin; - } else { - new InvalidPluginException("Plugin " + pluginName + " is not a JavaPlugin!").printStackTrace(); - } - } else { - new InvalidPluginException("Could not find a plugin " + pluginName + "! Has it been loaded properly?") - .printStackTrace(); - } - return null; - } - - @Override - public void onEnable() { - CommandAPI.onEnable(); - } - - /** - * In contrast to the superclass' method {@link org.bukkit.plugin.java.JavaPlugin#saveDefaultConfig()}, - * this doesn't fail silently if the config.yml already exists but instead will update the config with - * new values if available. - *

- * This should fail silently if all values are set already. - */ - @Override - public void saveDefaultConfig() { - File configFile = new File(getDataFolder(), "config.yml"); - BukkitConfigurationAdapter.createDummyInstance().saveDefaultConfig(getDataFolder(), configFile, getLogger()); - } -} diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index a8dd6a8d67..107103cd84 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -32,6 +32,14 @@ public void setValue(String key, Object value) { @Override public void setComment(String key, String[] comment) { + StringBuilder commentBuilder = new StringBuilder(); + for (int i = 0; i < comment.length; i++) { + if (i > 0) { + commentBuilder.append("\n"); + } + commentBuilder.append(comment[i]); + } + node(key).comment(commentBuilder.toString()); } @Override @@ -53,7 +61,7 @@ public String[] getComment(String key) { @Override public Set getKeys() { - return new HashSet<>(nestedOptions(config)); + return nestedOptions(config); } @Override @@ -62,24 +70,7 @@ public boolean contains(String key) { } @Override - public void tryCreateSection(String key, DefaultConfig defaultedVelocityConfig) { - if (!key.contains(".")) { - return; - } - String[] path = key.split("\\."); - List sectionCandidates = new ArrayList<>(Arrays.asList(path).subList(0, path.length - 1)); - - StringBuilder pathSoFar = new StringBuilder(); - for (String section : sectionCandidates) { - if (pathSoFar.isEmpty()) { - pathSoFar.append(section); - } else { - pathSoFar.append(".").append(section); - } - if (node(pathSoFar.toString()).comment() == null) { - node(pathSoFar.toString()).comment(String.join("\n", defaultedVelocityConfig.getAllSections().get(pathSoFar.toString()).comment())); - } - } + public void tryCreateSection(String key) { } @Override diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java index 3b4b562016..8b578cedf5 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigGenerator.java @@ -18,7 +18,7 @@ public static ConfigGenerator createNew(DefaultConfig defaultConfig) { public void populateDefaultConfig(ConfigurationAdapter adapter) { for (Map.Entry> commentedConfigOption : defaultConfig.getAllOptions().entrySet()) { - adapter.tryCreateSection(commentedConfigOption.getKey(), defaultConfig); + adapter.tryCreateSection(commentedConfigOption.getKey()); adapter.setValue(commentedConfigOption.getKey(), commentedConfigOption.getValue().option()); adapter.setComment(commentedConfigOption.getKey(), commentedConfigOption.getValue().comment()); } @@ -36,11 +36,11 @@ public ConfigurationAdapter generateWithNewValues(ConfigurationAdapter // Update config option if (existingConfig.contains(path)) { - updatedConfig.tryCreateSection(path, defaultConfig); + updatedConfig.tryCreateSection(path); updatedConfig.setValue(path, existingConfig.getValue(path)); } else { wasConfigUpdated = true; - updatedConfig.tryCreateSection(path, defaultConfig); + updatedConfig.tryCreateSection(path); updatedConfig.setValue(path, commentedConfigOption.getValue().option()); } diff --git a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java index 88c171a30a..4d2665108a 100644 --- a/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java +++ b/commandapi-plugin/src/main/java/dev/jorel/commandapi/config/ConfigurationAdapter.java @@ -18,7 +18,7 @@ public interface ConfigurationAdapter { boolean contains(String key); - void tryCreateSection(String key, DefaultConfig defaultConfiguration); + void tryCreateSection(String key); ConfigurationAdapter complete(); From 392d77f8cc8adad7509115a6bc4ede0994ae4315 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 7 Oct 2024 12:54:09 +0200 Subject: [PATCH 26/26] More code review --- .../config/BukkitConfigurationAdapter.java | 10 +++++++--- .../dev/jorel/commandapi/CommandAPIMain.java | 2 +- .../config/VelocityConfigurationAdapter.java | 20 +++++++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java index 8e4a477b50..ef10eb775f 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-plugin-common/src/main/java/dev/jorel/commandapi/config/BukkitConfigurationAdapter.java @@ -5,6 +5,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -112,12 +113,15 @@ public ConfigurationAdapter createNew() { public void saveDefaultConfig(File directory, File configFile, Logger logger) { ConfigGenerator configGenerator = ConfigGenerator.createNew(DefaultBukkitConfig.createDefault()); if (!directory.exists()) { - directory.mkdir(); + boolean createdDirectory = directory.mkdirs(); + if (!createdDirectory) { + logger.severe("Failed to create directory for the CommandAPI's config.yml file!"); + } try { ConfigurationAdapter bukkitConfigurationAdapter = new BukkitConfigurationAdapter(new YamlConfiguration()); configGenerator.populateDefaultConfig(bukkitConfigurationAdapter); bukkitConfigurationAdapter.config().save(configFile); - } catch (Exception e) { + } catch (IOException e) { logger.severe("Could not create default config file! This is (probably) a bug."); logger.severe("Error message: " + e.getMessage()); logger.severe("Stacktrace:"); @@ -136,7 +140,7 @@ public void saveDefaultConfig(File directory, File configFile, Logger logger) { return; } updatedConfig.config().save(configFile); - } catch (Exception e) { + } catch (IOException e) { logger.severe("Could not update config! This is (probably) a bug."); logger.severe("Error message: " + e.getMessage()); logger.severe("Stacktrace:"); diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java index 2cdf9ba31d..7936a98756 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/CommandAPIMain.java @@ -36,7 +36,7 @@ public CommandAPIMain(ProxyServer server, Logger logger, @DataDirectory Path dat Path configFile = dataDirectory.resolve("config.yml"); // Create or update config - VelocityConfigurationAdapter.createDummyInstance().saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), null); + VelocityConfigurationAdapter.createDummyInstance().saveDefaultConfig(configFile.getParent().toFile(), configFile.toFile(), logger); // Load the file as a yaml node ConfigurationNode configYAML; diff --git a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java index 107103cd84..f69afe6ef8 100644 --- a/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java +++ b/commandapi-platforms/commandapi-velocity/commandapi-velocity-plugin/src/main/java/dev/jorel/commandapi/config/VelocityConfigurationAdapter.java @@ -97,14 +97,21 @@ public void saveDefaultConfig(File directory, File configFile, Logger logger) { DefaultVelocityConfig defaultConfig = DefaultVelocityConfig.createDefault(); ConfigGenerator configGenerator = ConfigGenerator.createNew(defaultConfig); if (!directory.exists()) { - directory.mkdirs(); - + boolean createdDirectory = directory.mkdirs(); + if (!createdDirectory) { + logger.severe("Failed to create directory for the CommandAPI's config.yml file!"); + } try { ConfigurationAdapter velocityConfigurationAdapter = new VelocityConfigurationAdapter(configLoader, configLoader.createNode(), defaultConfig); configGenerator.populateDefaultConfig(velocityConfigurationAdapter); configLoader.save(velocityConfigurationAdapter.config()); } catch (IOException e) { - throw new RuntimeException(e); + logger.severe("Could not create default config file! This is (probably) a bug."); + logger.severe("Error message: " + e.getMessage()); + logger.severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + logger.severe(element.toString()); + } } } else { try { @@ -116,7 +123,12 @@ public void saveDefaultConfig(File directory, File configFile, Logger logger) { configLoader.save(updatedConfig.config()); } } catch (IOException e) { - throw new RuntimeException(e); + logger.severe("Could not update config! This is (probably) a bug."); + logger.severe("Error message: " + e.getMessage()); + logger.severe("Stacktrace:"); + for (StackTraceElement element : e.getStackTrace()) { + logger.severe(element.toString()); + } } } }