Skip to content

Commit b3e42d6

Browse files
committed
Add unicode normalization and apply Formatter to every message
1 parent 99d2290 commit b3e42d6

File tree

4 files changed

+59
-10
lines changed
  • api/src/main/java/io/github/_4drian3d/chatregulator/api/utils
  • common/src/main/java/io/github/_4drian3d/chatregulator/common/configuration
  • plugin/src

4 files changed

+59
-10
lines changed

api/src/main/java/io/github/_4drian3d/chatregulator/api/utils/Replacer.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github._4drian3d.chatregulator.api.utils;
22

3+
import java.text.Normalizer;
34
import java.util.Objects;
45

56
import org.jetbrains.annotations.NotNull;
@@ -38,20 +39,26 @@ private Replacer() {
3839
*/
3940
public static @NotNull String addFinalDot(@NotNull final String string) {
4041
Objects.requireNonNull(string);
41-
if (string.length() <= 1 || string.charAt(string.length() - 1) == '.') {
42+
if (string.length() <= 1 || string.length() >= 256 || string.charAt(string.length() - 1) == '.') {
4243
return string;
4344
}
4445

4546
return string + ".";
4647
}
4748

49+
public static @NotNull String unicodeNormalize(@NotNull final String string, @NotNull final Normalizer.Form form) {
50+
Objects.requireNonNull(string);
51+
final String normalized = Normalizer.normalize(string, form);
52+
return normalized.length() > 256 ? normalized.substring(0, 256) : normalized;
53+
}
54+
4855
/**
4956
* Applies a trailing dot and a leading capital letter to the specified string
5057
*
5158
* @param string the string
5259
* @return the string converted
5360
*/
5461
public static @NotNull String applyFormat(final @NotNull String string) {
55-
return firstLetterUppercase(addFinalDot(string));
62+
return firstLetterUppercase(addFinalDot(unicodeNormalize(string, Normalizer.Form.NFC)));
5663
}
5764
}

common/src/main/java/io/github/_4drian3d/chatregulator/common/configuration/Configuration.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package io.github._4drian3d.chatregulator.common.configuration;
22

3+
import java.text.Normalizer;
34
import java.util.Set;
45
import java.util.concurrent.TimeUnit;
56

67
import io.github._4drian3d.chatregulator.api.enums.*;
78
import io.github._4drian3d.chatregulator.api.utils.Commands;
89
import net.kyori.adventure.audience.Audience;
10+
import org.jetbrains.annotations.NotNull;
911
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
1012
import org.spongepowered.configurate.objectmapping.meta.Comment;
1113
import org.spongepowered.configurate.objectmapping.meta.Setting;
@@ -96,6 +98,14 @@ public static class Formatter {
9698
@Setting(value = "final-dot")
9799
private boolean finalDot = true;
98100

101+
@Comment("Apply unicode normalization to each sentence")
102+
@Setting(value = "unicode-normalize")
103+
private boolean unicodeNormalize = true;
104+
105+
@Comment("The unicode normalization form to apply")
106+
@Setting(value = "unicode-normalization-form")
107+
private @NotNull Normalizer.Form unicodeNormalizationForm = Normalizer.Form.NFC;
108+
99109
public boolean enabled(){
100110
return this.enabled;
101111
}
@@ -107,6 +117,14 @@ public boolean setFirstLetterUppercase(){
107117
public boolean setFinalDot(){
108118
return this.finalDot;
109119
}
120+
121+
public boolean setUnicodeNormalize(){
122+
return this.unicodeNormalize;
123+
}
124+
125+
public @NotNull Normalizer.Form setUnicodeNormalizationForm() {
126+
return this.unicodeNormalizationForm;
127+
}
110128
}
111129

112130
@ConfigSerializable

plugin/src/main/java/io/github/_4drian3d/chatregulator/plugin/listener/chat/ChatListener.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,26 @@ public final class ChatListener implements RegulatorExecutor<PlayerChatEvent> {
7171
this.eventManager.fireAndForget(new ChatInfractionEvent(player, deniedResult.infractionType(), checkResult, event.getMessage()));
7272
player.onDetection(deniedResult, event.getMessage());
7373
event.setResult(ChatResult.denied());
74-
} else if (checkResult instanceof final CheckResult.ReplaceCheckResult replaceResult) {
75-
String finalMessage = replaceResult.replaced();
74+
} else {
75+
String finalMessage;
76+
if (checkResult instanceof final CheckResult.ReplaceCheckResult replaceResult) {
77+
finalMessage = replaceResult.replaced();
78+
79+
this.eventManager.fireAndForget(new ChatInfractionEvent(player, replaceResult.infractionType(), checkResult, event.getMessage()));
80+
player.onDetection(replaceResult, event.getMessage());
81+
} else {
82+
finalMessage = event.getMessage();
83+
}
7684

7785
final Configuration.Formatter configuration = configurationContainer.get().getFormatterConfig();
7886
if (configuration.enabled()) {
7987
finalMessage = applyFormat(finalMessage, configuration);
8088
}
89+
8190
player.getChain(SourceType.CHAT).executed(event.getMessage());
82-
this.eventManager.fireAndForget(new ChatInfractionEvent(player, replaceResult.infractionType(), checkResult, event.getMessage()));
83-
player.onDetection(replaceResult, event.getMessage());
84-
event.setResult(ChatResult.message(finalMessage));
85-
} else {
86-
player.getChain(SourceType.CHAT).executed(event.getMessage());
91+
if (!finalMessage.equals(event.getMessage())) {
92+
event.setResult(ChatResult.message(finalMessage));
93+
}
8794
}
8895
}).exceptionally(ex -> {
8996
logger.error("An error occurred while setting chat result", ex);
@@ -103,7 +110,7 @@ public PostOrder postOrder() {
103110
}
104111

105112
public static @NotNull String applyFormat(final @NotNull String string, Configuration.Formatter config) {
106-
return firstLetterUppercase(addFinalDot(string, config), config);
113+
return firstLetterUppercase(addFinalDot(unicodeNormalize(string, config), config), config);
107114
}
108115
public static @NotNull String firstLetterUppercase(@NotNull final String string, Configuration.Formatter config) {
109116
if (!config.setFirstLetterUppercase()) return string;
@@ -114,4 +121,8 @@ public static String addFinalDot(final String string, Configuration.Formatter co
114121
? Replacer.addFinalDot(string)
115122
: string;
116123
}
124+
125+
public static @NotNull String unicodeNormalize(@NotNull final String string, Configuration.Formatter config) {
126+
return config.setUnicodeNormalize() ? Replacer.unicodeNormalize(string, config.setUnicodeNormalizationForm()) : string;
127+
}
117128
}

plugin/src/test/java/io/github/_4drian3d/chatregulator/modules/ReplacerTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.junit.jupiter.api.DisplayName;
55
import org.junit.jupiter.api.Test;
66

7+
import java.text.Normalizer;
8+
79
import static org.junit.jupiter.api.Assertions.assertEquals;
810

911
class ReplacerTest {
@@ -28,6 +30,17 @@ void finalDot(){
2830
assertEquals(replaced, expected);
2931
}
3032

33+
@Test
34+
@DisplayName("Unicode Normalize")
35+
void unicodeNormalize() {
36+
String original = "\u1100\uAC00\u11A8";
37+
String expected = "\u1100\uAC01";
38+
39+
String replaced = Replacer.unicodeNormalize(original, Normalizer.Form.NFC);
40+
41+
assertEquals(expected, replaced);
42+
}
43+
3144
@Test
3245
@DisplayName("Full Format")
3346
void applyFullFormat(){

0 commit comments

Comments
 (0)