diff --git a/NetworkAPI protocole.md b/NetworkAPI protocole.md index b1b70b9..df1cd44 100644 --- a/NetworkAPI protocole.md +++ b/NetworkAPI protocole.md @@ -22,7 +22,7 @@ La requête est construite en mode texte, sur plusieurs lignes. Chaque ligne se - Longueur des données, en octets + '\n' - Valeur/données (pas de '\n' à la fin) - Pour que l'analyse de la requête côté serveur puisse s'effectuer côté serveur, le flux qui va du client vers le serveur doit être fermée après envoi des données. + Pour que l'analyse de la requête puisse s'effectuer côté serveur, le flux qui va du client vers le serveur doit être fermée après envoi des données. ### Exemple de paquet ervg1e3r2c @@ -45,7 +45,7 @@ Le message passé dans la partie **donnée** est diffusé en convertissant les c #### `chat_send` Affiche un message en tant qu'un joueur donné, sur le chat du serveur -La partie **donnée** de la requête contient d'abord le pseudo du joueur concerné, suivi d'un espace, suivi du message. +La partie **donnée** de la requête contient d'abord le pseudo du joueur concerné, suivi d'un espace, suivi du message. Aucun espace ne peut se trouver dans le pseudo. #### `player_list` Renvoi la liste des joueurs connectés, avec quelques infos utiles. @@ -69,6 +69,14 @@ Chaque information sur une ligne sera séparé par un `\0` représentant le cara 6. Point de faim arrondi à l'unité 7. `1` si le joueur est visible, `0` si il est vanish. +#### `private_message` +Envoi un message à un joueur connecté, en tant qu'un autre joueur donné. +La partie **donnée** de la requête contient d'abord le pseudo du joueur source, suivi d'un espace, suivi du pseudo du joueur cible, suivi d'un espace et enfin suivi du message. Les pseudos ne peuvent pas contenir d'espace. + + marcbal toto salut :) + +Cet exemple enverra de la part de `marcbal` le message `salut :)` à `toto`. + ## Structure d'une réponse La réponse est construite en mode texte, sur plusieurs lignes. Chaque ligne se fini par un '\n' : diff --git a/make_jar.jardesc b/make_jar.jardesc index c963411..9707c6c 100644 --- a/make_jar.jardesc +++ b/make_jar.jardesc @@ -1,6 +1,6 @@ - + diff --git a/resources/plugin.yml b/resources/plugin.yml index 1b5f7ef..cb09018 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,6 +1,6 @@ name: PandacraftUtils main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils -version: 3.9 +version: 3.10 diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java index 125a361..a6de670 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPI.java @@ -5,6 +5,7 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executo import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorCommand; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorCommandAsync; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorPlayerList; +import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorPrivateMessage; public class NetworkAPI { @@ -22,6 +23,7 @@ public class NetworkAPI { new RequestExecutorCommandAsync(); new RequestExecutorPlayerList(); new RequestExecutorChatSend(); + new RequestExecutorPrivateMessage(); } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPIListener.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPIListener.java index 0bf9938..e79047e 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPIListener.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/NetworkAPIListener.java @@ -51,10 +51,7 @@ public class NetworkAPIListener extends Thread { private HashMap requestExecutors = new HashMap(); private NetworkAPIListener() { - super("NetworkAPI Listener"); - plugin.getServer().getLogger().info("System property 'file.encoding' was set to 'UTF-8'"); - - + super("NAPI Listener"); } @Override @@ -148,7 +145,7 @@ class PacketExecutor extends Thread { private Socket socket; public PacketExecutor(Socket s, int iteration) { - super("NetworkAPI Input Packet #"+iteration); + super("NAPI Input "+iteration); socket = s; } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPrivateMessage.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPrivateMessage.java new file mode 100644 index 0000000..c7d3d2b --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/network_api/request_executors/RequestExecutorPrivateMessage.java @@ -0,0 +1,60 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.Console; + +import ru.tehkode.permissions.PermissionUser; +import ru.tehkode.permissions.bukkit.PermissionsEx; +import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.Response; +import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; +import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface; + +public class RequestExecutorPrivateMessage extends AbstractRequestExecutor { + + public RequestExecutorPrivateMessage() { + super("private_message"); + } + + @Override + protected Response run(String data) { + + String[] dataSplit = data.split(" ", 3); + if (dataSplit.length != 3) + return new Response(false, "bad_data : at least two space"); + + PermissionUser permUser = PermissionsEx.getUser(dataSplit[0]); + + if (permUser == null) + return new Response(false, "user_src_not_exist : user is not registered in permission plugin"); + + Player p = plugin.getServer().getPlayer(dataSplit[1]); + + if (p == null || !p.isOnline()) { + plugin.getLogger().warning(ChatColor.RED+dataSplit[1]+" n'est pas en ligne"); + return new Response(false, "user_dest_not_online"); + } + + String displayName = "["+ChatColor.GRAY+"Console"+ChatColor.GOLD+"]"+permUser.getPrefix() + permUser.getName() + permUser.getSuffix(); + + + String finalMessageToUser = ChatColor.GOLD+"["+displayName+ChatColor.GOLD+" -> moi] "+ChatColor.RESET+dataSplit[2]; + String finalMessageToConsole = ChatColor.GOLD+"["+displayName+ChatColor.GOLD+" -> "+p.getDisplayName()+ChatColor.GOLD+"] "+ChatColor.RESET+dataSplit[2]; + + plugin.getServer().getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', finalMessageToConsole)); + p.sendMessage(ChatColor.translateAlternateColorCodes('&', finalMessageToUser)); + + if (!OnlinePlayerManager.get(p).hasReceiveMessageFromNetworkAPI()) { + p.sendMessage(ChatColor.GREEN+"Répondez à un message venant de la console avec "+ChatColor.GRAY+"/m console"); + } + + + EssentialsInterface.getPlayer(p).setReplyTo(new CommandSource(plugin.getServer().getConsoleSender())); + Console.getConsoleReplyTo().setReplyTo(new CommandSource(p)); + + return new Response(true, ""); + } + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java index e1bddfe..713c27f 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java @@ -315,6 +315,21 @@ public class OnlinePlayer { + private boolean hasAlreadyReceivedMessageFromNetworkAPI = false; + + /** + * Indique à l'intance de OnlinePlayer que le joueur vient de recevoir un message + * depuis le networkAPI. + * @return false si il s'agit du premier message depuis la connexion du joueur ou true pour les messages suivant + */ + public boolean hasReceiveMessageFromNetworkAPI() { + boolean r = hasAlreadyReceivedMessageFromNetworkAPI; + hasAlreadyReceivedMessageFromNetworkAPI = true; + return r; + } + + +