Fully implements the config command
This commit is contained in:
		| @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandExecutor; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.configuration.file.FileConfiguration; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
|  | ||||
| @@ -24,15 +25,98 @@ public class CommandConfig implements CommandExecutor { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (args.length > 0) { | ||||
|             ConfigOption selectedOption = ConfigOption.getByName(args[0]); | ||||
|             if (selectedOption == null) { | ||||
|                 return false; | ||||
|             } | ||||
|             if (args.length > 1) { | ||||
|             //TODO: Do stuff | ||||
|                 updateConfigValue(selectedOption, commandSender, args[1]); | ||||
|             } else { | ||||
|             //TODO: Display list of config values | ||||
|                 //Display info and the current value of the given config value | ||||
|                 printConfigOptionValue(commandSender, selectedOption); | ||||
|             } | ||||
|             return true; | ||||
|         } else { | ||||
|             //Display all config options | ||||
|             displayConfigValues(commandSender); | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Updates a config value | ||||
|      * | ||||
|      * @param selectedOption <p>The option which should be updated</p> | ||||
|      * @param commandSender  <p>The command sender that changed the value</p> | ||||
|      * @param value          <p>The new value of the config option</p> | ||||
|      */ | ||||
|     private void updateConfigValue(ConfigOption selectedOption, CommandSender commandSender, String value) { | ||||
|         FileConfiguration configuration = Stargate.getInstance().getConfig(); | ||||
|  | ||||
|         //Validate any sign colors | ||||
|         if (selectedOption == ConfigOption.MAIN_SIGN_COLOR || selectedOption == ConfigOption.HIGHLIGHT_SIGN_COLOR) { | ||||
|             try { | ||||
|                 ChatColor.valueOf(value.toUpperCase()); | ||||
|             } catch (IllegalArgumentException | NullPointerException ignored) { | ||||
|                 commandSender.sendMessage(ChatColor.RED + "Invalid color given"); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         //Store the config values, accounting for the data type | ||||
|         switch (selectedOption.getDataType()) { | ||||
|             case BOOLEAN -> configuration.set(selectedOption.getConfigNode(), Boolean.parseBoolean(value)); | ||||
|             case INTEGER -> { | ||||
|                 try { | ||||
|                     configuration.set(selectedOption.getConfigNode(), Integer.parseInt(value)); | ||||
|                 } catch (NumberFormatException exception) { | ||||
|                     commandSender.sendMessage(ChatColor.RED + "Invalid number given"); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|             case STRING -> { | ||||
|                 if (selectedOption == ConfigOption.GATE_FOLDER || selectedOption == ConfigOption.PORTAL_FOLDER || | ||||
|                         selectedOption == ConfigOption.DEFAULT_GATE_NETWORK) { | ||||
|                     if (value.contains("../") || value.contains("..\\")) { | ||||
|                         commandSender.sendMessage(ChatColor.RED + "Path traversal characters cannot be used"); | ||||
|                         return; | ||||
|                     } | ||||
|                 } | ||||
|                 configuration.set(selectedOption.getConfigNode(), value); | ||||
|             } | ||||
|             default -> configuration.set(selectedOption.getConfigNode(), value); | ||||
|         } | ||||
|  | ||||
|         //Save the config file and reload if necessary | ||||
|         Stargate.getInstance().saveConfig(); | ||||
|         reloadIfNecessary(commandSender); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Reloads the config if necessary | ||||
|      * | ||||
|      * @param commandSender <p>The command sender initiating the reload</p> | ||||
|      */ | ||||
|     private void reloadIfNecessary(CommandSender commandSender) { | ||||
|         //TODO: Only update the config values which have changed and do the least amount of work necessary to load the  | ||||
|         // changes. Only do a full reload if absolutely necessary, or when the partial reloading would be as  | ||||
|         // inefficient as a full reload. | ||||
|         Stargate.getStargateConfig().reload(commandSender); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Prints information about a config option and its current value | ||||
|      * | ||||
|      * @param sender <p>The command sender that sent the command</p> | ||||
|      * @param option <p>The config option to print information about</p> | ||||
|      */ | ||||
|     private void printConfigOptionValue(CommandSender sender, ConfigOption option) { | ||||
|         Object value = Stargate.getStargateConfig().getConfigOptions().get(option); | ||||
|         sender.sendMessage(getOptionDescription(option)); | ||||
|         sender.sendMessage(ChatColor.GREEN + "Current value: " + ChatColor.GOLD + value); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Displays the name and a small description of every config value | ||||
|      * | ||||
| @@ -42,9 +126,19 @@ public class CommandConfig implements CommandExecutor { | ||||
|         sender.sendMessage(ChatColor.GREEN + Stargate.getBackupString("prefix") + ChatColor.GOLD + | ||||
|                 "Config values:"); | ||||
|         for (ConfigOption option : ConfigOption.values()) { | ||||
|             sender.sendMessage(ChatColor.GOLD + option.getName() + ChatColor.WHITE + " - " + ChatColor.GREEN + | ||||
|                     option.getDescription() + " (" + option.getDefaultValue() + ")"); | ||||
|             sender.sendMessage(getOptionDescription(option)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the description of a single config option | ||||
|      * | ||||
|      * @param option <p>The option to describe</p> | ||||
|      * @return <p>A string describing the config option</p> | ||||
|      */ | ||||
|     private String getOptionDescription(ConfigOption option) { | ||||
|         return ChatColor.GOLD + option.getName() + ChatColor.WHITE + " - " + ChatColor.GREEN + option.getDescription() + | ||||
|                 ChatColor.DARK_GRAY + " (Default: " + ChatColor.GRAY + option.getDefaultValue() + ChatColor.DARK_GRAY + ")"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user