diff --git a/pom.xml b/pom.xml index c886200d7d3e8815a7ca315c1dce5ef0685318ac..8855c8e4953c9bc4d1cd75205dbdb61acd913309 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <groupId>com.slprojects</groupId> <artifactId>SLCraftPlugin</artifactId> - <version>1.4</version> + <version>1.5</version> <packaging>jar</packaging> <name>SLCraftPlugin</name> diff --git a/src/main/java/com/slprojects/slcraftplugin/Main.java b/src/main/java/com/slprojects/slcraftplugin/Main.java index 45f9473981479c95f98290f45cd09299985559c9..3a01b31ae9788709691f698557b5ec8e915e48aa 100644 --- a/src/main/java/com/slprojects/slcraftplugin/Main.java +++ b/src/main/java/com/slprojects/slcraftplugin/Main.java @@ -4,6 +4,8 @@ package com.slprojects.slcraftplugin; import com.slprojects.slcraftplugin.commandes.linkCodeCommand; import com.slprojects.slcraftplugin.commandes.wildCommand; +import com.slprojects.slcraftplugin.tachesParalleles.waitForDiscordMsg; +import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.ChatColor; import org.bukkit.Sound; import org.bukkit.Statistic; @@ -12,13 +14,23 @@ 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.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import org.json.simple.JSONObject; import org.mariadb.jdbc.MariaDbPoolDataSource; -import java.sql.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneOffset; @@ -27,8 +39,6 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; -import me.clip.placeholderapi.PlaceholderAPI; - import static java.lang.Integer.parseInt; public final class Main extends JavaPlugin implements Listener { @@ -68,6 +78,8 @@ public final class Main extends JavaPlugin implements Listener { linkCodeCommand linkCodeCommand = new linkCodeCommand(this); getCommand("getLinkCode").setExecutor(linkCodeCommand); + waitForDiscordMsg.startServer(this); + getLogger().info(ChatColor.GREEN+"SL-Craft | Plugin démarré"); } @@ -105,6 +117,46 @@ public final class Main extends JavaPlugin implements Listener { } } + // On renvoie chaque message des joueurs sur le canal de chat du serveur discord + @SuppressWarnings("unchecked") + @EventHandler(priority = EventPriority.LOWEST) + void AsyncChatEvent(AsyncPlayerChatEvent e) throws UnsupportedEncodingException { + // On va appeler l'api du bot discord + JSONObject json = new JSONObject(); + json.put("message", e.getMessage()); + json.put("username", e.getPlayer().getName()); + + String urlString = "http://node.sl-projects.com:27001/mc/chat/" + URLEncoder.encode(json.toJSONString(), "UTF-8").replace("+", "%20"); + getLogger().info(urlString); + // Processus long et chiant + try { + URL url = new URL(urlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + con.setRequestProperty("User-Agent", "Mozilla/5.0"); + con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); + con.setRequestProperty("Content-Type", "application/json"); + con.setDoOutput(true); + con.setDoInput(true); + con.setUseCaches(false); + con.setAllowUserInteraction(false); + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + con.connect(); + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuilder response = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + con.disconnect(); + getLogger().info(response.toString()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // Propre au compteur de temps de jeu @SuppressWarnings("unchecked") public void savePlayer(Player player) { @@ -136,7 +188,7 @@ public final class Main extends JavaPlugin implements Listener { // On ouvre la bdd Connection con = bddOpenConn(); try { - // On va regarder si l'utilisateur existe + // On va regarder si Le joueur existe PreparedStatement rechercheUtilisateur = con.prepareStatement("SELECT COUNT(*) FROM site_userSetting WHERE uuid = ?"); rechercheUtilisateur.setString(1, target.get("uuid").toString()); ResultSet resultat = rechercheUtilisateur.executeQuery(); @@ -156,7 +208,7 @@ public final class Main extends JavaPlugin implements Listener { insertionNbJoins.setString(2, target.get("joins").toString()); insertionNbJoins.executeQuery(); - // On va regarder si l'utilisateur a déjà joué avant (vu qu'on avait pas de données sur ce joueur) + // On va regarder si Le joueur a déjà joué avant (vu qu'on avait pas de données sur ce joueur) if(target.get("hasPlayedBefore").toString().equals("true")){ // On va piocher la date d'inscription chez CoreProtect (si elle existe) // On la prend chez CoreProtect car le plugin a été installé dans les premières semaines du serveur. Il a donc bcp plus de données que nous concernant les anciens joueurs. @@ -172,9 +224,9 @@ public final class Main extends JavaPlugin implements Listener { insertionDateInscription.executeQuery(); // On va précisier que la date d'inscription a été trouvée chez CoreProtect - getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs. On lui a donc attribué comme date de création du compte, celle que détenait CoreProtect."); + getLogger().info("Le joueur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs. On lui a donc attribué comme date de création du compte, celle que détenait CoreProtect."); } else { - // On insère la date d'inscription (du coup on considère que l'utilisateur n'a pas joué avant, malgré la condition) + // On insère la date d'inscription (du coup on considère que Le joueur n'a pas joué avant, malgré la condition) PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)"); insertionDateInscription.setString(1, target.get("uuid").toString()); insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(target.get("joinedDate").toString()).toString()); @@ -186,7 +238,7 @@ public final class Main extends JavaPlugin implements Listener { insertionInaccurrateJoinedDate.setString(2, "true"); insertionInaccurrateJoinedDate.executeQuery(); - getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs, ni dans la table des utilisateurs de CoreProtect. On lui a donc attribué comme date de création du compte, la date du début de sa partie."); + getLogger().info("Le joueur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs, ni dans la table des utilisateurs de CoreProtect. On lui a donc attribué comme date de création du compte, la date du début de sa partie."); } }else{ // C'est un nouvel utilisateur, on peut lui attribuer la date d'inscription précédement calculée @@ -230,7 +282,7 @@ public final class Main extends JavaPlugin implements Listener { insertionDateInscription.executeQuery(); // On va précisier que la date d'inscription a été trouvée chez CoreProtect - getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs. On lui a donc attribué comme date de création du compte, celle que détenait CoreProtect."); + getLogger().info("Le joueur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs. On lui a donc attribué comme date de création du compte, celle que détenait CoreProtect."); } else { // On insère la date d'inscription (du coup, comme précédement, on prend la date d'inscription locale) PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)"); @@ -244,7 +296,7 @@ public final class Main extends JavaPlugin implements Listener { insertionInaccurrateJoinedDate.setString(2, "true"); insertionInaccurrateJoinedDate.executeQuery(); - getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs, ni dans la table des utilisateurs de CoreProtect. On lui a donc attribué comme date de création du compte, la date du début de sa partie."); + getLogger().info("Le joueur "+ChatColor.GOLD+target.get("name").toString()+ChatColor.RESET+" n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs, ni dans la table des utilisateurs de CoreProtect. On lui a donc attribué comme date de création du compte, la date du début de sa partie."); } } @@ -325,4 +377,11 @@ public final class Main extends JavaPlugin implements Listener { getLogger().warning(ChatColor.RED+"Erreur lors de l'exécution de initDatabase(): "+e); } } + + // API Spring + /* + @GetMapping("/discordMsg/{jsonEncodedString}") + void sendDiscordMessage(){ + + }*/ } diff --git a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/waitForDiscordMsg.java b/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/waitForDiscordMsg.java new file mode 100644 index 0000000000000000000000000000000000000000..756a17b36b15aadd289c08f009e1ebebf4f484da --- /dev/null +++ b/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/waitForDiscordMsg.java @@ -0,0 +1,69 @@ +package com.slprojects.slcraftplugin.tachesParalleles; + +import com.slprojects.slcraftplugin.Main; +import org.bukkit.ChatColor; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +public class waitForDiscordMsg { + public static void startServer(Main plugin){ + int serverPort = plugin.getConfig().getInt("msg-server-port"); + + plugin.getLogger().info("Écoute des messages Discord sur le port " + ChatColor.GOLD + serverPort); + // On fait un thread pour écouter le port + Runnable serverThread = new Runnable() { + public void run() { + try { + ServerSocket serverSocket = new ServerSocket(serverPort); + while (true) { + Socket client = serverSocket.accept(); + + // Get input and output streams to talk to the client + BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); + PrintWriter out = new PrintWriter(client.getOutputStream()); + + // Start sending our reply, using the HTTP 1.1 protocol + out.print("HTTP/1.1 200 \r\n"); // Version & status code + out.print("Content-Type: text/plain\r\n"); // The type of data + out.print("Connection: close\r\n"); // Will close stream + out.print("\r\n"); // End of headers + + // Now, read the HTTP request from the client, and send it + // right back to the client as part of the body of our + // response. The client doesn't disconnect, so we never get + // an EOF. It does sends an empty line at the end of the + // headers, though. So when we see the empty line, we stop + // reading. This means we don't mirror the contents of POST + // requests, for example. Note that the readLine() method + // works with Unix, Windows, and Mac line terminators. + String line; + while ((line = in.readLine()) != null) { + if (line.length() == 0) + break; + out.print(line + "\r\n"); + plugin.getLogger().info(line); + } + + // Close socket, breaking the connection to the client, and + // closing the input and output streams + out.close(); // Flush and close the output stream + in.close(); // Close the input stream + client.close(); // Close the socket itself + } + } catch (IOException e) { + plugin.getLogger().info(ChatColor.RED + "Erreur lors de l'écoute du port " + ChatColor.GOLD + serverPort); + e.printStackTrace(); + } + } + }; + + new Thread(serverThread).start(); + + + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a7e69bce7d7de82a5afd10793c5b64c6592c7556..4d1dd3742630df0626d89eb12da4380d6a01fe90 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -25,4 +25,7 @@ database: player-join-playSound: true player-join-message: "&a%player_name% &fa rejoint le serveur :D" -player-quit-message: "&a%player_name% &fvient de quitter le serveur :'(" \ No newline at end of file +player-quit-message: "&a%player_name% &fvient de quitter le serveur :'(" + +# Serveur messagerie +msg-server-port: 25566 \ No newline at end of file diff --git a/target/classes/com/slprojects/slcraftplugin/Main.class b/target/classes/com/slprojects/slcraftplugin/Main.class index 369cff01cfd21bed898d96352ea3e53d30472f15..7b8b54cb644d050ba3e31aa80c3f5e8263644ffd 100644 Binary files a/target/classes/com/slprojects/slcraftplugin/Main.class and b/target/classes/com/slprojects/slcraftplugin/Main.class differ diff --git a/target/classes/config.yml b/target/classes/config.yml index a7e69bce7d7de82a5afd10793c5b64c6592c7556..4d1dd3742630df0626d89eb12da4380d6a01fe90 100644 --- a/target/classes/config.yml +++ b/target/classes/config.yml @@ -25,4 +25,7 @@ database: player-join-playSound: true player-join-message: "&a%player_name% &fa rejoint le serveur :D" -player-quit-message: "&a%player_name% &fvient de quitter le serveur :'(" \ No newline at end of file +player-quit-message: "&a%player_name% &fvient de quitter le serveur :'(" + +# Serveur messagerie +msg-server-port: 25566 \ No newline at end of file diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml index 91a79f001d7abd3cf4d181ffdefc235dcd5fcdd5..a3f955ee76b1d9a9b100aead91d862c90735fe62 100644 --- a/target/classes/plugin.yml +++ b/target/classes/plugin.yml @@ -1,5 +1,5 @@ name: SLCraftPlugin -version: '1.4' +version: '1.5' main: com.slprojects.slcraftplugin.Main depend: [PlaceholderAPI] api-version: 1.18 diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties index f16796ffa1c1603473ed8a7485c9781d515561d8..d5775f3d74ed8b4f2df764059df29b2039992dbb 100644 --- a/target/maven-archiver/pom.properties +++ b/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Sat Mar 05 15:11:15 CET 2022 +#Sun Mar 06 17:00:16 CET 2022 groupId=com.slprojects artifactId=SLCraftPlugin -version=1.4 +version=1.5 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 06d009572d24221a2002882ef11161456953aeb6..21d3155fc18675f0d92122500364ac8fef0da1d5 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,4 +1,6 @@ +com\slprojects\slcraftplugin\commandes\wildCommand$1.class com\slprojects\slcraftplugin\commandes\wildCommand.class com\slprojects\slcraftplugin\Main.class com\slprojects\slcraftplugin\commandes\linkCodeCommand.class -com\slprojects\slcraftplugin\commandes\wildCommand$1.class +com\slprojects\slcraftplugin\tachesParalleles\waitForDiscordMsg.class +com\slprojects\slcraftplugin\tachesParalleles\waitForDiscordMsg$1.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 22518611b697ad035e84d33c9400b6528a0c4b59..64cb0dc6c51dbeaa5441e82e2cf2f4a3a171f3ba 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,3 +1,4 @@ C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\commandes\wildCommand.java C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\Main.java C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\commandes\linkCodeCommand.java +C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\tachesParalleles\waitForDiscordMsg.java