Meilleure gestion des messages privés en provenance de la console
This commit is contained in:
parent
6a90f06445
commit
65b3bb5b15
@ -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' :
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<jardesc>
|
||||
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.9.jar"/>
|
||||
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.10.jar"/>
|
||||
<options buildIfNeeded="true" compress="true" descriptionLocation="/PandacraftUtils/make_jar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
||||
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
||||
<selectedProjects/>
|
||||
|
@ -1,6 +1,6 @@
|
||||
name: PandacraftUtils
|
||||
main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils
|
||||
version: 3.9
|
||||
version: 3.10
|
||||
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
@ -51,10 +51,7 @@ public class NetworkAPIListener extends Thread {
|
||||
private HashMap<String, AbstractRequestExecutor> requestExecutors = new HashMap<String, AbstractRequestExecutor>();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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, "");
|
||||
}
|
||||
|
||||
}
|
@ -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 <code>false</code> si il s'agit du premier message depuis la connexion du joueur ou <code>true</code> pour les messages suivant
|
||||
*/
|
||||
public boolean hasReceiveMessageFromNetworkAPI() {
|
||||
boolean r = hasAlreadyReceivedMessageFromNetworkAPI;
|
||||
hasAlreadyReceivedMessageFromNetworkAPI = true;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user