Skip to content

Commit fb669aa

Browse files
authored
Remove extractUrls from default legacy serializer (#6492)
extractUrls on the default LegacyComponentSerializer caused legacyToMini to auto-wrap URLs in <click:open_url> tags. When translation templates like discordCommandLink already wrapped {0} in their own click tag, this produced nested click events that Paper 1.21.11+ rejected. The default serializer no longer extracts URLs. A new legacyToMiniWithUrls method is available for cases that explicitly need clickable URL extraction (chat, broadcast). Fixes #6463
1 parent add5eb7 commit fb669aa

File tree

6 files changed

+33
-5
lines changed

6 files changed

+33
-5
lines changed

Essentials/src/main/java/com/earth2me/essentials/adventure/SpigotAdventureFacet.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,18 @@
2121

2222
public class SpigotAdventureFacet implements AdventureFacet {
2323
private static final LegacyComponentSerializer LEGACY_SERIALIZER;
24+
private static final LegacyComponentSerializer LEGACY_SERIALIZER_URLS;
2425
private static final MiniMessage MINI_MESSAGE_NO_TAGS;
2526

2627
static {
2728
final LegacyComponentSerializer.Builder builder = LegacyComponentSerializer.builder()
2829
.flattener(ComponentFlattener.basic())
29-
.extractUrls(AbstractChatEvent.URL_PATTERN)
3030
.useUnusualXRepeatedCharacterHexFormat();
3131
if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_1_R01)) {
3232
builder.hexColors();
3333
}
3434
LEGACY_SERIALIZER = builder.build();
35+
LEGACY_SERIALIZER_URLS = builder.extractUrls(AbstractChatEvent.URL_PATTERN).build();
3536

3637
MINI_MESSAGE_NO_TAGS = MiniMessage.builder().strict(true).build();
3738
}
@@ -127,6 +128,11 @@ public String stripTags(String input) {
127128
return miniMessageInstance.stripTags(input);
128129
}
129130

131+
@Override
132+
public String legacyToMiniWithUrls(String message) {
133+
return miniMessageInstance.serialize(LEGACY_SERIALIZER_URLS.deserialize(message));
134+
}
135+
130136
@Override
131137
public String escapeTags(String input) {
132138
return miniMessageInstance.escapeTags(input);

Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcast.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.earth2me.essentials.commands;
22

33
import com.earth2me.essentials.CommandSource;
4+
import com.earth2me.essentials.adventure.AdventureUtil;
45
import com.earth2me.essentials.utils.FormatUtil;
56
import org.bukkit.Server;
67

@@ -15,6 +16,9 @@ public void run(final Server server, final CommandSource sender, final String co
1516
throw new NotEnoughArgumentsException();
1617
}
1718

18-
ess.broadcastTl("broadcast", FormatUtil.replaceFormat(getFinalArg(args, 0)).replace("\\n", "\n"), sender.getDisplayName());
19+
final String message = FormatUtil.replaceFormat(getFinalArg(args, 0)).replace("\\n", "\n");
20+
ess.broadcastTl("broadcast",
21+
AdventureUtil.parsed(ess.getAdventureFacet().legacyToMiniWithUrls(ess.getAdventureFacet().escapeTags(message))),
22+
sender.getDisplayName());
1923
}
2024
}

Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ private void sendBroadcast(final World world, final String name, final String me
5454
if (message.isEmpty()) {
5555
throw new NotEnoughArgumentsException();
5656
}
57-
ess.broadcastTl(null, u -> !u.getBase().getWorld().equals(world), true, "broadcast", FormatUtil.replaceFormat(message).replace("\\n", "\n"), AdventureUtil.parsed(ess.getAdventureFacet().legacyToMini(name)));
57+
final String formatted = FormatUtil.replaceFormat(message).replace("\\n", "\n");
58+
ess.broadcastTl(null, u -> !u.getBase().getWorld().equals(world), true, "broadcast",
59+
AdventureUtil.parsed(
60+
ess.getAdventureFacet().legacyToMiniWithUrls(ess.getAdventureFacet().escapeTags(formatted))),
61+
AdventureUtil.parsed(ess.getAdventureFacet().legacyToMini(name)));
5862
}
5963

6064
@Override

EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,10 @@ protected void handleChatRecipients(AbstractChatEvent event) {
223223
server.getPluginManager().callEvent(spyEvent);
224224

225225
if (!spyEvent.isCancelled()) {
226-
final String legacyString = ess.getAdventureFacet().miniToLegacy(String.format(spyEvent.getFormat(), ess.getAdventureFacet().legacyToMini(user.getDisplayName()), ess.getAdventureFacet().legacyToMini(ess.getAdventureFacet().escapeTags(spyEvent.getMessage()))));
226+
final String legacyString = ess.getAdventureFacet().miniToLegacy(
227+
String.format(spyEvent.getFormat(),
228+
ess.getAdventureFacet().legacyToMini(user.getDisplayName()),
229+
ess.getAdventureFacet().legacyToMiniWithUrls(ess.getAdventureFacet().escapeTags(spyEvent.getMessage()))));
227230

228231
for (final Player onlinePlayer : spyEvent.getRecipients()) {
229232
onlinePlayer.sendMessage(legacyString);

providers/BaseProviders/src/main/java/com/earth2me/essentials/adventure/AdventureFacet.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public interface AdventureFacet {
2424
*/
2525
String legacyToMini(String message, boolean useCustomTags);
2626

27+
/**
28+
* Converts a section sign legacy string to a MiniMessage string, auto-linking detected URLs as click events.
29+
*/
30+
String legacyToMiniWithUrls(String message);
31+
2732
/**
2833
* Convenience method for submodules to escape MiniMessage tags.
2934
*/

providers/PaperProvider/src/main/java/com/earth2me/essentials/adventure/PaperAdventureFacet.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
public class PaperAdventureFacet implements AdventureFacet {
1919
private final LegacyComponentSerializer legacySerializer;
20+
private final LegacyComponentSerializer legacySerializerUrls;
2021
private final MiniMessage miniMessageNoTags;
2122
private final MiniMessage miniMessageInstance;
2223

@@ -29,10 +30,10 @@ public PaperAdventureFacet(final String primaryColor, final String secondaryColo
2930

3031
final LegacyComponentSerializer.Builder builder = LegacyComponentSerializer.builder()
3132
.flattener(ComponentFlattener.basic())
32-
.extractUrls(AbstractChatEvent.URL_PATTERN)
3333
.hexColors()
3434
.useUnusualXRepeatedCharacterHexFormat();
3535
legacySerializer = builder.build();
36+
legacySerializerUrls = builder.extractUrls(AbstractChatEvent.URL_PATTERN).build();
3637

3738
miniMessageNoTags = MiniMessage.builder().strict(true).build();
3839

@@ -88,6 +89,11 @@ public String legacyToMini(String message, boolean useCustomTags) {
8889
}
8990
}
9091

92+
@Override
93+
public String legacyToMiniWithUrls(String message) {
94+
return miniMessageInstance.serialize(legacySerializerUrls.deserialize(message));
95+
}
96+
9197
@Override
9298
public String escapeTags(String input) {
9399
return miniMessageInstance.escapeTags(input);

0 commit comments

Comments
 (0)