From 8527cb51886d5c724534b379bdec6a6935b9efd7 Mon Sep 17 00:00:00 2001 From: Aust1n46 Date: Sun, 26 Jun 2022 18:34:21 -0500 Subject: [PATCH 1/2] ISSUE #18 Add input validation for click_actions Refactor placeholder formatting to only apply json formatting if configured. --- pom.xml | 2 +- .../mineverse/Aust1n46/chat/ClickAction.java | 16 ++++ .../Aust1n46/chat/json/JsonAttribute.java | 8 +- .../Aust1n46/chat/json/JsonFormat.java | 96 ++++++++++--------- .../Aust1n46/chat/utilities/Format.java | 36 ++++--- src/main/resources/config.yml | 2 +- 6 files changed, 97 insertions(+), 63 deletions(-) create mode 100644 src/main/java/mineverse/Aust1n46/chat/ClickAction.java diff --git a/pom.xml b/pom.xml index 536166a7..d0275439 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 mineverse.Aust1n46.chat VentureChat - 3.4.1_1.19_patch + 3.4.2_1.19_patch https://bitbucket.org/Aust1n46/venturechat/src/master https://bitbucket.org/Aust1n46/venturechat/src/master diff --git a/src/main/java/mineverse/Aust1n46/chat/ClickAction.java b/src/main/java/mineverse/Aust1n46/chat/ClickAction.java new file mode 100644 index 00000000..f6cef49a --- /dev/null +++ b/src/main/java/mineverse/Aust1n46/chat/ClickAction.java @@ -0,0 +1,16 @@ +package mineverse.Aust1n46.chat; + +public enum ClickAction { + SUGGEST_COMMAND, RUN_COMMAND, OPEN_URL; + + private final String jsonValue; + + ClickAction() { + jsonValue = name().toLowerCase(); + } + + @Override + public String toString() { + return jsonValue; + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/json/JsonAttribute.java b/src/main/java/mineverse/Aust1n46/chat/json/JsonAttribute.java index 3b7ec264..7181338e 100644 --- a/src/main/java/mineverse/Aust1n46/chat/json/JsonAttribute.java +++ b/src/main/java/mineverse/Aust1n46/chat/json/JsonAttribute.java @@ -2,13 +2,15 @@ import java.util.List; +import mineverse.Aust1n46.chat.ClickAction; + public class JsonAttribute { private String name; private List hoverText; - private String clickAction; + private ClickAction clickAction; private String clickText; - public JsonAttribute(String name, List hoverText, String clickAction, String clickText) { + public JsonAttribute(String name, List hoverText, ClickAction clickAction, String clickText) { this.name = name; this.hoverText = hoverText; this.clickAction = clickAction; @@ -23,7 +25,7 @@ public List getHoverText() { return hoverText; } - public String getClickAction() { + public ClickAction getClickAction() { return clickAction; } diff --git a/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java b/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java index 1ab0032e..a447e820 100644 --- a/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java +++ b/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java @@ -7,58 +7,66 @@ import org.bukkit.configuration.ConfigurationSection; +import mineverse.Aust1n46.chat.ClickAction; import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.utilities.Format; public class JsonFormat { - private static MineverseChat plugin = MineverseChat.getInstance(); - private static HashMap jsonFormats; + private static MineverseChat plugin = MineverseChat.getInstance(); + private static HashMap jsonFormats; - private List jsonAttributes; - private int priority; - private String name; + private List jsonAttributes; + private int priority; + private String name; - public JsonFormat(String name, int priority, List jsonAttributes) { - this.name = name; - this.priority = priority; - this.jsonAttributes = jsonAttributes; - } + public JsonFormat(String name, int priority, List jsonAttributes) { + this.name = name; + this.priority = priority; + this.jsonAttributes = jsonAttributes; + } - public static void initialize() { - jsonFormats = new HashMap(); - ConfigurationSection jsonFormatSection = plugin.getConfig().getConfigurationSection("jsonformatting"); - for (String jsonFormat : jsonFormatSection.getKeys(false)) { - int priority = jsonFormatSection.getInt(jsonFormat + ".priority", 0); - List jsonAttributes = new ArrayList<>(); - ConfigurationSection jsonAttributeSection = jsonFormatSection.getConfigurationSection(jsonFormat + ".json_attributes"); - if (jsonAttributeSection != null) { - for (String attribute : jsonAttributeSection.getKeys(false)) { - List hoverText = jsonAttributeSection.getStringList(attribute + ".hover_text"); - String clickAction = jsonAttributeSection.getString(attribute + ".click_action", ""); - String clickText = jsonAttributeSection.getString(attribute + ".click_text", ""); - jsonAttributes.add(new JsonAttribute(attribute, hoverText, clickAction, clickText)); - } - } - jsonFormats.put(jsonFormat.toLowerCase(), new JsonFormat(jsonFormat, priority, jsonAttributes)); - } - } + public static void initialize() { + jsonFormats = new HashMap(); + ConfigurationSection jsonFormatSection = plugin.getConfig().getConfigurationSection("jsonformatting"); + for (String jsonFormat : jsonFormatSection.getKeys(false)) { + int priority = jsonFormatSection.getInt(jsonFormat + ".priority", 0); + List jsonAttributes = new ArrayList<>(); + ConfigurationSection jsonAttributeSection = jsonFormatSection.getConfigurationSection(jsonFormat + ".json_attributes"); + if (jsonAttributeSection != null) { + for (String attribute : jsonAttributeSection.getKeys(false)) { + List hoverText = jsonAttributeSection.getStringList(attribute + ".hover_text"); + String clickActionText = jsonAttributeSection.getString(attribute + ".click_action", ""); + try { + ClickAction clickAction = ClickAction.valueOf(clickActionText.toUpperCase()); + String clickText = jsonAttributeSection.getString(attribute + ".click_text", ""); + jsonAttributes.add(new JsonAttribute(attribute, hoverText, clickAction, clickText)); + } catch (IllegalArgumentException | NullPointerException exception) { + plugin.getServer().getConsoleSender() + .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Illegal click_action: " + clickActionText + " in jsonFormat: " + jsonFormat)); + } + } + } + jsonFormats.put(jsonFormat.toLowerCase(), new JsonFormat(jsonFormat, priority, jsonAttributes)); + } + } - public static Collection getJsonFormats() { - return jsonFormats.values(); - } + public static Collection getJsonFormats() { + return jsonFormats.values(); + } - public static JsonFormat getJsonFormat(String name) { - return jsonFormats.get(name.toLowerCase()); - } + public static JsonFormat getJsonFormat(String name) { + return jsonFormats.get(name.toLowerCase()); + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public int getPriority() { - return priority; - } - - public List getJsonAttributes() { - return jsonAttributes; - } + public int getPriority() { + return priority; + } + + public List getJsonAttributes() { + return jsonAttributes; + } } diff --git a/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java b/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java index 099bbda3..9f3b69c9 100644 --- a/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java +++ b/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java @@ -10,6 +10,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Sound; @@ -112,28 +113,35 @@ private static String convertPlaceholders(String s, JsonFormat format, Mineverse formattedPlaceholder = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), placeholder)); temp += convertToJsonColors(lastCode + remaining.substring(0, indexStart)) + ","; lastCode = getLastCode(lastCode + remaining.substring(0, indexStart)); - String action = ""; - String text = ""; - String hover = ""; + boolean placeholderHasJsonAttribute = false; for (JsonAttribute jsonAttribute : format.getJsonAttributes()) { if (placeholder.contains(jsonAttribute.getName().replace("{", "").replace("}", ""))) { - action = jsonAttribute.getClickAction(); - text = Format.FormatStringAll( + final String action = jsonAttribute.getClickAction().toString(); + final String text = Format.FormatStringAll( PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), jsonAttribute.getClickText())); + final StringBuilder hover = new StringBuilder(); for (String st : jsonAttribute.getHoverText()) { - hover += Format.FormatStringAll(st) + "\n"; + hover.append(Format.FormatStringAll(st) + "\n"); } + final String hoverText; + if(!hover.isEmpty()) { + hoverText = Format.FormatStringAll( + PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), hover.substring(0, hover.length() - 1))); + } else { + hoverText = StringUtils.EMPTY; + } + temp += convertToJsonColors(lastCode + formattedPlaceholder, + ",\"clickEvent\":{\"action\":\"" + action + "\",\"value\":\"" + text + + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" + + convertToJsonColors(hoverText) + "]}}") + + ","; + placeholderHasJsonAttribute = true; + break; } } - if(!hover.isEmpty()) { - hover = Format.FormatStringAll( - PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), hover.substring(0, hover.length() - 1))); + if (!placeholderHasJsonAttribute) { + temp += convertToJsonColors(lastCode + formattedPlaceholder) + ","; } - temp += convertToJsonColors(lastCode + formattedPlaceholder, - ",\"clickEvent\":{\"action\":\"" + action + "\",\"value\":\"" + text - + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" - + convertToJsonColors(hover) + "]}}") - + ","; lastCode = getLastCode(lastCode + formattedPlaceholder); remaining = remaining.substring(indexEnd); } else { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1974c4a7..a8210ff4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -136,7 +136,7 @@ messageremovertext: '&c&o' # The name of the group is the permissions node for the format # Example: venturechat.json.Owner is the node for the group Owner # A lower priority overrides a higher priority if a player has more than 1 group -# Possible options for click_name and click_prefix are suggest_command, run_command, and open_url +# Possible options for click_action are suggest_command, run_command, and open_url jsonformatting: Default: # This default format is required! Do not delete or rename it! priority: 2147483647 # Integer.MAX_VALUE From 0f3b3065bdb2f7b5d698133378009e904a9abddd Mon Sep 17 00:00:00 2001 From: Aust1n46 Date: Sat, 2 Jul 2022 20:24:49 -0500 Subject: [PATCH 2/2] ISSUE #18 Only show hover when it is configured --- .../mineverse/Aust1n46/chat/ClickAction.java | 2 +- .../Aust1n46/chat/MineverseChat.java | 2 +- .../Aust1n46/chat/json/JsonFormat.java | 2 +- .../Aust1n46/chat/utilities/Format.java | 27 +++++++++++++------ src/main/resources/config.yml | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/mineverse/Aust1n46/chat/ClickAction.java b/src/main/java/mineverse/Aust1n46/chat/ClickAction.java index f6cef49a..5e75674c 100644 --- a/src/main/java/mineverse/Aust1n46/chat/ClickAction.java +++ b/src/main/java/mineverse/Aust1n46/chat/ClickAction.java @@ -1,7 +1,7 @@ package mineverse.Aust1n46.chat; public enum ClickAction { - SUGGEST_COMMAND, RUN_COMMAND, OPEN_URL; + SUGGEST_COMMAND, RUN_COMMAND, OPEN_URL, NONE; private final String jsonValue; diff --git a/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java b/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java index a0b693e4..aa4fe535 100644 --- a/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java +++ b/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java @@ -203,7 +203,7 @@ public void run() { } } } - if (getConfig().getString("loglevel", "info").equals("debug")) { + if (getConfig().getString("loglevel", "info").equals("trace")) { Bukkit.getConsoleSender() .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Updating Player Mutes")); } diff --git a/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java b/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java index a447e820..12a0af6e 100644 --- a/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java +++ b/src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java @@ -35,7 +35,7 @@ public static void initialize() { if (jsonAttributeSection != null) { for (String attribute : jsonAttributeSection.getKeys(false)) { List hoverText = jsonAttributeSection.getStringList(attribute + ".hover_text"); - String clickActionText = jsonAttributeSection.getString(attribute + ".click_action", ""); + String clickActionText = jsonAttributeSection.getString(attribute + ".click_action", "none"); try { ClickAction clickAction = ClickAction.valueOf(clickActionText.toUpperCase()); String clickText = jsonAttributeSection.getString(attribute + ".click_text", ""); diff --git a/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java b/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java index 9f3b69c9..88780800 100644 --- a/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java +++ b/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java @@ -23,6 +23,7 @@ import com.comphenix.protocol.wrappers.WrappedChatComponent; import me.clip.placeholderapi.PlaceholderAPI; +import mineverse.Aust1n46.chat.ClickAction; import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.json.JsonAttribute; @@ -116,9 +117,6 @@ private static String convertPlaceholders(String s, JsonFormat format, Mineverse boolean placeholderHasJsonAttribute = false; for (JsonAttribute jsonAttribute : format.getJsonAttributes()) { if (placeholder.contains(jsonAttribute.getName().replace("{", "").replace("}", ""))) { - final String action = jsonAttribute.getClickAction().toString(); - final String text = Format.FormatStringAll( - PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), jsonAttribute.getClickText())); final StringBuilder hover = new StringBuilder(); for (String st : jsonAttribute.getHoverText()) { hover.append(Format.FormatStringAll(st) + "\n"); @@ -130,11 +128,24 @@ private static String convertPlaceholders(String s, JsonFormat format, Mineverse } else { hoverText = StringUtils.EMPTY; } - temp += convertToJsonColors(lastCode + formattedPlaceholder, - ",\"clickEvent\":{\"action\":\"" + action + "\",\"value\":\"" + text - + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" - + convertToJsonColors(hoverText) + "]}}") - + ","; + final ClickAction clickAction = jsonAttribute.getClickAction(); + final String actionJson; + if (clickAction == ClickAction.NONE) { + actionJson = StringUtils.EMPTY; + } else { + final String clickText = Format.FormatStringAll( + PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), jsonAttribute.getClickText())); + actionJson = ",\"clickEvent\":{\"action\":\"" + jsonAttribute.getClickAction().toString() + "\",\"value\":\"" + clickText + + "\"}"; + } + final String hoverJson; + if (hoverText.isEmpty()) { + hoverJson = StringUtils.EMPTY; + } else { + hoverJson = ",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" + + convertToJsonColors(hoverText) + "]}}"; + } + temp += convertToJsonColors(lastCode + formattedPlaceholder, actionJson + hoverJson) + ","; placeholderHasJsonAttribute = true; break; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a8210ff4..a53e57ac 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -136,7 +136,7 @@ messageremovertext: '&c&o' # The name of the group is the permissions node for the format # Example: venturechat.json.Owner is the node for the group Owner # A lower priority overrides a higher priority if a player has more than 1 group -# Possible options for click_action are suggest_command, run_command, and open_url +# Possible options for click_action are suggest_command, run_command, open_url, and none jsonformatting: Default: # This default format is required! Do not delete or rename it! priority: 2147483647 # Integer.MAX_VALUE