Skip to content
Snippets Groups Projects
Select Git revision
  • feature/revoir_gestion_bdd
  • main default protected
  • 1.6.1
  • 1.6.0
4 results

InternalWebServer.java

Blame
  • InternalWebServer.java 7.53 KiB
    package com.slprojects.slcraftplugin.parallelTasks;
    
    import com.slprojects.slcraftplugin.Main;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    import org.json.simple.parser.ParseException;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    public class InternalWebServer {
        @SuppressWarnings({ "unchecked", "InfiniteLoopStatement" })
        public static void startServer(Main plugin){
            int serverPort = plugin.getConfig().getInt("internal-webserver-port");
    
            plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Lancement du serveur web intégré sur le port " + ChatColor.GOLD + serverPort);
            plugin.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "["+ plugin.getName() +"] Attention! Le serveur ne fonctionne pas avec les requêtes https!");
            // On fait un thread pour écouter le port
            Runnable serverThread = () -> {
                try {
                    ServerSocket serverSocket = new ServerSocket(serverPort);
                    while (true) {
                        Socket client = serverSocket.accept();
    
                        //plugin.getServer().getConsoleSender().sendMessage("Nouvelle connexion sur le port " + ChatColor.GOLD + serverPort);
    
                        // 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: application/json\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, commandName = "";
                        String[] aliases = new String[0];
                        while ((line = in.readLine()) != null) {
                            if (line.equals("")) {
                                break;
                            }
                            // On va regarder si la ligne commence par GET
                            if (line.startsWith("GET")) {
                                // On split par les espaces
                                String[] split = line.split(" ");
                                // Et on récupère le nom de la commande
                                String command = split[1];
    
                                // On split par des /
                                aliases = command.split("/");
                                // On récupère le nom de la commande
                                commandName = aliases[1];
                                // On ne process pas la commande ici car ça cause des problèmes vu qu'on va renvoyer le résultat avant que le client n'écoute
                            }
                        }
    
    
                        JSONObject answer = new JSONObject();
                        switch (commandName) {
                            case "discordMsg":
                                JSONObject json = (JSONObject) new JSONParser().parse(URLDecoder.decode(aliases[2], "UTF-8"));
                                String message = json.get("message").toString();
                                String playerName = json.get("playerName").toString();
    
                                // On envoie le message aux joueurs
                                for (Player p : plugin.getServer().getOnlinePlayers()) {
                                    p.sendMessage(ChatColor.DARK_PURPLE + playerName + ChatColor.WHITE + ": " + message);
                                }
                                plugin.getServer().getConsoleSender().sendMessage(ChatColor.DARK_PURPLE + playerName + ": " + message);
                                answer.put("status", "ok");
                                out.print(answer.toJSONString());
                                break;
                            case "getPlayers":
                                // On renvoie la liste des joueurs
                                JSONObject listToReturn = new JSONObject();
                                JSONObject players = new JSONObject();
    
                                for (Player p : plugin.getServer().getOnlinePlayers()) {
                                    JSONObject playerInfos = new JSONObject();
                                    playerInfos.put("username", p.getName());
                                    playerInfos.put("uuid", p.getUniqueId().toString());
                                    players.put(p.getName(), playerInfos);
                                }
    
                                listToReturn.put("players", players);
                                out.print(listToReturn.toJSONString());
                                break;
                            default:
                                answer.put("status", "error");
                                answer.put("message", "Commande "+commandName+" inconnue");
                                out.print(answer.toJSONString());
                                break;
                        }
    
                        // 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.getServer().getConsoleSender().sendMessage(ChatColor.RED + "["+ plugin.getName() +"] Erreur lors de l'écoute du port " + ChatColor.GOLD  + serverPort);
                    e.printStackTrace();
    
                    // On va logger le message sur discord
                    JSONObject json = new JSONObject();
                    json.put("desc", "Erreur lors de l'écoute du port " + serverPort);
                    json.put("message", e.getMessage());
                    String urlString = null;
                    try {
                        urlString = plugin.getConfig().getString("discordBot-api-url") + "mc/error/" + URLEncoder.encode(json.toJSONString(), "UTF-8").replace("+", "%20");
                        relaunchListener(plugin);
                    } catch (UnsupportedEncodingException ex) {
                        plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "["+ plugin.getName() +"] Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)");
                        ex.printStackTrace();
                    }
                    plugin.getHttp(urlString);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            };
    
            new Thread(serverThread).start();
        }
    
        // TODO: Vérifier l'utilité de cette fonction
        public static void relaunchListener(Main plugin) {
            // On relance la fonction avec une latence
            startServer(plugin);
        }
    }