Skip to content

Commit 57224ac

Browse files
committed
Fix legacy color processing
1 parent 4714b3b commit 57224ac

File tree

5 files changed

+73
-12
lines changed

5 files changed

+73
-12
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ dependencies {
4343

4444
// test
4545
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
46+
testImplementation("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT")
4647
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
4748
}
4849

src/main/java/com/eternalcode/formatter/ChatController.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.kyori.adventure.identity.Identity;
88
import net.kyori.adventure.platform.AudienceProvider;
99
import net.kyori.adventure.text.Component;
10-
import net.kyori.adventure.text.TextComponent;
1110
import net.kyori.adventure.text.minimessage.MiniMessage;
1211
import org.bukkit.entity.Player;
1312
import org.bukkit.event.EventHandler;
@@ -63,16 +62,15 @@ void onChat(AsyncPlayerChatEvent event) {
6362
String withFormat = this.placeholderRegistry.format(withTemplates, player);
6463
String withMessage = String.format(withFormat, player.getDisplayName(), event.getMessage());
6564

66-
TextComponent withLegacyColors = Legacy.LEGACY_SERIALIZER.deserialize(withMessage);
67-
String withAmpersands = Legacy.LEGACY_AMPERSAND_SERIALIZER.serialize(withLegacyColors);
68-
69-
Component component = miniMessage.deserialize(withAmpersands);
65+
String decolor = Legacy.decolor(withMessage);
66+
Component component = miniMessage.deserialize(decolor);
7067

7168
for (Player recipient : event.getRecipients()) {
7269
Audience recipientAudience = audienceProvider.player(recipient.getUniqueId());
7370

7471
recipientAudience.sendMessage(identity, component);
7572
}
73+
7674
}
7775

7876
}
Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
package com.eternalcode.formatter.legacy;
22

33
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
4+
import net.md_5.bungee.api.ChatColor;
5+
6+
import java.util.regex.Matcher;
47

58
public final class Legacy {
69

10+
private static final String AMPERSAND = "&";
11+
712
private Legacy() {
813
}
914

10-
public final static LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.builder()
11-
.hexColors()
12-
.useUnusualXRepeatedCharacterHexFormat()
13-
.build();
14-
1515
public final static LegacyComponentSerializer LEGACY_AMPERSAND_SERIALIZER = LegacyComponentSerializer.builder()
1616
.character('&')
1717
.hexColors()
1818
.useUnusualXRepeatedCharacterHexFormat()
1919
.build();
2020

21+
public static String decolor(String text) {
22+
Matcher matcher = ChatColor.STRIP_COLOR_PATTERN.matcher(text);
23+
StringBuilder builder = new StringBuilder(text);
24+
25+
while (matcher.find()) {
26+
String color = matcher.group(0);
27+
28+
builder.replace(matcher.start(), matcher.end(), AMPERSAND + color.charAt(1));
29+
}
30+
31+
return builder.toString();
32+
}
33+
2134
}
Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,46 @@
11
package com.eternalcode.formatter.legacy;
22

33
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.ComponentLike;
5+
import net.kyori.adventure.text.TextComponent;
6+
import net.kyori.adventure.text.TextReplacementConfig;
47

8+
import java.util.function.BiFunction;
9+
import java.util.function.Consumer;
510
import java.util.function.UnaryOperator;
11+
import java.util.regex.MatchResult;
612
import java.util.regex.Pattern;
713

8-
public class LegacyProcessor implements UnaryOperator<Component> {
14+
public final class LegacyProcessor implements UnaryOperator<Component> {
15+
16+
private final static Replacer REPLACER = new Replacer();
17+
918
@Override
1019
public Component apply(Component component) {
11-
return component.replaceText(builder -> builder.match(Pattern.compile(".*")).replacement((matchResult, builder1) -> Legacy.LEGACY_AMPERSAND_SERIALIZER.deserialize(matchResult.group())));
20+
return component.replaceText(REPLACER);
21+
}
22+
23+
private final static class Replacer implements Consumer<TextReplacementConfig.Builder> {
24+
25+
private final static Pattern ALL = Pattern.compile(".*");
26+
private final static Replacement REPLACEMENT = new Replacement();
27+
28+
@Override
29+
public void accept(TextReplacementConfig.Builder builder) {
30+
builder
31+
.match(ALL)
32+
.replacement(REPLACEMENT);
33+
}
34+
35+
}
36+
37+
private final static class Replacement implements BiFunction<MatchResult, TextComponent.Builder, ComponentLike> {
38+
39+
@Override
40+
public ComponentLike apply(MatchResult matchResult, TextComponent.Builder builder) {
41+
return Legacy.LEGACY_AMPERSAND_SERIALIZER.deserialize(matchResult.group());
42+
}
43+
1244
}
45+
1346
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.eternalcode.formatter.legacy;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.*;
6+
7+
class LegacyTest {
8+
9+
@Test
10+
void test() {
11+
String text = Legacy.decolor("§c SIEMA § test§a!");
12+
13+
assertEquals("&c SIEMA § test&a!", text);
14+
}
15+
16+
}

0 commit comments

Comments
 (0)