Finishes the work required for changing per-sign colors using the /sg config command
This commit is contained in:
parent
366cd3107e
commit
e86be3e848
@ -9,6 +9,7 @@ import net.knarcraft.stargate.portal.PortalRegistry;
|
||||
import net.knarcraft.stargate.portal.PortalSignDrawer;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -16,6 +17,9 @@ import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This command represents the config command for changing config values
|
||||
*/
|
||||
@ -37,7 +41,11 @@ public class CommandConfig implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
if (args.length > 1) {
|
||||
if (selectedOption.getDataType() == OptionDataType.STRING_LIST) {
|
||||
updateListConfigValue(selectedOption, commandSender, args);
|
||||
} else {
|
||||
updateConfigValue(selectedOption, commandSender, args[1]);
|
||||
}
|
||||
} else {
|
||||
//Display info and the current value of the given config value
|
||||
printConfigOptionValue(commandSender, selectedOption);
|
||||
@ -72,14 +80,7 @@ public class CommandConfig implements CommandExecutor {
|
||||
|
||||
//Store the config values, accounting for the data type
|
||||
switch (selectedOption.getDataType()) {
|
||||
case BOOLEAN -> {
|
||||
boolean newValue = Boolean.parseBoolean(value);
|
||||
if (selectedOption == ConfigOption.ENABLE_BUNGEE && newValue != Stargate.getGateConfig().enableBungee()) {
|
||||
Stargate.getStargateConfig().startStopBungeeListener(newValue);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, newValue);
|
||||
configuration.set(selectedOption.getConfigNode(), newValue);
|
||||
}
|
||||
case BOOLEAN -> updateBooleanConfigValue(selectedOption, value, configuration);
|
||||
case INTEGER -> {
|
||||
Integer intValue = getInteger(commandSender, selectedOption, value);
|
||||
if (intValue == null) {
|
||||
@ -90,6 +91,42 @@ public class CommandConfig implements CommandExecutor {
|
||||
}
|
||||
}
|
||||
case STRING -> {
|
||||
updateStringConfigValue(selectedOption, commandSender, value);
|
||||
configuration.set(selectedOption.getConfigNode(), value);
|
||||
}
|
||||
default -> {
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, value);
|
||||
configuration.set(selectedOption.getConfigNode(), value);
|
||||
}
|
||||
}
|
||||
|
||||
saveAndReload(selectedOption, commandSender);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a boolean config value
|
||||
*
|
||||
* @param selectedOption <p>The option which should be updated</p>
|
||||
* @param value <p>The new value of the config option</p>
|
||||
* @param configuration <p>The configuration file to save to</p>
|
||||
*/
|
||||
private void updateBooleanConfigValue(ConfigOption selectedOption, String value, FileConfiguration configuration) {
|
||||
boolean newValue = Boolean.parseBoolean(value);
|
||||
if (selectedOption == ConfigOption.ENABLE_BUNGEE && newValue != Stargate.getGateConfig().enableBungee()) {
|
||||
Stargate.getStargateConfig().startStopBungeeListener(newValue);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, newValue);
|
||||
configuration.set(selectedOption.getConfigNode(), newValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a string 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 updateStringConfigValue(ConfigOption selectedOption, CommandSender commandSender, String value) {
|
||||
if (selectedOption == ConfigOption.GATE_FOLDER || selectedOption == ConfigOption.PORTAL_FOLDER ||
|
||||
selectedOption == ConfigOption.DEFAULT_GATE_NETWORK) {
|
||||
if (value.contains("../") || value.contains("..\\")) {
|
||||
@ -106,19 +143,106 @@ public class CommandConfig implements CommandExecutor {
|
||||
Stargate.getStargateConfig().getLanguageLoader().setChosenLanguage(value);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, value);
|
||||
configuration.set(selectedOption.getConfigNode(), value);
|
||||
}
|
||||
case STRING_LIST -> {
|
||||
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
|
||||
commandSender.sendMessage(ChatColor.RED + value);
|
||||
}
|
||||
}
|
||||
default -> {
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, value);
|
||||
configuration.set(selectedOption.getConfigNode(), value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 arguments <p>The arguments for the new config option</p>
|
||||
*/
|
||||
private void updateListConfigValue(ConfigOption selectedOption, CommandSender commandSender, String[] arguments) {
|
||||
FileConfiguration configuration = Stargate.getInstance().getConfig();
|
||||
|
||||
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
|
||||
if (arguments.length < 4) {
|
||||
Stargate.getMessageSender().sendErrorMessage(commandSender, "Usage: /sg config perSignColors " +
|
||||
"<SIGN_TYPE> <MAIN_COLOR> <HIGHLIGHTING_COLOR>");
|
||||
return;
|
||||
}
|
||||
|
||||
String colorString = parsePerSignColorInput(commandSender, arguments);
|
||||
if (colorString == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Update the per-sign colors according to input
|
||||
updatePerSignColors(arguments[1], colorString, configuration);
|
||||
}
|
||||
|
||||
saveAndReload(selectedOption, commandSender);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the input given for changing the per-color string
|
||||
*
|
||||
* @param commandSender <p>The command sender that triggered the command</p>
|
||||
* @param arguments <p>The arguments given by the user</p>
|
||||
* @return <p>The per-sign color string to update with, or null if the input was invalid</p>
|
||||
*/
|
||||
private String parsePerSignColorInput(CommandSender commandSender, String[] arguments) {
|
||||
//Make sure the sign type is an actual sign
|
||||
if (Material.matchMaterial(arguments[1] + "_SIGN") == null) {
|
||||
Stargate.getMessageSender().sendErrorMessage(commandSender, "The given sign type is invalid");
|
||||
return null;
|
||||
}
|
||||
String colorString = arguments[1] + ":";
|
||||
|
||||
//Validate the colors given by the user
|
||||
String[] errorMessage = new String[]{"The given main sign color is invalid!", "The given highlight sign color is invalid!"};
|
||||
String[] newColors = new String[2];
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (validatePerSignColor(arguments[i + 2])) {
|
||||
newColors[i] = arguments[i + 2];
|
||||
} else {
|
||||
Stargate.getMessageSender().sendErrorMessage(commandSender, errorMessage[i]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
colorString += String.join(",", newColors);
|
||||
return colorString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the per-sign colors with the given input
|
||||
*
|
||||
* @param signType <p>The sign type that is updated</p>
|
||||
* @param colorString <p>The new color string to replace any previous value with</p>
|
||||
* @param configuration <p>The file configuration to update with the new per-sign colors</p>
|
||||
*/
|
||||
private void updatePerSignColors(String signType, String colorString, FileConfiguration configuration) {
|
||||
List<String> newColorStrings = new ArrayList<>();
|
||||
List<?> oldColors = (List<?>) Stargate.getStargateConfig().getConfigOptionsReference().get(ConfigOption.PER_SIGN_COLORS);
|
||||
for (Object object : oldColors) {
|
||||
newColorStrings.add(String.valueOf(object));
|
||||
}
|
||||
newColorStrings.removeIf((item) -> item.startsWith(signType));
|
||||
newColorStrings.add(colorString);
|
||||
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(ConfigOption.PER_SIGN_COLORS, newColorStrings);
|
||||
configuration.set(ConfigOption.PER_SIGN_COLORS.getConfigNode(), newColorStrings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to validate one of the colors given when changing per-sign colors
|
||||
*
|
||||
* @param color <p>The color chosen by the user</p>
|
||||
* @return <p>True if the given color is valid</p>
|
||||
*/
|
||||
private boolean validatePerSignColor(String color) {
|
||||
ChatColor newHighlightColor = parseColor(color);
|
||||
return newHighlightColor != null || color.equalsIgnoreCase("default") ||
|
||||
color.equalsIgnoreCase("inverted");
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the configuration file and reloads as necessary
|
||||
*
|
||||
* @param selectedOption <p>The config option that was changed</p>
|
||||
* @param commandSender <p>The command sender that executed the config command</p>
|
||||
*/
|
||||
private void saveAndReload(ConfigOption selectedOption, CommandSender commandSender) {
|
||||
//Save the config file and reload if necessary
|
||||
Stargate.getInstance().saveConfig();
|
||||
|
||||
|
@ -3,6 +3,8 @@ package net.knarcraft.stargate.command;
|
||||
import net.knarcraft.stargate.config.ConfigOption;
|
||||
import net.knarcraft.stargate.config.OptionDataType;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Tag;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
@ -17,15 +19,26 @@ import java.util.List;
|
||||
*/
|
||||
public class ConfigTabCompleter implements TabCompleter {
|
||||
|
||||
private List<String> signTypes;
|
||||
private List<String> booleans;
|
||||
private List<String> numbers;
|
||||
private List<String> chatColors;
|
||||
private List<String> languages;
|
||||
private List<String> extendedColors;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
|
||||
@NotNull String[] args) {
|
||||
|
||||
if (signTypes == null || booleans == null || numbers == null || chatColors == null || languages == null) {
|
||||
initializeAutoCompleteLists();
|
||||
}
|
||||
if (args.length > 1) {
|
||||
ConfigOption selectedOption = ConfigOption.getByName(args[0]);
|
||||
if (selectedOption == null) {
|
||||
return new ArrayList<>();
|
||||
} else if (selectedOption.getDataType() == OptionDataType.STRING_LIST) {
|
||||
return getPossibleStringListOptionValues(selectedOption, args);
|
||||
} else {
|
||||
return getPossibleOptionValues(selectedOption, args[1]);
|
||||
}
|
||||
@ -63,18 +76,10 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
* @return <p>Some or all of the valid values for the option</p>
|
||||
*/
|
||||
private List<String> getPossibleOptionValues(ConfigOption selectedOption, String typedText) {
|
||||
List<String> booleans = new ArrayList<>();
|
||||
booleans.add("true");
|
||||
booleans.add("false");
|
||||
|
||||
List<String> numbers = new ArrayList<>();
|
||||
numbers.add("0");
|
||||
numbers.add("5");
|
||||
|
||||
switch (selectedOption) {
|
||||
case LANGUAGE:
|
||||
//Return available languages
|
||||
return filterMatching(getLanguages(), typedText);
|
||||
return filterMatching(languages, typedText);
|
||||
case GATE_FOLDER:
|
||||
case PORTAL_FOLDER:
|
||||
case DEFAULT_GATE_NETWORK:
|
||||
@ -88,7 +93,7 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
case HIGHLIGHT_SIGN_COLOR:
|
||||
case FREE_GATES_COLOR:
|
||||
//Return all colors
|
||||
return filterMatching(getColors(), typedText);
|
||||
return filterMatching(chatColors, typedText);
|
||||
}
|
||||
|
||||
//If the config value is a boolean, show the two boolean values
|
||||
@ -104,50 +109,95 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: What to do with per-sign colors?
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all available languages
|
||||
* Get possible values for the selected string list option
|
||||
*
|
||||
* @return <p>The available languages</p>
|
||||
* @param selectedOption <p>The selected option</p>
|
||||
* @param args <p>The arguments given by the user</p>
|
||||
* @return <p>Some or all of the valid values for the option</p>
|
||||
*/
|
||||
private List<String> getLanguages() {
|
||||
List<String> languages = new ArrayList<>();
|
||||
languages.add("de");
|
||||
languages.add("en");
|
||||
languages.add("es");
|
||||
languages.add("fr");
|
||||
languages.add("hu");
|
||||
languages.add("it");
|
||||
languages.add("nb-no");
|
||||
languages.add("nl");
|
||||
languages.add("nn-no");
|
||||
languages.add("pt-br");
|
||||
languages.add("ru");
|
||||
return languages;
|
||||
private List<String> getPossibleStringListOptionValues(ConfigOption selectedOption, String[] args) {
|
||||
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
|
||||
return getPerSignColorCompletion(args);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all available colors
|
||||
* Gets the tab completion values for completing the per-sign color text
|
||||
*
|
||||
* @return <p>All available colors</p>
|
||||
* @param args <p>The arguments given by the user</p>
|
||||
* @return <p>The options to give the user</p>
|
||||
*/
|
||||
private List<String> getColors() {
|
||||
List<String> colors = new ArrayList<>();
|
||||
private List<String> getPerSignColorCompletion(String[] args) {
|
||||
if (args.length < 3) {
|
||||
return filterMatching(signTypes, args[1]);
|
||||
} else if (args.length < 4) {
|
||||
return filterMatching(extendedColors, args[2]);
|
||||
} else if (args.length < 5) {
|
||||
return filterMatching(extendedColors, args[3]);
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a single string value into a string list
|
||||
*
|
||||
* @param value <p>The string to make into a list</p>
|
||||
* @return <p>A list containing the string value</p>
|
||||
*/
|
||||
private List<String> putStringInList(String value) {
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(value);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes all lists of auto-completable values
|
||||
*/
|
||||
private void initializeAutoCompleteLists() {
|
||||
booleans = new ArrayList<>();
|
||||
booleans.add("true");
|
||||
booleans.add("false");
|
||||
|
||||
numbers = new ArrayList<>();
|
||||
numbers.add("0");
|
||||
numbers.add("5");
|
||||
|
||||
signTypes = new ArrayList<>();
|
||||
for (Material material : Material.values()) {
|
||||
if (Tag.STANDING_SIGNS.isTagged(material)) {
|
||||
signTypes.add(material.toString().replace("_SIGN", ""));
|
||||
}
|
||||
}
|
||||
|
||||
getColors();
|
||||
initializeLanguages();
|
||||
|
||||
extendedColors = new ArrayList<>(chatColors);
|
||||
extendedColors.add("default");
|
||||
extendedColors.add("inverted");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initializes the list of chat colors
|
||||
*/
|
||||
private void getColors() {
|
||||
chatColors = new ArrayList<>();
|
||||
for (ChatColor color : getChatColors()) {
|
||||
colors.add(color.getName());
|
||||
chatColors.add(color.getName());
|
||||
}
|
||||
return colors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of all available chat colors
|
||||
* Gets available chat colors
|
||||
*
|
||||
* @return <p>A list of chat colors</p>
|
||||
* @return <p>The available chat colors</p>
|
||||
*/
|
||||
private List<ChatColor> getChatColors() {
|
||||
List<ChatColor> chatColors = new ArrayList<>();
|
||||
@ -167,19 +217,29 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
chatColors.add(ChatColor.DARK_GRAY);
|
||||
chatColors.add(ChatColor.GRAY);
|
||||
chatColors.add(ChatColor.YELLOW);
|
||||
chatColors.add(ChatColor.of("#ed76d9"));
|
||||
chatColors.add(ChatColor.of("#ffecb7"));
|
||||
return chatColors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a single string value into a string list
|
||||
*
|
||||
* @param value <p>The string to make into a list</p>
|
||||
* @return <p>A list containing the string value</p>
|
||||
* Initializes the list of all available languages
|
||||
*/
|
||||
private List<String> putStringInList(String value) {
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(value);
|
||||
return list;
|
||||
private void initializeLanguages() {
|
||||
languages = new ArrayList<>();
|
||||
languages.add("de");
|
||||
languages.add("en");
|
||||
languages.add("es");
|
||||
languages.add("fr");
|
||||
languages.add("hu");
|
||||
languages.add("it");
|
||||
languages.add("nb-no");
|
||||
languages.add("nl");
|
||||
languages.add("nn-no");
|
||||
languages.add("pt-br");
|
||||
languages.add("ru");
|
||||
//TODO: Generate this list dynamically by listing the language files in the jar and adding the user's custom
|
||||
// language files
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,7 +7,8 @@ import java.util.Arrays;
|
||||
*/
|
||||
public enum ConfigTag {
|
||||
|
||||
COLOR(new ConfigOption[]{ConfigOption.FREE_GATES_COLOR, ConfigOption.MAIN_SIGN_COLOR, ConfigOption.HIGHLIGHT_SIGN_COLOR}),
|
||||
COLOR(new ConfigOption[]{ConfigOption.FREE_GATES_COLOR, ConfigOption.MAIN_SIGN_COLOR,
|
||||
ConfigOption.HIGHLIGHT_SIGN_COLOR, ConfigOption.PER_SIGN_COLORS}),
|
||||
FOLDER(new ConfigOption[]{ConfigOption.GATE_FOLDER, ConfigOption.PORTAL_FOLDER});
|
||||
|
||||
private final ConfigOption[] taggedOptions;
|
||||
@ -38,7 +39,7 @@ public enum ConfigTag {
|
||||
* @return <p>True if changing the config option requires a "reload of colors" to take effect</p>
|
||||
*/
|
||||
public static boolean requiresColorReload(ConfigOption configOption) {
|
||||
return COLOR.isTagged(configOption) && configOption != ConfigOption.FREE_GATES_COLOR;
|
||||
return (COLOR.isTagged(configOption) && configOption != ConfigOption.FREE_GATES_COLOR);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user