Allow urls to be clickable in chat
This commit is contained in:
parent
47fb205001
commit
aebb1b83a5
|
|
@ -211,8 +211,10 @@ public final class Config {
|
||||||
|
|
||||||
// TODO prefixes need hovers, this hasn't been setup yet!
|
// TODO prefixes need hovers, this hasn't been setup yet!
|
||||||
public static String CHATFORMAT = "<white><light_purple><prefixall> <gray><hover:show_text:Click to message <sendername>><click:suggest_command:/msg <sendername> ><sender></hover>: <white><message>";
|
public static String CHATFORMAT = "<white><light_purple><prefixall> <gray><hover:show_text:Click to message <sendername>><click:suggest_command:/msg <sendername> ><sender></hover>: <white><message>";
|
||||||
|
public static String URLFORMAT = "<click:OPEN_URL:<clickurl>><url></click>";
|
||||||
private static void Chat() {
|
private static void Chat() {
|
||||||
CHATFORMAT = getString("chat.format", CHATFORMAT);
|
CHATFORMAT = getString("chat.format", CHATFORMAT);
|
||||||
|
URLFORMAT = getString("chat.urlformat", URLFORMAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<String> GACECOMMANDALIASES = new ArrayList<>();
|
public static List<String> GACECOMMANDALIASES = new ArrayList<>();
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,30 @@ package com.alttd.chat.util;
|
||||||
import com.alttd.chat.ChatAPI;
|
import com.alttd.chat.ChatAPI;
|
||||||
import com.alttd.chat.config.Config;
|
import com.alttd.chat.config.Config;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.TextComponent;
|
||||||
|
import net.kyori.adventure.text.format.Style;
|
||||||
|
import net.kyori.adventure.text.format.TextDecoration;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer;
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
import net.luckperms.api.LuckPerms;
|
import net.luckperms.api.LuckPerms;
|
||||||
import net.luckperms.api.model.group.Group;
|
import net.luckperms.api.model.group.Group;
|
||||||
import net.luckperms.api.model.user.User;
|
import net.luckperms.api.model.user.User;
|
||||||
import net.luckperms.api.node.Node;
|
import net.luckperms.api.node.Node;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class Utility {
|
public class Utility {
|
||||||
|
|
||||||
|
static final Pattern DEFAULT_URL_PATTERN = Pattern.compile("(?:(https?)://)?([-\\w_.]+\\.\\w{2,})(/\\S*)?");
|
||||||
|
static final Pattern URL_SCHEME_PATTERN = Pattern.compile("^[a-z][a-z0-9+\\-.]*:");
|
||||||
|
|
||||||
public static String stringRegen = "\\{#[A-Fa-f0-9]{6}(<)?(>)?}";
|
public static String stringRegen = "\\{#[A-Fa-f0-9]{6}(<)?(>)?}";
|
||||||
public static HashMap<String, String> colors;
|
public static HashMap<String, String> colors;
|
||||||
|
private static LegacyComponentSerializer legacySerializer;
|
||||||
static { // this might be in minimessage already?
|
static { // this might be in minimessage already?
|
||||||
colors = new HashMap<>();
|
colors = new HashMap<>();
|
||||||
colors.put("&0", "<black>");
|
colors.put("&0", "<black>");
|
||||||
|
|
@ -58,7 +69,7 @@ public class Utility {
|
||||||
.sorted(Comparator.comparingInt(o -> o.getWeight().orElse(0)))
|
.sorted(Comparator.comparingInt(o -> o.getWeight().orElse(0)))
|
||||||
.forEach(group -> {
|
.forEach(group -> {
|
||||||
if (Config.PREFIXGROUPS.contains(group.getName())) {
|
if (Config.PREFIXGROUPS.contains(group.getName())) {
|
||||||
prefix.append(group.getCachedData().getMetaData().getPrefix());
|
prefix.append(getGroupPrefix(group));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -80,6 +91,11 @@ public class Utility {
|
||||||
return applyColor(prefix.toString());
|
return applyColor(prefix.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getGroupPrefix(Group group) {
|
||||||
|
|
||||||
|
return group.getCachedData().getMetaData().getPrefix();
|
||||||
|
}
|
||||||
|
|
||||||
public static String getDisplayName(UUID uuid, String playerName) {
|
public static String getDisplayName(UUID uuid, String playerName) {
|
||||||
if (!playerName.isBlank()) return playerName;
|
if (!playerName.isBlank()) return playerName;
|
||||||
LuckPerms luckPerms = ChatAPI.get().getLuckPerms();
|
LuckPerms luckPerms = ChatAPI.get().getLuckPerms();
|
||||||
|
|
@ -176,4 +192,30 @@ public class Utility {
|
||||||
return stringBuilder.length()==0 ? miniMessage.parse(message)
|
return stringBuilder.length()==0 ? miniMessage.parse(message)
|
||||||
: miniMessage.parse(stringBuilder.toString());
|
: miniMessage.parse(stringBuilder.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String formatText(String message) {
|
||||||
|
/*
|
||||||
|
.match(pattern)
|
||||||
|
.replacement(url -> {
|
||||||
|
String clickUrl = url.content();
|
||||||
|
if (!URL_SCHEME_PATTERN.matcher(clickUrl).find()) {
|
||||||
|
clickUrl = "http://" + clickUrl;
|
||||||
|
}
|
||||||
|
return (style == null ? url : url.style(style)).clickEvent(ClickEvent.openUrl(clickUrl));
|
||||||
|
})
|
||||||
|
.build();
|
||||||
|
*/
|
||||||
|
Matcher matcher = DEFAULT_URL_PATTERN.matcher(message);
|
||||||
|
while (matcher.find()) {
|
||||||
|
String url = matcher.group();
|
||||||
|
String clickUrl = url;
|
||||||
|
String urlFormat = Config.URLFORMAT;
|
||||||
|
if (!URL_SCHEME_PATTERN.matcher(clickUrl).find()) {
|
||||||
|
clickUrl = "http://" + clickUrl;
|
||||||
|
}
|
||||||
|
message = message.replace(url, urlFormat.replaceAll("<url>", url).replaceAll("<clickurl>", clickUrl));
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.minimessage.Template;
|
import net.kyori.adventure.text.minimessage.Template;
|
||||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||||
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
@ -58,6 +59,8 @@ public class ChatHandler {
|
||||||
if(updatedMessage.contains("[i]"))
|
if(updatedMessage.contains("[i]"))
|
||||||
updatedMessage = updatedMessage.replace("[i]", "<[i]>");
|
updatedMessage = updatedMessage.replace("[i]", "<[i]>");
|
||||||
|
|
||||||
|
updatedMessage = Utility.formatText(updatedMessage);
|
||||||
|
|
||||||
List<Template> templates = new ArrayList<>(List.of(
|
List<Template> templates = new ArrayList<>(List.of(
|
||||||
Template.of("message", updatedMessage),
|
Template.of("message", updatedMessage),
|
||||||
Template.of("sendername", player.getName()),
|
Template.of("sendername", player.getName()),
|
||||||
|
|
@ -110,6 +113,8 @@ public class ChatHandler {
|
||||||
if(updatedMessage.contains("[i]"))
|
if(updatedMessage.contains("[i]"))
|
||||||
updatedMessage = updatedMessage.replace("[i]", "<[i]>"); // end of todo
|
updatedMessage = updatedMessage.replace("[i]", "<[i]>"); // end of todo
|
||||||
|
|
||||||
|
updatedMessage = Utility.formatText(updatedMessage);
|
||||||
|
|
||||||
List<Template> templates = new ArrayList<>(List.of(
|
List<Template> templates = new ArrayList<>(List.of(
|
||||||
Template.of("sender", senderName),
|
Template.of("sender", senderName),
|
||||||
Template.of("prefix", prefix),
|
Template.of("prefix", prefix),
|
||||||
|
|
@ -145,6 +150,8 @@ public class ChatHandler {
|
||||||
|
|
||||||
if(updatedMessage.contains("[i]")) updatedMessage = updatedMessage.replace("[i]", "<[i]>");
|
if(updatedMessage.contains("[i]")) updatedMessage = updatedMessage.replace("[i]", "<[i]>");
|
||||||
|
|
||||||
|
updatedMessage = Utility.formatText(updatedMessage);
|
||||||
|
|
||||||
List<Template> templates = new ArrayList<>(List.of(
|
List<Template> templates = new ArrayList<>(List.of(
|
||||||
Template.of("sender", senderName),
|
Template.of("sender", senderName),
|
||||||
Template.of("message", updatedMessage),
|
Template.of("message", updatedMessage),
|
||||||
|
|
@ -179,6 +186,8 @@ public class ChatHandler {
|
||||||
|
|
||||||
if(updatedMessage.contains("[i]")) updatedMessage = updatedMessage.replace("[i]", "<[i]>");
|
if(updatedMessage.contains("[i]")) updatedMessage = updatedMessage.replace("[i]", "<[i]>");
|
||||||
|
|
||||||
|
updatedMessage = Utility.formatText(updatedMessage);
|
||||||
|
|
||||||
List<Template> templates = new ArrayList<>(List.of(
|
List<Template> templates = new ArrayList<>(List.of(
|
||||||
Template.of("sender", senderName),
|
Template.of("sender", senderName),
|
||||||
Template.of("sendername", senderName),
|
Template.of("sendername", senderName),
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,8 @@ public class ChatListener implements Listener, ChatRenderer {
|
||||||
if(message.contains("[i]"))
|
if(message.contains("[i]"))
|
||||||
message = message.replace("[i]", "<[i]>"); // end of todo
|
message = message.replace("[i]", "<[i]>"); // end of todo
|
||||||
|
|
||||||
|
message = Utility.formatText(message);
|
||||||
|
|
||||||
List<Template> templates = new ArrayList<>(List.of(
|
List<Template> templates = new ArrayList<>(List.of(
|
||||||
Template.of("message", message),
|
Template.of("message", message),
|
||||||
Template.of("[i]", ChatHandler.itemComponent(player.getInventory().getItemInMainHand()))
|
Template.of("[i]", ChatHandler.itemComponent(player.getInventory().getItemInMainHand()))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user