Add minimessage and utility class for it

This commit is contained in:
ceze88 2024-01-30 17:14:58 +01:00
parent b610b98547
commit a4b7e2d28d
4 changed files with 327 additions and 0 deletions

View File

@ -238,6 +238,20 @@
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.11.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-plain</artifactId>
<version>4.11.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.lucko</groupId>
<artifactId>jar-relocator</artifactId>

View File

@ -101,6 +101,8 @@ public abstract class SongodaPlugin extends JavaPlugin {
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "org;apache;commons", "commons-lang3", "3.12.0"));
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "net;kyori", "adventure-platform-bukkit", "4.1.1"));
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "net;kyori", "adventure-api", "4.11.0"));
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "net;kyori", "adventure-text-minimessage", "4.11.0"));
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "net;kyori", "adventure-text-serializer-plain", "4.11.0"));
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "org;slf4j", "slf4j-api", "2.0.11"));
dependencies.add(new Dependency("https://repo1.maven.org/maven2", "com;zaxxer", "HikariCP", "4.0.3", true,
new Relocation("org.slf4j", "com.craftaro.third_party.org.slf4j"))

View File

@ -0,0 +1,292 @@
package com.craftaro.core.chat;
import com.bekvon.bukkit.residence.commands.list;
import com.craftaro.core.compatibility.ServerProject;
import com.craftaro.core.compatibility.ServerVersion;
import com.gamingmesh.jobs.commands.list.placeholders;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class AdventureUtils {
private static Method displayNameMethod = null;
private static Method loreMethod = null;
static {
if (ServerProject.isServer(ServerProject.PAPER) && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) {
try {
displayNameMethod = ItemMeta.class.getDeclaredMethod("displayName", Component.class);
loreMethod = ItemMeta.class.getDeclaredMethod("lore", List.class);
} catch (Exception ignored) {}
}
}
//Send message
public static void sendMessage(Plugin plugin, Component message, Player... target) {
try (BukkitAudiences bukkitAudiences = BukkitAudiences.create(plugin)){
for (Player player : target) {
bukkitAudiences.player(player).sendMessage(message);
}
}
}
//Items
public static ItemStack formatItemName(ItemStack item, String name) {
return formatItemName(item, formatComponent(name));
}
public static ItemStack formatItemLore(ItemStack item, List<String> lore) {
return formatItemLore(item, lore.toArray(new String[0]));
}
public static ItemStack formatItemLore(ItemStack item, String... lore) {
return formatItemLore(item, formatComponent(lore));
}
public static ItemStack formatItemLore(ItemStack item, List<Component> lore, String... unused) {
return formatItemLore(item, lore.toArray(new Component[0]));
}
public static ItemStack formatItemName(ItemStack item, Component name) {
return setItemName(item, name);
}
public static ItemStack formatItemLore(ItemStack item, Component... lore) {
return setItemLore(item, lore);
}
public static boolean isMiniMessageEnabled() {
return ServerProject.isServer(ServerProject.PAPER) && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16) && displayNameMethod != null && loreMethod != null;
}
private static ItemStack setItemName(ItemStack item, Component name) {
ItemMeta meta = item.getItemMeta();
if (meta == null) return item;
if (isMiniMessageEnabled()) {
//Set names as component
try {
displayNameMethod.invoke(meta, name);
item.setItemMeta(meta);
return item;
} catch (Exception ignored) {}
}
meta.setDisplayName(toLegacy(name));
item.setItemMeta(meta);
return item;
}
private static ItemStack setItemLore(ItemStack item, Component... lore) {
ItemMeta meta = item.getItemMeta();
if (meta == null) return item;
if (isMiniMessageEnabled()) {
//Set names as component
try {
loreMethod.invoke(meta, Arrays.asList(lore));
item.setItemMeta(meta);
return item;
} catch (Exception ignored) {}
}
meta.setLore(toLegacy(lore));
item.setItemMeta(meta);
return item;
}
//Formatting stuff
public static Component formatComponent(String text) {
MiniMessage miniMessage = MiniMessage.builder().build();
Component component = MiniMessage.miniMessage().deserialize(replaceLegacy(text));
if (!component.hasDecoration(TextDecoration.ITALIC)) {
component = component.decoration(TextDecoration.ITALIC, false);
}
return component;
}
public static Component formatComponent(String text, MiniMessagePlaceholder...placeholders) {
MiniMessage miniMessage = MiniMessage.builder().editTags(builder -> {
Arrays.stream(placeholders).forEach(placeholder ->
builder.resolver(Placeholder.parsed(placeholder.getPlaceholder(), placeholder.getValue()))
);
}).build();
Component component = miniMessage.deserialize(replaceLegacy(text));
if (!component.hasDecoration(TextDecoration.ITALIC)) {
component = component.decoration(TextDecoration.ITALIC, false);
}
return component;
}
public static List<Component> formatComponent(List<String> list) {
List<Component> result = new ArrayList<>();
for (String line : list) {
result.add(formatComponent(line));
}
return result;
}
public static List<Component> formatComponent(String...list) {
List<Component> result = new ArrayList<>();
for (String line : list) {
result.add(formatComponent(line));
}
return result;
}
public static List<Component> formatComponent(List<String> list, MiniMessagePlaceholder... placeholders) {
List<Component> result = new ArrayList<>();
for (String line : list) {
result.add(formatComponent(line, placeholders));
}
return result;
}
public static String formatLegacy(String text) {
return ChatColor.translateAlternateColorCodes('&',
LegacyComponentSerializer.legacyAmpersand().serialize(MiniMessage.miniMessage().deserialize(replaceLegacy(text))));
}
public static List<String> formatLegacy(List<String> list) {
List<String> result = new ArrayList<>();
for (String line : list) {
result.add(formatLegacy(line));
}
return result;
}
public static List<String> formatLegacy(String... list) {
List<String> result = new ArrayList<>();
for (String line : list) {
result.add(formatLegacy(line));
}
return result;
}
public static String toLegacy(Component component) {
return LegacyComponentSerializer.legacySection().serialize(component);
}
public static List<String> toLegacy(List<Component> components) {
List<String> list = new ArrayList<>();
for (Component component : components) {
list.add(toLegacy(component));
}
return list;
}
public static List<String> toLegacy(Component... components) {
List<String> list = new ArrayList<>();
for (Component component : components) {
list.add(toLegacy(component));
}
return list;
}
public static String replaceLegacy(String legacy) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < legacy.length(); i++) {
char current = legacy.charAt(i);
char next = legacy.charAt(i == legacy.length() - 1 ? i : i + 1);
if (current == '§' || current == '&') {
if (next == 'x' && legacy.length() > i + 13) {
builder.append("<color:#");
builder.append(legacy.charAt(i + 3));
builder.append(legacy.charAt(i + 5));
builder.append(legacy.charAt(i + 7));
builder.append(legacy.charAt(i + 9));
builder.append(legacy.charAt(i + 11));
builder.append(legacy.charAt(i + 13));
builder.append(">");
i += 13;
continue;
}
String color = getColor(next);
builder.append(color);
i++;
} else {
builder.append(current);
}
}
return builder.toString();
}
public static String getColor(char c) {
ChatColor color = ChatColor.getByChar(c);
if (color == null) return null;
switch (c) {
case '0':
return "<black>";
case '1':
return "<dark_blue>";
case '2':
return "<dark_green>";
case '3':
return "<dark_aqua>";
case '4':
return "<dark_red>";
case '5':
return "<dark_purple>";
case '6':
return "<gold>";
case '7':
return "<gray>";
case '8':
return "<dark_gray>";
case '9':
return "<blue>";
case 'a':
return "<green>";
case 'b':
return "<aqua>";
case 'c':
return "<red>";
case 'd':
return "<light_purple>";
case 'e':
return "<yellow>";
case 'f':
return "<white>";
case 'k':
return "<obfuscated>";
case 'l':
return "<b>";
case 'm':
return "<st>";
case 'n':
return "<u>";
case 'o':
return "<i>";
case 'r':
return "<reset>";
default:
return "";
}
}
public static String clear(String msg) {
msg = msg.replaceAll("&[0-9kabcdefklmnor]", "");
msg = msg.replaceAll("§[0-9kabcdefklmnor]", "");
msg = msg.replaceAll("&#[0-9a-fA-F]{6}", "");
return PlainTextComponentSerializer.plainText().serialize(MiniMessage.miniMessage().deserialize(msg));
}
public static String clear(Component component) {
return PlainTextComponentSerializer.plainText().serialize(component);
}
}

View File

@ -0,0 +1,19 @@
package com.craftaro.core.chat;
public class MiniMessagePlaceholder {
private final String placeholder;
private final String value;
public MiniMessagePlaceholder(String placeholder, String value) {
this.placeholder = placeholder;
this.value = value;
}
public String getPlaceholder() {
return placeholder;
}
public String getValue() {
return value;
}
}