Skip to content

Commit 5947645

Browse files
authored
GH-162 Make url's force clickable. (#162)
1 parent d857e2b commit 5947645

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616
import net.kyori.adventure.platform.AudienceProvider;
1717
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
1818
import net.kyori.adventure.text.minimessage.MiniMessage;
19-
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
2019
import org.bstats.bukkit.Metrics;
2120
import org.bukkit.Server;
2221
import org.bukkit.plugin.Plugin;
23-
import org.bukkit.plugin.java.JavaPlugin;
2422

2523
import java.util.concurrent.TimeUnit;
2624

chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.eternalcode.formatter;
22

3+
import com.eternalcode.formatter.adventure.AdventureUrlPostProcessor;
34
import java.util.Optional;
45
import net.kyori.adventure.text.serializer.json.JSONOptions;
5-
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.builder;
66
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection;
77

88
import com.eternalcode.formatter.adventure.TextColorTagResolver;
@@ -75,6 +75,7 @@ class ChatHandlerImpl implements ChatHandler {
7575
.build();
7676

7777
private static final MiniMessage EMPTY_MESSAGE_DESERIALIZER = MiniMessage.builder()
78+
.postProcessor(new AdventureUrlPostProcessor())
7879
.tags(TagResolver.empty())
7980
.build();
8081

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.eternalcode.formatter.adventure;
2+
3+
import java.util.function.UnaryOperator;
4+
import java.util.regex.Pattern;
5+
import net.kyori.adventure.text.Component;
6+
import net.kyori.adventure.text.TextReplacementConfig;
7+
import net.kyori.adventure.text.event.ClickEvent;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
public class AdventureUrlPostProcessor implements UnaryOperator<Component> {
11+
12+
private static final Pattern URL_PATTERN = Pattern.compile("https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()!@:%_\\+.~#?&\\/\\/=]*)");
13+
14+
public static final @NotNull TextReplacementConfig CLICKABLE_URL_CONFIG = TextReplacementConfig.builder()
15+
.match(URL_PATTERN)
16+
.replacement(url -> url.clickEvent(ClickEvent.openUrl(url.content())))
17+
.build();
18+
19+
@Override
20+
public Component apply(Component component) {
21+
return component.replaceText(CLICKABLE_URL_CONFIG);
22+
}
23+
}

0 commit comments

Comments
 (0)