Fix double underscore escaping still happening with MiniMessage, refactor formatter

This commit is contained in:
William 2023-03-12 19:23:48 +00:00
parent 0805a3114d
commit ee820967de
No known key found for this signature in database
6 changed files with 71 additions and 44 deletions

View File

@ -8,6 +8,7 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ProxyServer;
import net.william278.annotaml.Annotaml; import net.william278.annotaml.Annotaml;
import net.william278.velocitab.config.Formatter;
import net.william278.velocitab.config.Settings; import net.william278.velocitab.config.Settings;
import net.william278.velocitab.hook.Hook; import net.william278.velocitab.hook.Hook;
import net.william278.velocitab.hook.LuckPermsHook; import net.william278.velocitab.hook.LuckPermsHook;
@ -66,6 +67,11 @@ public class Velocitab {
return settings; return settings;
} }
@NotNull
public Formatter getFormatter() {
return getSettings().getFormatter();
}
private void loadSettings() { private void loadSettings() {
try { try {
settings = Annotaml.create( settings = Annotaml.create(

View File

@ -0,0 +1,49 @@
package net.william278.velocitab.config;
import de.themoep.minedown.adventure.MineDown;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.william278.velocitab.Velocitab;
import net.william278.velocitab.player.TabPlayer;
import org.apache.commons.lang3.function.TriFunction;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
/**
* Different formatting markup options for the TAB list
*/
@SuppressWarnings("unused")
public enum Formatter {
MINEDOWN((text, player, plugin) -> new MineDown(text).toComponent(),
(text) -> text.replace("__", "_\\_")),
MINIMESSAGE((text, player, plugin) -> plugin.getMiniPlaceholdersHook()
.map(hook -> hook.format(text, player.getPlayer()))
.orElse(MiniMessage.miniMessage().deserialize(text)),
(text) -> MiniMessage.miniMessage().escapeTags(text));
/**
* Function to apply formatting to a string
*/
private final TriFunction<String, TabPlayer, Velocitab, Component> formatter;
/**
* Function to escape formatting characters in a string
*/
private final Function<String, String> escaper;
Formatter(@NotNull TriFunction<String, TabPlayer, Velocitab, Component> formatter, @NotNull Function<String, String> escaper) {
this.formatter = formatter;
this.escaper = escaper;
}
@NotNull
public Component format(@NotNull String text, @NotNull TabPlayer player, @NotNull Velocitab plugin) {
return formatter.apply(text, player, plugin);
}
@NotNull
public String escape(@NotNull String text) {
return escaper.apply(text);
}
}

View File

@ -22,23 +22,26 @@ public enum Placeholder {
.orElse("")), .orElse("")),
CURRENT_DATE((plugin, player) -> DateTimeFormatter.ofPattern("dd MMM yyyy").format(LocalDateTime.now())), CURRENT_DATE((plugin, player) -> DateTimeFormatter.ofPattern("dd MMM yyyy").format(LocalDateTime.now())),
CURRENT_TIME((plugin, player) -> DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now())), CURRENT_TIME((plugin, player) -> DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now())),
USERNAME((plugin, player) -> escape(player.getPlayer().getUsername())), USERNAME((plugin, player) -> plugin.getFormatter().escape(player.getPlayer().getUsername())),
SERVER((plugin, player) -> player.getServerName()), SERVER((plugin, player) -> player.getServerName()),
PING((plugin, player) -> Long.toString(player.getPlayer().getPing())), PING((plugin, player) -> Long.toString(player.getPlayer().getPing())),
PREFIX((plugin, player) -> player.getRole().getPrefix().orElse("")), PREFIX((plugin, player) -> player.getRole().getPrefix().orElse("")),
SUFFIX((plugin, player) -> player.getRole().getSuffix().orElse("")), SUFFIX((plugin, player) -> player.getRole().getSuffix().orElse("")),
ROLE((plugin, player) -> player.getRole().getName().orElse("")), ROLE((plugin, player) -> player.getRole().getName().orElse("")),
DEBUG_TEAM_NAME((plugin, player) -> escape(player.getTeamName())); DEBUG_TEAM_NAME((plugin, player) -> plugin.getFormatter().escape(player.getTeamName()));
private final BiFunction<Velocitab, TabPlayer, String> formatter; /**
* Function to replace placeholders with a real value
*/
private final BiFunction<Velocitab, TabPlayer, String> replacer;
Placeholder(@NotNull BiFunction<Velocitab, TabPlayer, String> formatter) { Placeholder(@NotNull BiFunction<Velocitab, TabPlayer, String> replacer) {
this.formatter = formatter; this.replacer = replacer;
} }
public static CompletableFuture<String> format(@NotNull String format, @NotNull Velocitab plugin, @NotNull TabPlayer player) { public static CompletableFuture<String> replace(@NotNull String format, @NotNull Velocitab plugin, @NotNull TabPlayer player) {
for (Placeholder placeholder : values()) { for (Placeholder placeholder : values()) {
format = format.replace("%" + placeholder.name().toLowerCase() + "%", placeholder.formatter.apply(plugin, player)); format = format.replace("%" + placeholder.name().toLowerCase() + "%", placeholder.replacer.apply(plugin, player));
} }
final String replaced = format; final String replaced = format;
@ -47,9 +50,4 @@ public enum Placeholder {
.orElse(CompletableFuture.completedFuture(replaced)); .orElse(CompletableFuture.completedFuture(replaced));
} }
// Replace __ so that it is not seen as underline when the string is formatted.
@NotNull
private static String escape(String replace) {
return replace.replace("__", "_\\_");
}
} }

View File

@ -1,16 +1,11 @@
package net.william278.velocitab.config; package net.william278.velocitab.config;
import de.themoep.minedown.adventure.MineDown;
import lombok.Getter; import lombok.Getter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.william278.annotaml.YamlComment; import net.william278.annotaml.YamlComment;
import net.william278.annotaml.YamlFile; import net.william278.annotaml.YamlFile;
import net.william278.annotaml.YamlKey; import net.william278.annotaml.YamlKey;
import net.william278.velocitab.Velocitab; import net.william278.velocitab.Velocitab;
import net.william278.velocitab.player.TabPlayer;
import org.apache.commons.lang3.function.TriFunction;
import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.text.StringEscapeUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -117,25 +112,4 @@ public class Settings {
return updateRate; return updateRate;
} }
/**
* Different formatting markup options for the TAB list
*/
@SuppressWarnings("unused")
public enum Formatter {
MINEDOWN((text, player, plugin) -> new MineDown(text).toComponent()),
MINIMESSAGE((text, player, plugin) -> plugin.getMiniPlaceholdersHook()
.map(hook -> hook.format(text, player.getPlayer()))
.orElse(MiniMessage.miniMessage().deserialize(text)));
private final TriFunction<String, TabPlayer, Velocitab, Component> formatter;
Formatter(@NotNull TriFunction<String, TabPlayer, Velocitab, Component> formatter) {
this.formatter = formatter;
}
@NotNull
public Component format(@NotNull String text, @NotNull TabPlayer player, @NotNull Velocitab plugin) {
return formatter.apply(text, player, plugin);
}
}
} }

View File

@ -40,8 +40,8 @@ public final class TabPlayer implements Comparable<TabPlayer> {
@NotNull @NotNull
public CompletableFuture<Component> getDisplayName(@NotNull Velocitab plugin) { public CompletableFuture<Component> getDisplayName(@NotNull Velocitab plugin) {
final String serverGroup = plugin.getSettings().getServerGroup(getServerName()); final String serverGroup = plugin.getSettings().getServerGroup(getServerName());
return Placeholder.format(plugin.getSettings().getFormat(serverGroup), plugin, this) return Placeholder.replace(plugin.getSettings().getFormat(serverGroup), plugin, this)
.thenApply(formatted -> plugin.getSettings().getFormatter().format(formatted, this, plugin)); .thenApply(formatted -> plugin.getFormatter().format(formatted, this, plugin));
} }

View File

@ -152,16 +152,16 @@ public class PlayerTabList {
} }
public CompletableFuture<Component> getHeader(@NotNull TabPlayer player) { public CompletableFuture<Component> getHeader(@NotNull TabPlayer player) {
return Placeholder.format(plugin.getSettings().getHeader( return Placeholder.replace(plugin.getSettings().getHeader(
plugin.getSettings().getServerGroup(player.getServerName())), plugin, player) plugin.getSettings().getServerGroup(player.getServerName())), plugin, player)
.thenApply(header -> plugin.getSettings().getFormatter().format(header, player, plugin)); .thenApply(header -> plugin.getFormatter().format(header, player, plugin));
} }
public CompletableFuture<Component> getFooter(@NotNull TabPlayer player) { public CompletableFuture<Component> getFooter(@NotNull TabPlayer player) {
return Placeholder.format(plugin.getSettings().getFooter( return Placeholder.replace(plugin.getSettings().getFooter(
plugin.getSettings().getServerGroup(player.getServerName())), plugin, player) plugin.getSettings().getServerGroup(player.getServerName())), plugin, player)
.thenApply(footer -> plugin.getSettings().getFormatter().format(footer, player, plugin)); .thenApply(footer -> plugin.getFormatter().format(footer, player, plugin));
} }