From 58f8176dae4807ec5bb09a500e2904fbd967d588 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:29:02 +0800 Subject: [PATCH 1/8] Bukkit Audience --- src/main/java/fr/xephi/authme/AuthMe.java | 16 +++++++++ .../xephi/authme/listener/PlayerListener.java | 3 +- .../fr/xephi/authme/message/Messages.java | 11 +++--- .../authme/service/AdventureService.java | 35 +++++++++++++++++++ .../authme/util/message/MiniMessageUtils.java | 12 +++++++ 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/main/java/fr/xephi/authme/service/AdventureService.java diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index fd51e70fe..bad299b65 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -31,6 +31,7 @@ import fr.xephi.authme.mail.EmailService; import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.security.crypts.Sha256; +import fr.xephi.authme.service.AdventureService; import fr.xephi.authme.service.BackupService; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.MigrationService; @@ -81,6 +82,7 @@ public class AuthMe extends JavaPlugin { private EmailService emailService; private CommandHandler commandHandler; private static TaskScheduler scheduler; + private static AdventureService adventureService; @Inject public static Settings settings; private DataSource database; @@ -139,6 +141,13 @@ public static TaskScheduler getScheduler() { return scheduler; } + /** + * Get the AdventureService + */ + public static AdventureService getAdventureService() { + return adventureService; + } + /** * The library manager */ @@ -153,6 +162,8 @@ public void onEnable() { loadPluginInfo(getDescription().getVersion()); scheduler = UniversalScheduler.getScheduler(this); libraryManager = new BukkitLibraryManager(this); + adventureService = new AdventureService(this); + adventureService.init(); // Set the Logger instance and log file path ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME)); @@ -403,6 +414,11 @@ public void onDisable() { // Wait for tasks and close data source new TaskCloser(database).run(); + // Close AdventureService + if (adventureService != null) { + adventureService.close(); + } + // Disabled correctly Consumer infoLogMethod = logger == null ? getLogger()::info : logger::info; infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " is unloaded successfully!"); diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index b24da9da2..2a0f8a029 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -21,7 +21,6 @@ import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.util.TeleportUtils; import fr.xephi.authme.util.message.I18NUtils; -import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.HumanEntity; @@ -219,7 +218,7 @@ public void onJoinMessage(PlayerJoinEvent event) { String customJoinMessage = settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE); if (!customJoinMessage.isEmpty()) { - customJoinMessage = ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(customJoinMessage)); + customJoinMessage = ChatColor.translateAlternateColorCodes('&', customJoinMessage); event.setJoinMessage(customJoinMessage .replace("{PLAYERNAME}", player.getName()) .replace("{DISPLAYNAME}", player.getDisplayName()) diff --git a/src/main/java/fr/xephi/authme/message/Messages.java b/src/main/java/fr/xephi/authme/message/Messages.java index 0d7ec317e..4ae0e8f2c 100644 --- a/src/main/java/fr/xephi/authme/message/Messages.java +++ b/src/main/java/fr/xephi/authme/message/Messages.java @@ -1,9 +1,11 @@ package fr.xephi.authme.message; import com.google.common.collect.ImmutableMap; +import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.mail.EmailService; import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.AdventureService; import fr.xephi.authme.util.expiring.Duration; import fr.xephi.authme.util.message.I18NUtils; import fr.xephi.authme.util.message.MiniMessageUtils; @@ -44,6 +46,7 @@ public class Messages { private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailService.class); private MessagesFileHandler messagesFileHandler; + private static final AdventureService adventureService = AuthMe.getAdventureService(); /* * Constructor. @@ -62,7 +65,7 @@ public class Messages { public void send(CommandSender sender, MessageKey key) { String[] lines = retrieve(key, sender); for (String line : lines) { - sender.sendMessage(line); + adventureService.send(sender, MiniMessageUtils.parseMiniMessage(line)); } } @@ -78,7 +81,7 @@ public void send(CommandSender sender, MessageKey key) { public void send(CommandSender sender, MessageKey key, String... replacements) { String message = retrieveSingle(sender, key, replacements); for (String line : message.split("\n")) { - sender.sendMessage(line); + adventureService.send(sender, MiniMessageUtils.parseMiniMessage(line)); } } @@ -131,7 +134,7 @@ private String retrieveMessage(MessageKey key, CommandSender sender) { displayName = ((Player) sender).getDisplayName(); } - return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message)) + return ChatColor.translateAlternateColorCodes('&', message) .replace(NEWLINE_TAG, "\n") .replace(USERNAME_TAG, sender.getName()) .replace(DISPLAYNAME_TAG, displayName); @@ -147,7 +150,7 @@ private String retrieveMessage(MessageKey key, CommandSender sender) { private String retrieveMessage(MessageKey key, String name) { String message = messagesFileHandler.getMessage(key.getKey()); - return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message)) + return ChatColor.translateAlternateColorCodes('&', message) .replace(NEWLINE_TAG, "\n") .replace(USERNAME_TAG, name) .replace(DISPLAYNAME_TAG, name); diff --git a/src/main/java/fr/xephi/authme/service/AdventureService.java b/src/main/java/fr/xephi/authme/service/AdventureService.java new file mode 100644 index 000000000..ddb7c6333 --- /dev/null +++ b/src/main/java/fr/xephi/authme/service/AdventureService.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.AuthMe; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class AdventureService { + private final AuthMe plugin; + public BukkitAudiences adventure; + public AdventureService(AuthMe plugin) { + this.plugin = plugin; + } + + public void init() { + adventure = BukkitAudiences.create(plugin); + } + + public void close() { + if (adventure != null) { + adventure.close(); + adventure = null; + } + } + + public void send(CommandSender sender, Component component) { + adventure.sender(sender).sendMessage(component); + } + + public void send(Player player, Component component) { + adventure.player(player).sendMessage(component); + } + +} diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index 36756c620..b404d44a2 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -1,6 +1,7 @@ package fr.xephi.authme.util.message; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -17,6 +18,17 @@ public static String parseMiniMessageToLegacy(String message) { Component component = miniMessage.deserialize(message); return LegacyComponentSerializer.legacyAmpersand().serialize(component); } + + /** + * Parse a MiniMessage string into a component. + * + * @param message The message to parse. + * @return The parsed message. + */ + public static Component parseMiniMessage(String message) { + TextComponent component = LegacyComponentSerializer.legacySection().deserialize(message); + return miniMessage.deserialize(miniMessage.serialize(component)); + } private MiniMessageUtils() { } } From 2b8450f27e2e5040f88f4584c4109c8787399154 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:15:25 +0800 Subject: [PATCH 2/8] Convert manually --- .../authme/util/message/MiniMessageUtils.java | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index b404d44a2..ffd2a7a97 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -1,10 +1,12 @@ package fr.xephi.authme.util.message; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class MiniMessageUtils { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); @@ -26,8 +28,50 @@ public static String parseMiniMessageToLegacy(String message) { * @return The parsed message. */ public static Component parseMiniMessage(String message) { - TextComponent component = LegacyComponentSerializer.legacySection().deserialize(message); - return miniMessage.deserialize(miniMessage.serialize(component)); + return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, '§', true)); + } + + private static String convertLegacyToMiniMessage(String legacy, boolean concise, char charCode, boolean rgb) { + String miniMessage = legacy.replaceAll(Pattern.quote(String.valueOf(charCode)) + "0", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "1", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "2", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "3", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "4", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "5", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "6", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "7", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "8", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "9", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "a", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "b", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "c", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "d", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "e", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "f", ""); + + if (concise) { + miniMessage = miniMessage.replaceAll(Pattern.quote(String.valueOf(charCode)) + "n", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "m", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "k", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "o", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "l", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "r", ""); + } else { + miniMessage = miniMessage.replaceAll(Pattern.quote(String.valueOf(charCode)) + "n", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "m", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "k", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "o", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "l", "") + .replaceAll(Pattern.quote(String.valueOf(charCode)) + "r", ""); + } + + if (rgb) { + Pattern pattern = Pattern.compile(Pattern.quote(String.valueOf(charCode)) + "#([0-9a-fA-F]{6})"); + Matcher matcher = pattern.matcher(miniMessage); + miniMessage = matcher.replaceAll("<#$1>"); + } + + return miniMessage; } private MiniMessageUtils() { } From 8df6a008c8c11d0fb9a0c13489cee9c19b69f52c Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:31:05 +0800 Subject: [PATCH 3/8] replace direct char references with constants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace direct references to the '§' and '&' chars with named constants to improve code readability and maintainability within the MiniMessageUtils class --- .../java/fr/xephi/authme/util/message/MiniMessageUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index ffd2a7a97..cde8dfceb 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -9,6 +9,8 @@ public class MiniMessageUtils { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + private static final char SECTION_CHAR = '§'; + private static final char AMPERSAND_CHAR = '&'; /** * Parse a MiniMessage string into a legacy string. @@ -28,9 +30,10 @@ public static String parseMiniMessageToLegacy(String message) { * @return The parsed message. */ public static Component parseMiniMessage(String message) { - return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, '§', true)); + return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, SECTION_CHAR, true)); } + @SuppressWarnings("all") private static String convertLegacyToMiniMessage(String legacy, boolean concise, char charCode, boolean rgb) { String miniMessage = legacy.replaceAll(Pattern.quote(String.valueOf(charCode)) + "0", "") .replaceAll(Pattern.quote(String.valueOf(charCode)) + "1", "") From 3b6160c91f467d3077fff3d8718da4847b10261b Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 23 Jul 2024 00:51:48 +0800 Subject: [PATCH 4/8] Support for kick message --- .../authme/RegisterAdminCommand.java | 3 +- .../fr/xephi/authme/data/TempbanManager.java | 3 +- .../listener/DoubleLoginFixListener.java | 3 +- .../xephi/authme/listener/OnJoinVerifier.java | 3 +- .../xephi/authme/listener/PlayerListener.java | 3 +- .../authme/process/join/AsynchronousJoin.java | 5 +- .../process/login/AsynchronousLogin.java | 3 +- .../register/ProcessSyncPasswordRegister.java | 3 +- .../fr/xephi/authme/task/TimeoutTask.java | 3 +- .../authme/util/message/MiniMessageUtils.java | 55 ++++++++++++++++++- 10 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java index 7b2847f79..1c3857e9e 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java @@ -12,6 +12,7 @@ import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.ValidationService; import fr.xephi.authme.service.ValidationService.ValidationResult; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -79,7 +80,7 @@ public void executeCommand(final CommandSender sender, List arguments) { if (player != null) { bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> // AuthMeReReloaded - Folia compatibility - bukkitService.runTaskIfFolia(player, () -> player.kickPlayer(commonService.retrieveSingleMessage(player, MessageKey.KICK_FOR_ADMIN_REGISTER)))); + bukkitService.runTaskIfFolia(player, () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(commonService.retrieveSingleMessage(player, MessageKey.KICK_FOR_ADMIN_REGISTER))))); } }); } diff --git a/src/main/java/fr/xephi/authme/data/TempbanManager.java b/src/main/java/fr/xephi/authme/data/TempbanManager.java index 2a767874d..0ffd9e4b2 100644 --- a/src/main/java/fr/xephi/authme/data/TempbanManager.java +++ b/src/main/java/fr/xephi/authme/data/TempbanManager.java @@ -9,6 +9,7 @@ import fr.xephi.authme.settings.properties.SecuritySettings; import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.expiring.TimedCounter; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.entity.Player; import javax.inject.Inject; @@ -106,7 +107,7 @@ public void tempbanPlayer(final Player player) { bukkitService.runTask(player,() -> { // AuthMeReReloaded - Folia compatibility if (customCommand.isEmpty()) { bukkitService.banIp(ip, reason, expires, "AuthMe"); - player.kickPlayer(reason); + MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(reason)); } else { String command = customCommand .replace("%player%", name) diff --git a/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java b/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java index 2c0370a43..c6e3bbd8b 100644 --- a/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java +++ b/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java @@ -3,6 +3,7 @@ import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -26,7 +27,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { HashSet PlayerSet = new HashSet(); for (Player ep : PlayerList) { if (PlayerSet.contains(ep.getName().toLowerCase())) { - ep.kickPlayer(service.retrieveSingleMessage(ep.getPlayer(), MessageKey.DOUBLE_LOGIN_FIX)); + MiniMessageUtils.kickPlayer(ep, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(ep.getPlayer(), MessageKey.DOUBLE_LOGIN_FIX))); break; } PlayerSet.add(ep.getName().toLowerCase()); diff --git a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java index a617c2fa8..db2f53820 100644 --- a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java +++ b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java @@ -18,6 +18,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.util.StringUtils; import fr.xephi.authme.util.Utils; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerLoginEvent; @@ -140,7 +141,7 @@ public boolean refusePlayerForFullServer(PlayerLoginEvent event) { Player nonVipPlayer = generateKickPlayer(onlinePlayers); if (nonVipPlayer != null) { // AuthMeReReloaded - Folia compatibility - bukkitService.runTaskIfFolia(nonVipPlayer, () -> nonVipPlayer.kickPlayer(messages.retrieveSingle(player, MessageKey.KICK_FOR_VIP))); + bukkitService.runTaskIfFolia(nonVipPlayer, () -> MiniMessageUtils.kickPlayer(nonVipPlayer, MiniMessageUtils.parseMiniMessage(messages.retrieveSingle(player, MessageKey.KICK_FOR_VIP)))); event.allow(); return false; } else { diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index 2a0f8a029..001a23132 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -21,6 +21,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.util.TeleportUtils; import fr.xephi.authme.util.message.I18NUtils; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.HumanEntity; @@ -323,7 +324,7 @@ public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { final Player player = event.getPlayer(); if (!quickCommandsProtectionManager.isAllowed(player.getName())) { event.setCancelled(true); - bukkitService.runTaskIfFolia(player, () -> player.kickPlayer(messages.retrieveSingle(player, MessageKey.QUICK_COMMAND_PROTECTION_KICK))); + bukkitService.runTaskIfFolia(player, () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(messages.retrieveSingle(player, MessageKey.QUICK_COMMAND_PROTECTION_KICK)))); // AuthMeReReloaded - Folia compatibility return; } diff --git a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java index 424c49896..6d8fc11dc 100644 --- a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java +++ b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java @@ -26,6 +26,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.util.InternetProtocolUtils; import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.GameMode; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -177,7 +178,7 @@ public void processJoin(Player player) { private void handlePlayerWithUnmetNameRestriction(Player player, String ip) { bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { - player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.NOT_OWNER_ERROR)); + MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.NOT_OWNER_ERROR))); if (service.getProperty(RestrictionSettings.BAN_UNKNOWN_IP)) { server.banIP(ip); } @@ -228,7 +229,7 @@ private boolean validatePlayerCountForIp(Player player, String ip) { && countOnlinePlayersByIp(ip) > service.getProperty(RestrictionSettings.MAX_JOIN_PER_IP)) { bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( - () -> player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.SAME_IP_ONLINE))); + () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.SAME_IP_ONLINE)))); return false; } return true; diff --git a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java index 988124d9a..913a8fcfc 100644 --- a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java @@ -36,6 +36,7 @@ import fr.xephi.authme.util.InternetProtocolUtils; import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.Utils; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -249,7 +250,7 @@ private void handleWrongPassword(Player player, PlayerAuth auth, String ip) { tempbanManager.tempbanPlayer(player); } else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) { bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( - () -> player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.WRONG_PASSWORD))); + () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.WRONG_PASSWORD)))); } else { service.send(player, MessageKey.WRONG_PASSWORD); diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java index f68ba015d..9bba0f6a8 100644 --- a/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java +++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java @@ -15,6 +15,7 @@ import fr.xephi.authme.settings.properties.EmailSettings; import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.entity.Player; import javax.inject.Inject; @@ -77,7 +78,7 @@ public void processPasswordRegister(Player player) { // Kick Player after Registration is enabled, kick the player if (service.getProperty(RegistrationSettings.FORCE_KICK_AFTER_REGISTER)) { - player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.REGISTER_SUCCESS)); + MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.REGISTER_SUCCESS))); return; } diff --git a/src/main/java/fr/xephi/authme/task/TimeoutTask.java b/src/main/java/fr/xephi/authme/task/TimeoutTask.java index 60aac7414..1d441cff1 100644 --- a/src/main/java/fr/xephi/authme/task/TimeoutTask.java +++ b/src/main/java/fr/xephi/authme/task/TimeoutTask.java @@ -1,6 +1,7 @@ package fr.xephi.authme.task; import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.util.message.MiniMessageUtils; import org.bukkit.entity.Player; /** @@ -28,7 +29,7 @@ public TimeoutTask(Player player, String message, PlayerCache playerCache) { @Override public void run() { if (!playerCache.isAuthenticated(player.getName())) { - player.kickPlayer(message); + MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(message)); } } } diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index cde8dfceb..5362f23b1 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -1,9 +1,13 @@ package fr.xephi.authme.util.message; +import fr.xephi.authme.util.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import java.lang.reflect.Method; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -11,7 +15,24 @@ public class MiniMessageUtils { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); private static final char SECTION_CHAR = '§'; private static final char AMPERSAND_CHAR = '&'; + private static final boolean HEX_SUPPORTED = Utils.MAJOR_VERSION >= 16; + private static Method methodDisallow; + private static Method methodKick; + static { + try { + Class componentClass = Class.forName("net{}kyori{}adventure{}text{}Component".replace("{}", ".")); + methodDisallow = AsyncPlayerPreLoginEvent.class.getMethod("disallow", AsyncPlayerPreLoginEvent.Result.class, componentClass); + } catch (Exception e) { + methodDisallow = null; + } + try { + Class componentClass = Class.forName("net{}kyori{}adventure{}text{}Component".replace("{}", ".")); + methodKick = Player.class.getMethod("kick", componentClass); + } catch (Exception e) { + methodKick = null; + } + } /** * Parse a MiniMessage string into a legacy string. * @@ -30,7 +51,39 @@ public static String parseMiniMessageToLegacy(String message) { * @return The parsed message. */ public static Component parseMiniMessage(String message) { - return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, SECTION_CHAR, true)); + return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, SECTION_CHAR, HEX_SUPPORTED)); + } + + public static void kickPlayer(Player player, Component message) { + if (methodKick != null) { + try { + methodKick.invoke(player, message); + } catch (Exception e) { + player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message)); + } + } else { + player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message)); + } + } + + /** + * Disallows the login event with the given result and reason. + * + * @param event the event + * @param result the event result to set + * @param message the denial message + */ + public static void disallowPreLoginEvent(AsyncPlayerPreLoginEvent event, + AsyncPlayerPreLoginEvent.Result result, Component message) { + if (methodDisallow != null) { + try { + methodDisallow.invoke(event, result, message); + } catch (Exception e) { + event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message)); + } + } else { + event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message)); + } } @SuppressWarnings("all") From 2d10e77b6cbb25a327082237268a5b917a9eeea6 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 23 Jul 2024 01:37:20 +0800 Subject: [PATCH 5/8] Support for kick message --- .../authme/util/message/MiniMessageUtils.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index 5362f23b1..80ee635b0 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -16,18 +16,22 @@ public class MiniMessageUtils { private static final char SECTION_CHAR = '§'; private static final char AMPERSAND_CHAR = '&'; private static final boolean HEX_SUPPORTED = Utils.MAJOR_VERSION >= 16; + private static Class componentClass; private static Method methodDisallow; private static Method methodKick; static { try { - Class componentClass = Class.forName("net{}kyori{}adventure{}text{}Component".replace("{}", ".")); + componentClass = Class.forName("net{}kyori{}adventure{}text{}Component".replace("{}", ".")); + } catch (Exception e) { + componentClass = null; + } + try { methodDisallow = AsyncPlayerPreLoginEvent.class.getMethod("disallow", AsyncPlayerPreLoginEvent.Result.class, componentClass); } catch (Exception e) { methodDisallow = null; } try { - Class componentClass = Class.forName("net{}kyori{}adventure{}text{}Component".replace("{}", ".")); methodKick = Player.class.getMethod("kick", componentClass); } catch (Exception e) { methodKick = null; @@ -54,10 +58,17 @@ public static Component parseMiniMessage(String message) { return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, SECTION_CHAR, HEX_SUPPORTED)); } + /** + * Kicks a player with the given message. + * + * @param player the player to kick + * @param message the message to send + */ + @SuppressWarnings("all") public static void kickPlayer(Player player, Component message) { if (methodKick != null) { try { - methodKick.invoke(player, message); + methodKick.invoke(player, componentClass.cast((Object) message)); } catch (Exception e) { player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message)); } @@ -73,11 +84,12 @@ public static void kickPlayer(Player player, Component message) { * @param result the event result to set * @param message the denial message */ + @SuppressWarnings("all") public static void disallowPreLoginEvent(AsyncPlayerPreLoginEvent event, - AsyncPlayerPreLoginEvent.Result result, Component message) { + AsyncPlayerPreLoginEvent.Result result, Component message) { if (methodDisallow != null) { try { - methodDisallow.invoke(event, result, message); + methodDisallow.invoke(event, result, componentClass.cast((Object) message)); } catch (Exception e) { event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message)); } From cadd5ddb24706830ae717795aac118cfdb4baa17 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 23 Jul 2024 01:48:23 +0800 Subject: [PATCH 6/8] throw ClassCastException --- .../java/fr/xephi/authme/util/message/MiniMessageUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index 80ee635b0..57bf367f8 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -70,6 +70,7 @@ public static void kickPlayer(Player player, Component message) { try { methodKick.invoke(player, componentClass.cast((Object) message)); } catch (Exception e) { + if (e instanceof ClassCastException) e.printStackTrace(); player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message)); } } else { @@ -91,6 +92,7 @@ public static void disallowPreLoginEvent(AsyncPlayerPreLoginEvent event, try { methodDisallow.invoke(event, result, componentClass.cast((Object) message)); } catch (Exception e) { + if (e instanceof ClassCastException) e.printStackTrace(); event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message)); } } else { From a4312fdb51cfaf53c253dc1459f26874331bb34e Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 23 Jul 2024 09:35:14 +0800 Subject: [PATCH 7/8] Remove relocation --- pom.xml | 4 ---- .../authme/util/message/MiniMessageUtils.java | 18 ++++-------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 8ef54144c..9b82e51a7 100644 --- a/pom.xml +++ b/pom.xml @@ -454,10 +454,6 @@ com.alessiodp.libby fr.xephi.authme.libs.com.alessiodp.libby - - net.kyori.adventure - fr.xephi.authme.libs.net.kyori.adventure - net.kyori.examination fr.xephi.authme.libs.net.kyori.examination diff --git a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java index 57bf367f8..0cc4ffc91 100644 --- a/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java +++ b/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -16,23 +16,17 @@ public class MiniMessageUtils { private static final char SECTION_CHAR = '§'; private static final char AMPERSAND_CHAR = '&'; private static final boolean HEX_SUPPORTED = Utils.MAJOR_VERSION >= 16; - private static Class componentClass; private static Method methodDisallow; private static Method methodKick; static { try { - componentClass = Class.forName("net{}kyori{}adventure{}text{}Component".replace("{}", ".")); - } catch (Exception e) { - componentClass = null; - } - try { - methodDisallow = AsyncPlayerPreLoginEvent.class.getMethod("disallow", AsyncPlayerPreLoginEvent.Result.class, componentClass); + methodDisallow = AsyncPlayerPreLoginEvent.class.getMethod("disallow", AsyncPlayerPreLoginEvent.Result.class, Component.class); } catch (Exception e) { methodDisallow = null; } try { - methodKick = Player.class.getMethod("kick", componentClass); + methodKick = Player.class.getMethod("kick", Component.class); } catch (Exception e) { methodKick = null; } @@ -64,13 +58,11 @@ public static Component parseMiniMessage(String message) { * @param player the player to kick * @param message the message to send */ - @SuppressWarnings("all") public static void kickPlayer(Player player, Component message) { if (methodKick != null) { try { - methodKick.invoke(player, componentClass.cast((Object) message)); + methodKick.invoke(player, message); } catch (Exception e) { - if (e instanceof ClassCastException) e.printStackTrace(); player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message)); } } else { @@ -85,14 +77,12 @@ public static void kickPlayer(Player player, Component message) { * @param result the event result to set * @param message the denial message */ - @SuppressWarnings("all") public static void disallowPreLoginEvent(AsyncPlayerPreLoginEvent event, AsyncPlayerPreLoginEvent.Result result, Component message) { if (methodDisallow != null) { try { - methodDisallow.invoke(event, result, componentClass.cast((Object) message)); + methodDisallow.invoke(event, result, message); } catch (Exception e) { - if (e instanceof ClassCastException) e.printStackTrace(); event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message)); } } else { From 2a40c2be367deea587837672e8396534eaf94fdd Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 23 Jul 2024 11:19:40 +0800 Subject: [PATCH 8/8] Remove relocation --- pom.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pom.xml b/pom.xml index 9b82e51a7..d9f6925bd 100644 --- a/pom.xml +++ b/pom.xml @@ -454,14 +454,6 @@ com.alessiodp.libby fr.xephi.authme.libs.com.alessiodp.libby - - net.kyori.examination - fr.xephi.authme.libs.net.kyori.examination - - - net.kyori.option - fr.xephi.authme.libs.net.kyori.option - @@ -899,11 +891,6 @@ adventure-platform-bukkit 4.3.3 - - net.kyori - adventure-text-serializer-gson - 4.17.0 -