diff --git a/pom.xml b/pom.xml index 211d42c729f896c993ca6f1d4a93b7b7150c7ffc..814eae962bdc0d8a3e804dac1d7009cc05588670 100644 --- a/pom.xml +++ b/pom.xml @@ -103,5 +103,10 @@ <artifactId>bjLoquent</artifactId> <version>db12baa</version> </dependency> + <dependency> + <groupId>net.kyori</groupId> + <artifactId>adventure-text-serializer-plain</artifactId> + <version>4.14.0</version> + </dependency> </dependencies> </project> diff --git a/src/main/java/com/slprojects/slcraftplugin/Main.java b/src/main/java/com/slprojects/slcraftplugin/Main.java index d4360d3a19d175580caddd2bb8db15a64eb98a22..af5903e6546b9785a936a6c37f43df1f482769e4 100644 --- a/src/main/java/com/slprojects/slcraftplugin/Main.java +++ b/src/main/java/com/slprojects/slcraftplugin/Main.java @@ -4,15 +4,17 @@ import com.slprojects.slcraftplugin.commands.admins.WildReset; import com.slprojects.slcraftplugin.commands.publics.LinkCode; import com.slprojects.slcraftplugin.commands.publics.Wild; import com.slprojects.slcraftplugin.parallelTasks.InternalWebServer; -import com.slprojects.slcraftplugin.parallelTasks.events.PeriodicEvent; import com.slprojects.slcraftplugin.parallelTasks.dataHandlers.PlayerDataHandler; +import com.slprojects.slcraftplugin.parallelTasks.events.PeriodicEvent; import com.slprojects.slcraftplugin.utils.ConsoleLog; import com.slprojects.slcraftplugin.utils.Database; +import io.papermc.paper.event.player.AsyncChatEvent; import me.clip.placeholderapi.PlaceholderAPI; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.luckperms.api.LuckPerms; import net.luckperms.api.cacheddata.CachedMetaData; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.command.PluginCommand; @@ -21,15 +23,14 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import org.json.simple.JSONObject; import org.mariadb.jdbc.MariaDbPoolDataSource; -import javax.xml.crypto.Data; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; @@ -37,7 +38,6 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.sql.Connection; -import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -61,68 +61,16 @@ public final class Main extends JavaPlugin implements Listener { public void onEnable() { pluginName = this.getName(); - // On s'assure qu'on a placeholder api - if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) { - ConsoleLog.info("PlaceholderAPI chargé"); - getServer().getPluginManager().registerEvents(this, this); - } else { - ConsoleLog.danger("PlaceholderAPI n'est pas accessible!"); - getServer().getPluginManager().disablePlugin(this); - } - - // LuckPerms - // S'assure que le plugin est installé et évite l'affichage d'une erreur de classe inaccessible - if (getServer().getPluginManager().getPlugin("LuckPerms") != null) { - RegisteredServiceProvider<LuckPerms> provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); - if (provider != null) { - ConsoleLog.info("LuckPerms chargé"); - luckPermsApi = provider.getProvider(); - } else { - ConsoleLog.danger("LuckPerms n'est pas accessible!"); - getServer().getPluginManager().disablePlugin(this); - } - } else { - ConsoleLog.danger("LuckPerms n'est pas accessible!"); - getServer().getPluginManager().disablePlugin(this); - } - - // Plugin startup logic - try { - databaseConnection = Database.bddOpenConn(); - Database.initDatabase(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - - // On charge la config (et on la crée si elle n'existe pas) - saveDefaultConfig(); - reloadConfig(); - config = getConfig(); - updateConfig(); + this.verifyPluginsDependencies(); + this.startupDatabaseAndConfigHandler(); // On initialise les handlers - playerDataHandler = new PlayerDataHandler(this); - periodicEvent = new PeriodicEvent(this); + this.playerDataHandler = new PlayerDataHandler(this); + this.periodicEvent = new PeriodicEvent(this); InternalWebServer.startServer(this); // On initialise les commandes - wildCommand = new Wild(this); - WildReset wildReset = new WildReset(this); - LinkCode linkCodeCommand = new LinkCode(this); - - PluginCommand wild = getCommand("wild"); - PluginCommand resetWild = getCommand("reset-wild"); - PluginCommand getLinkCode = getCommand("getLinkCode"); - - // On vérifie que les commandes ont bien été initialisées dans plugin.yml - if (wild == null || resetWild == null || getLinkCode == null) { - ConsoleLog.danger("Une commande n'a pas pu être initialisée!"); - getServer().getPluginManager().disablePlugin(this); - } else { - wild.setExecutor(wildCommand); - resetWild.setExecutor(wildReset); - getLinkCode.setExecutor(linkCodeCommand); - } + this.initCommands(); ConsoleLog.success("Plugin démarré"); } @@ -132,7 +80,15 @@ public final class Main extends JavaPlugin implements Listener { // Plugin shutdown logic ConsoleLog.danger("Plugin désactivé, au revoir!"); - getServer().getOnlinePlayers().forEach(player -> playerDataHandler.quitEvent(player)); + TextComponent goodbyeMessage = Component.text("Le serveur est en cours de redémarrage, à bientôt!"); + PlayerKickEvent.Cause cause = PlayerKickEvent.Cause.RESTART_COMMAND; + PlayerQuitEvent.QuitReason reason = PlayerQuitEvent.QuitReason.KICKED; + + getServer().getOnlinePlayers().forEach(player -> { + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(player, goodbyeMessage, reason); + player.kick(goodbyeMessage, cause); + this.onPlayerQuit(playerQuitEvent); + }); try { Database.bddCloseConn(); @@ -172,10 +128,10 @@ public final class Main extends JavaPlugin implements Listener { } // On renvoie chaque message des joueurs sur le canal de chat du serveur discord - @SuppressWarnings({"deprecation"}) @EventHandler(priority = EventPriority.LOWEST) - void AsyncChatEvent(AsyncPlayerChatEvent e) { - String playerFormattedMessage = e.getMessage(); + void AsyncChatEvent(AsyncChatEvent e) { + String originalMessage = PlainTextComponentSerializer.plainText().serialize(e.message()); + String playerFormattedMessage = originalMessage; // On applique les text markup // Markdown //italique + gras "***" @@ -208,7 +164,8 @@ public final class Main extends JavaPlugin implements Listener { playerFormattedMessage = Pattern.compile("@(" + p.getName() + ")($|[ ,;:!])").matcher(playerFormattedMessage).replaceAll("§r§l§d@$1§r$2"); // On lui joue un son + un texte dans la barre d'action - p.sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText("§b " + e.getPlayer().getName() + " §aVous a mentionné !")); + Component actionMessage = Component.text("§b " + e.getPlayer().getName() + " §aVous a mentionné !"); + p.sendActionBar(actionMessage); p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 100, 2); // On colorie les autres mentions playerFormattedMessage = Pattern.compile(" @(.*?)($|[ ,;:!])").matcher(playerFormattedMessage).replaceAll("§r§b @$1§r$2"); @@ -224,12 +181,93 @@ public final class Main extends JavaPlugin implements Listener { } } // On envoie le message sur discord (on envoie le msg sans les couleur ni le formatage) - String discordFriendlyMsg = Pattern.compile("&([a-f]|r|[0-8])").matcher(e.getMessage()).replaceAll(""); + String discordFriendlyMsg = Pattern.compile("&([a-f]|r|[0-8])").matcher(originalMessage).replaceAll(""); sendMessageToDiscord(discordFriendlyMsg, e.getPlayer().getName()); // On désactive le message de base de minecraft e.setCancelled(true); } + /** + * Vérifie que les plugins dont on a besoin sont bien chargés + */ + private void verifyPluginsDependencies() { + // Placeholder api + if (getServer().getPluginManager().getPlugin("PlaceholderAPI") == null) { + ConsoleLog.danger("PlaceholderAPI n'est pas accessible!"); + getServer().getPluginManager().disablePlugin(this); + return; + } + + ConsoleLog.info("PlaceholderAPI chargé"); + getServer().getPluginManager().registerEvents(this, this); + + // LuckPerms + if (getServer().getPluginManager().getPlugin("LuckPerms") == null) { + ConsoleLog.danger("LuckPerms n'est pas accessible!"); + getServer().getPluginManager().disablePlugin(this); + return; + } + + RegisteredServiceProvider<LuckPerms> provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); + if (provider == null) { + ConsoleLog.danger("LuckPerms n'est pas accessible!"); + getServer().getPluginManager().disablePlugin(this); + return; + } + + ConsoleLog.info("LuckPerms chargé"); + luckPermsApi = provider.getProvider(); + } + + /** + * Gère la config au lance du plugin + */ + private void firstTimeConfigHandler() { + saveDefaultConfig(); + reloadConfig(); + config = getConfig(); + updateConfig(); + } + + /** + * Procédure de démarrage du plugin + */ + private void startupDatabaseAndConfigHandler() { + // On initialise la base de données + try { + databaseConnection = Database.bddOpenConn(); + Database.initDatabase(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + this.firstTimeConfigHandler(); + } + + /** + * Initialise les commandes + */ + private void initCommands() { + this.wildCommand = new Wild(this); + WildReset wildReset = new WildReset(this); + LinkCode linkCodeCommand = new LinkCode(this); + + PluginCommand wild = getCommand("wild"); + PluginCommand resetWild = getCommand("reset-wild"); + PluginCommand getLinkCode = getCommand("getLinkCode"); + + // On vérifie que les commandes ont bien été initialisées dans plugin.yml + if (wild == null || resetWild == null || getLinkCode == null) { + ConsoleLog.danger("Une commande n'a pas pu être initialisée!"); + getServer().getPluginManager().disablePlugin(this); + return; + } + + wild.setExecutor(wildCommand); + resetWild.setExecutor(wildReset); + getLinkCode.setExecutor(linkCodeCommand); + } + // Permet de faire des appels vers l'api discord public String getHttp(String urlString) { String returnData = ""; @@ -301,6 +339,7 @@ public final class Main extends JavaPlugin implements Listener { sendMessageToDiscord(message, "SL-Craft"); } + @Deprecated public Connection bddOpenConn() { // si mot de passe avec des caractère spéciaux Connection conn = null; try {