Skip to content

Commit b950d21

Browse files
authored
Merge pull request #19 from /issues/18
ISSUE #18 Add input validation for click_actions
2 parents 6d526c1 + 8b4666c commit b950d21

7 files changed

Lines changed: 110 additions & 65 deletions

File tree

‎pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>mineverse.Aust1n46.chat</groupId>
77
<artifactId>VentureChat</artifactId>
8-
<version>3.4.3</version>
8+
<version>3.4.4</version>
99
<url>https://bitbucket.org/Aust1n46/venturechat/src/master</url>
1010
<scm>
1111
<url>https://bitbucket.org/Aust1n46/venturechat/src/master</url>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package mineverse.Aust1n46.chat;
2+
3+
public enum ClickAction {
4+
SUGGEST_COMMAND, RUN_COMMAND, OPEN_URL, NONE;
5+
6+
private final String jsonValue;
7+
8+
ClickAction() {
9+
jsonValue = name().toLowerCase();
10+
}
11+
12+
@Override
13+
public String toString() {
14+
return jsonValue;
15+
}
16+
}

‎src/main/java/mineverse/Aust1n46/chat/MineverseChat.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void run() {
203203
}
204204
}
205205
}
206-
if (getConfig().getString("loglevel", "info").equals("debug")) {
206+
if (getConfig().getString("loglevel", "info").equals("trace")) {
207207
Bukkit.getConsoleSender()
208208
.sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Updating Player Mutes"));
209209
}

‎src/main/java/mineverse/Aust1n46/chat/json/JsonAttribute.java‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import java.util.List;
44

5+
import mineverse.Aust1n46.chat.ClickAction;
6+
57
public class JsonAttribute {
68
private String name;
79
private List<String> hoverText;
8-
private String clickAction;
10+
private ClickAction clickAction;
911
private String clickText;
1012

11-
public JsonAttribute(String name, List<String> hoverText, String clickAction, String clickText) {
13+
public JsonAttribute(String name, List<String> hoverText, ClickAction clickAction, String clickText) {
1214
this.name = name;
1315
this.hoverText = hoverText;
1416
this.clickAction = clickAction;
@@ -23,7 +25,7 @@ public List<String> getHoverText() {
2325
return hoverText;
2426
}
2527

26-
public String getClickAction() {
28+
public ClickAction getClickAction() {
2729
return clickAction;
2830
}
2931

‎src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java‎

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,58 +7,66 @@
77

88
import org.bukkit.configuration.ConfigurationSection;
99

10+
import mineverse.Aust1n46.chat.ClickAction;
1011
import mineverse.Aust1n46.chat.MineverseChat;
12+
import mineverse.Aust1n46.chat.utilities.Format;
1113

1214
public class JsonFormat {
13-
private static MineverseChat plugin = MineverseChat.getInstance();
14-
private static HashMap<String, JsonFormat> jsonFormats;
15+
private static MineverseChat plugin = MineverseChat.getInstance();
16+
private static HashMap<String, JsonFormat> jsonFormats;
1517

16-
private List<JsonAttribute> jsonAttributes;
17-
private int priority;
18-
private String name;
18+
private List<JsonAttribute> jsonAttributes;
19+
private int priority;
20+
private String name;
1921

20-
public JsonFormat(String name, int priority, List<JsonAttribute> jsonAttributes) {
21-
this.name = name;
22-
this.priority = priority;
23-
this.jsonAttributes = jsonAttributes;
24-
}
22+
public JsonFormat(String name, int priority, List<JsonAttribute> jsonAttributes) {
23+
this.name = name;
24+
this.priority = priority;
25+
this.jsonAttributes = jsonAttributes;
26+
}
2527

26-
public static void initialize() {
27-
jsonFormats = new HashMap<String, JsonFormat>();
28-
ConfigurationSection jsonFormatSection = plugin.getConfig().getConfigurationSection("jsonformatting");
29-
for (String jsonFormat : jsonFormatSection.getKeys(false)) {
30-
int priority = jsonFormatSection.getInt(jsonFormat + ".priority", 0);
31-
List<JsonAttribute> jsonAttributes = new ArrayList<>();
32-
ConfigurationSection jsonAttributeSection = jsonFormatSection.getConfigurationSection(jsonFormat + ".json_attributes");
33-
if (jsonAttributeSection != null) {
34-
for (String attribute : jsonAttributeSection.getKeys(false)) {
35-
List<String> hoverText = jsonAttributeSection.getStringList(attribute + ".hover_text");
36-
String clickAction = jsonAttributeSection.getString(attribute + ".click_action", "");
37-
String clickText = jsonAttributeSection.getString(attribute + ".click_text", "");
38-
jsonAttributes.add(new JsonAttribute(attribute, hoverText, clickAction, clickText));
39-
}
40-
}
41-
jsonFormats.put(jsonFormat.toLowerCase(), new JsonFormat(jsonFormat, priority, jsonAttributes));
42-
}
43-
}
28+
public static void initialize() {
29+
jsonFormats = new HashMap<String, JsonFormat>();
30+
ConfigurationSection jsonFormatSection = plugin.getConfig().getConfigurationSection("jsonformatting");
31+
for (String jsonFormat : jsonFormatSection.getKeys(false)) {
32+
int priority = jsonFormatSection.getInt(jsonFormat + ".priority", 0);
33+
List<JsonAttribute> jsonAttributes = new ArrayList<>();
34+
ConfigurationSection jsonAttributeSection = jsonFormatSection.getConfigurationSection(jsonFormat + ".json_attributes");
35+
if (jsonAttributeSection != null) {
36+
for (String attribute : jsonAttributeSection.getKeys(false)) {
37+
List<String> hoverText = jsonAttributeSection.getStringList(attribute + ".hover_text");
38+
String clickActionText = jsonAttributeSection.getString(attribute + ".click_action", "none");
39+
try {
40+
ClickAction clickAction = ClickAction.valueOf(clickActionText.toUpperCase());
41+
String clickText = jsonAttributeSection.getString(attribute + ".click_text", "");
42+
jsonAttributes.add(new JsonAttribute(attribute, hoverText, clickAction, clickText));
43+
} catch (IllegalArgumentException | NullPointerException exception) {
44+
plugin.getServer().getConsoleSender()
45+
.sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Illegal click_action: " + clickActionText + " in jsonFormat: " + jsonFormat));
46+
}
47+
}
48+
}
49+
jsonFormats.put(jsonFormat.toLowerCase(), new JsonFormat(jsonFormat, priority, jsonAttributes));
50+
}
51+
}
4452

45-
public static Collection<JsonFormat> getJsonFormats() {
46-
return jsonFormats.values();
47-
}
53+
public static Collection<JsonFormat> getJsonFormats() {
54+
return jsonFormats.values();
55+
}
4856

49-
public static JsonFormat getJsonFormat(String name) {
50-
return jsonFormats.get(name.toLowerCase());
51-
}
57+
public static JsonFormat getJsonFormat(String name) {
58+
return jsonFormats.get(name.toLowerCase());
59+
}
5260

53-
public String getName() {
54-
return name;
55-
}
61+
public String getName() {
62+
return name;
63+
}
5664

57-
public int getPriority() {
58-
return priority;
59-
}
60-
61-
public List<JsonAttribute> getJsonAttributes() {
62-
return jsonAttributes;
63-
}
65+
public int getPriority() {
66+
return priority;
67+
}
68+
69+
public List<JsonAttribute> getJsonAttributes() {
70+
return jsonAttributes;
71+
}
6472
}

‎src/main/java/mineverse/Aust1n46/chat/utilities/Format.java‎

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.regex.Pattern;
1111
import java.util.stream.Collectors;
1212

13+
import org.apache.commons.lang.StringUtils;
1314
import org.bukkit.Bukkit;
1415
import org.bukkit.ChatColor;
1516
import org.bukkit.Sound;
@@ -22,6 +23,7 @@
2223
import com.comphenix.protocol.wrappers.WrappedChatComponent;
2324

2425
import me.clip.placeholderapi.PlaceholderAPI;
26+
import mineverse.Aust1n46.chat.ClickAction;
2527
import mineverse.Aust1n46.chat.api.MineverseChatAPI;
2628
import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
2729
import mineverse.Aust1n46.chat.json.JsonAttribute;
@@ -112,28 +114,45 @@ private static String convertPlaceholders(String s, JsonFormat format, Mineverse
112114
formattedPlaceholder = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), placeholder));
113115
temp += convertToJsonColors(lastCode + remaining.substring(0, indexStart)) + ",";
114116
lastCode = getLastCode(lastCode + remaining.substring(0, indexStart));
115-
String action = "";
116-
String text = "";
117-
String hover = "";
117+
boolean placeholderHasJsonAttribute = false;
118118
for (JsonAttribute jsonAttribute : format.getJsonAttributes()) {
119119
if (placeholder.contains(jsonAttribute.getName().replace("{", "").replace("}", ""))) {
120-
action = jsonAttribute.getClickAction();
121-
text = Format.FormatStringAll(
122-
PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), jsonAttribute.getClickText()));
120+
final StringBuilder hover = new StringBuilder();
123121
for (String st : jsonAttribute.getHoverText()) {
124-
hover += Format.FormatStringAll(st) + "\n";
122+
hover.append(Format.FormatStringAll(st) + "\n");
125123
}
124+
final String hoverText;
125+
if(!hover.isEmpty()) {
126+
hoverText = Format.FormatStringAll(
127+
PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), hover.substring(0, hover.length() - 1)));
128+
} else {
129+
hoverText = StringUtils.EMPTY;
130+
}
131+
final ClickAction clickAction = jsonAttribute.getClickAction();
132+
final String actionJson;
133+
if (clickAction == ClickAction.NONE) {
134+
actionJson = StringUtils.EMPTY;
135+
} else {
136+
final String clickText = Format.FormatStringAll(
137+
PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), jsonAttribute.getClickText()));
138+
actionJson = ",\"clickEvent\":{\"action\":\"" + jsonAttribute.getClickAction().toString() + "\",\"value\":\"" + clickText
139+
+ "\"}";
140+
}
141+
final String hoverJson;
142+
if (hoverText.isEmpty()) {
143+
hoverJson = StringUtils.EMPTY;
144+
} else {
145+
hoverJson = ",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":["
146+
+ convertToJsonColors(hoverText) + "]}}";
147+
}
148+
temp += convertToJsonColors(lastCode + formattedPlaceholder, actionJson + hoverJson) + ",";
149+
placeholderHasJsonAttribute = true;
150+
break;
126151
}
127152
}
128-
if(!hover.isEmpty()) {
129-
hover = Format.FormatStringAll(
130-
PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), hover.substring(0, hover.length() - 1)));
153+
if (!placeholderHasJsonAttribute) {
154+
temp += convertToJsonColors(lastCode + formattedPlaceholder) + ",";
131155
}
132-
temp += convertToJsonColors(lastCode + formattedPlaceholder,
133-
",\"clickEvent\":{\"action\":\"" + action + "\",\"value\":\"" + text
134-
+ "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":["
135-
+ convertToJsonColors(hover) + "]}}")
136-
+ ",";
137156
lastCode = getLastCode(lastCode + formattedPlaceholder);
138157
remaining = remaining.substring(indexEnd);
139158
} else {

‎src/main/resources/config.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ messageremovertext: '&c&o<message removed>'
136136
# The name of the group is the permissions node for the format
137137
# Example: venturechat.json.Owner is the node for the group Owner
138138
# A lower priority overrides a higher priority if a player has more than 1 group
139-
# Possible options for click_name and click_prefix are suggest_command, run_command, and open_url
139+
# Possible options for click_action are suggest_command, run_command, open_url, and none
140140
jsonformatting:
141141
Default: # This default format is required! Do not delete or rename it!
142142
priority: 2147483647 # Integer.MAX_VALUE

0 commit comments

Comments
 (0)