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 7b2847f7..1c3857e9 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.BukkitService; 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 class RegisterAdminCommand implements ExecutableCommand { 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 2a767874..0ffd9e4b 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.Settings; 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 class TempbanManager implements SettingsDependent, HasCleanup { 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 2c0370a4..c6e3bbd8 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 @@ package fr.xephi.authme.listener; 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 class DoubleLoginFixListener implements Listener { 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 a617c2fa..db2f5382 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.RegistrationSettings; 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 class OnJoinVerifier implements Reloadable { 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 2a0f8a02..001a2313 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.RegistrationSettings; 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 class PlayerListener implements Listener { 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 424c4989..6d8fc11d 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.RegistrationSettings; 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 class AsynchronousJoin implements AsynchronousProcess { 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 @@ public class AsynchronousJoin implements AsynchronousProcess { && 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 988124d9..913a8fcf 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.settings.properties.RestrictionSettings; 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 @@ public class AsynchronousLogin implements AsynchronousProcess { 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 f68ba015..9bba0f6a 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.commandconfig.CommandManager; 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 class ProcessSyncPasswordRegister implements SynchronousProcess { // 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 60aac741..1d441cff 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 class TimeoutTask implements Runnable { @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 cde8dfce..5362f23b 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 class MiniMessageUtils { * @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")