diff --git a/src/main/java/com/slprojects/slcraftplugin/Main.java b/src/main/java/com/slprojects/slcraftplugin/Main.java index af5903e6546b9785a936a6c37f43df1f482769e4..332348cddd018cc9a83fd88efa2ec7f509adece4 100644 --- a/src/main/java/com/slprojects/slcraftplugin/Main.java +++ b/src/main/java/com/slprojects/slcraftplugin/Main.java @@ -8,6 +8,7 @@ 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 com.slprojects.slcraftplugin.utils.web.AsyncHttpClient; import io.papermc.paper.event.player.AsyncChatEvent; import me.clip.placeholderapi.PlaceholderAPI; import net.kyori.adventure.text.Component; @@ -42,6 +43,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -268,45 +270,6 @@ public final class Main extends JavaPlugin implements Listener { getLinkCode.setExecutor(linkCodeCommand); } - // Permet de faire des appels vers l'api discord - public String getHttp(String urlString) { - String returnData = ""; - // 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", "fr-FR,fr;q=0.5"); - con.setRequestProperty("Content-Type", "application/json"); - con.setRequestProperty("Server-Type", config.getString("server-type")); - 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(); - returnData = response.toString(); - } catch (Exception ex) { - ConsoleLog.danger("Impossible de se connecter à l'url " + urlString + ". Func getHttp(String urlString)"); - ex.printStackTrace(); - } - - return returnData; - } - // Envoyer un message sur le discord @SuppressWarnings({"unchecked"}) public void sendMessageToDiscord(String message, String username) { @@ -325,10 +288,13 @@ public final class Main extends JavaPlugin implements Listener { try { String urlString = config.getString("discordBot-api-url") + "mc/chat/" + URLEncoder.encode(json.toJSONString(), "UTF-8").replace("+", "%20"); - String response = getHttp(urlString); - if (getConfig().getBoolean("msg-verbose")) { - ConsoleLog.info("Func AsyncChatEvent(PlayerChatEvent e), HTTP response:" + response); - } + AsyncHttpClient httpClient = new AsyncHttpClient(); + CompletableFuture<String> response = httpClient.get(urlString); + response.thenAccept(res -> { + if (getConfig().getBoolean("msg-verbose")) { + ConsoleLog.info("Func sendMessageToDiscord(String message, String username), HTTP response:" + res); + } + }); } catch (UnsupportedEncodingException ex) { ConsoleLog.danger("Impossible de d'encoder les données. Func AsyncChatEvent(PlayerChatEvent e)"); ex.printStackTrace(); diff --git a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java index 8de54d6011026744a77c52a430de67daa1fd2037..4a63a6aef27f4d2111df0081c90c3e472c2c0996 100644 --- a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java +++ b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/InternalWebServer.java @@ -2,6 +2,7 @@ package com.slprojects.slcraftplugin.parallelTasks; import com.slprojects.slcraftplugin.Main; import com.slprojects.slcraftplugin.utils.ConsoleLog; +import com.slprojects.slcraftplugin.utils.web.AsyncHttpClient; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.json.simple.JSONObject; @@ -13,6 +14,7 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.concurrent.CompletableFuture; public class InternalWebServer { /** @@ -134,7 +136,9 @@ public class InternalWebServer { ConsoleLog.danger("Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)"); ex.printStackTrace(); } - plugin.getHttp(urlString); + + AsyncHttpClient httpClient = new AsyncHttpClient(); + httpClient.get(urlString); } catch (ParseException e) { e.printStackTrace(); } diff --git a/src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java b/src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java new file mode 100644 index 0000000000000000000000000000000000000000..37c1e04f5d5e330be81e471799c8452486a7c4c1 --- /dev/null +++ b/src/main/java/com/slprojects/slcraftplugin/utils/web/AsyncHttpClient.java @@ -0,0 +1,92 @@ +package com.slprojects.slcraftplugin.utils.web; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +/** + * Client HTTP asynchrone + */ +public class AsyncHttpClient { + + /** + * Effectue une requête GET + * @param urlString URL + * @return Réponse + */ + public CompletableFuture<String> get(String urlString) { + return CompletableFuture.supplyAsync(() -> { + try { + URL url = new URL(urlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + StringBuilder response = new StringBuilder(); + String inputLine; + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + + in.close(); + con.disconnect(); + return response.toString(); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + }); + } + + /** + * Effectue une requête GET avec des headers + * @param urlString URL + * @param postDataBuilder Données POST + * @param headers Headers + * @return Réponse + */ + public CompletableFuture<String> post(String urlString, PostDataBuilder postDataBuilder, Map<String, String> headers) { + return CompletableFuture.supplyAsync(() -> { + try { + URL url = new URL(urlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + // Set request headers + headers.forEach(con::setRequestProperty); + + con.setDoOutput(true); + + // Write the request body + try (OutputStream os = con.getOutputStream()) { + byte[] input = postDataBuilder.build().getBytes("utf-8"); + os.write(input, 0, input.length); + } + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + StringBuilder response = new StringBuilder(); + String inputLine; + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + + in.close(); + con.disconnect(); + return response.toString(); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + }); + } +} diff --git a/src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java b/src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..83da3d577f06f5784d68cfb022f9ea508a733829 --- /dev/null +++ b/src/main/java/com/slprojects/slcraftplugin/utils/web/PostDataBuilder.java @@ -0,0 +1,47 @@ +package com.slprojects.slcraftplugin.utils.web; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Constructeur de données POST + */ +public class PostDataBuilder { + private Map<String, String> data; + + public PostDataBuilder() { + data = new LinkedHashMap<>(); + } + + /** + * Ajoute une donnée POST + * @param name Nom + * @param value Valeur + */ + public PostDataBuilder addData(String name, String value) { + data.put(name, value); + return this; + } + + /** + * Construit les données POST + * @return Données POST + */ + public String build() { + String postData = data.entrySet().stream() + .map(entry -> { + try { + return entry.getKey() + "=" + URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("Error encoding POST data.", e); + } + }) + .collect(Collectors.joining("&")); + + return postData; + } +}