Correction de bug du NetworkAPI et prise en charge des codes couleurs en &

This commit is contained in:
Marc Baloup 2015-02-08 19:46:20 -05:00
parent 9a45dbf44b
commit 13a3ab93b9
3 changed files with 31 additions and 31 deletions

View File

@ -1,28 +1,28 @@
Protocole de NetworkAPI Protocole de NetworkAPI
==================== ====================
Ce fichier défini simplement le fonctionnement du protocole qui sera implémenté dans le package `net.mc_pandacraft.java.plugin.pandacraftutils.network_api` Ce fichier défini simplement le fonctionnement du protocole qui sera implémenté dans le package `net.mc_pandacraft.java.plugin.pandacraftutils.network_api`
Il servira à faire communiquer le serveur Minecraft avec l'interface d'administration ou le site internet Il servira à faire communiquer le serveur Minecraft avec l'interface d'administration ou le site internet
## Type de connexion ## Type de connexion
Connexion TCP Connexion TCP
## Cryptage ## Cryptage
Les communications devant rester dans un réseau privé (loopback, VNP) entre les systèmes composant le serveur, il n'est pas vraiment nécessaire de crypter les connexions. En d'autres termes, les clients effectuant les requêtes ne correspondent pas aux utilisateurs finaux, se trouvant sur les réseaux d'accès. Les communications devant rester dans un réseau privé (loopback, VNP) entre les systèmes composant le serveur, il n'est pas vraiment nécessaire de crypter les connexions. En d'autres termes, les clients effectuant les requêtes ne correspondent pas aux utilisateurs finaux, se trouvant sur les réseaux d'accès.
## Sécurité ## Sécurité
Même si le cryptage ne semble pas nécessaire, il faut tout de même sécuriser avec un système de "mot de passe", qui sera décrit en dessous Même si le cryptage ne semble pas nécessaire, il faut tout de même sécuriser avec un système de "mot de passe", qui sera décrit en dessous
## Structure d'une requête ## Structure d'une requête
La requête est construite en mode texte, sur plusieurs lignes. Chaque ligne se fini par un '\n' : La requête est construite en mode texte, sur plusieurs lignes. Chaque ligne se fini par un '\n' :
- Mot de passe alphanumérique + '\n' - Mot de passe alphanumérique + '\n'
- Commande principale + '\n' - Commande principale + '\n'
- Longueur des données, en octets + '\n' - Longueur des données, en octets + '\n'
- Valeur/données (pas de '\n' à la fin) - 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 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.
### Exemple de paquet ### Exemple de paquet
ervg1e3r2c ervg1e3r2c
@ -34,46 +34,44 @@ La requ
### Les commandes principaux ### Les commandes principaux
#### `command` #### `command`
Exécute la commande passée dans la partie **donnée** de la requête, comme si elle avait été exécutée par la console (`ConsoleCommandSender` dans Bukkit). Le résultat de l'exécution de la commande (valeur de retour de CommandExecutor.onCommand()) ne peux pas être retourné en réponse. Cependant, la non exécution de la commande sera indiqué dans la console du serveur Exécute la commande passée dans la partie **donnée** de la requête, comme si elle avait été exécutée par la console (`ConsoleCommandSender` dans Bukkit). Le résultat de l'exécution de la commande (valeur de retour de CommandExecutor.onCommand()) ne peux pas être retourné en réponse. Cependant, la non exécution de la commande sera indiqué dans la console du serveur
#### `command_async` #### `command_async`
Pareil que `command` mais cette fois, celle-ci n'est pas forcément exécutée dans le thread principal. Attention : certaines commandes ne peuvent pas fonctionner en asynchrone. Cette méthode est utile dans le cas où le thread principal ne répond plus Pareil que `command` mais cette fois, celle-ci n'est pas forcément exécutée dans le thread principal. Attention : certaines commandes ne peuvent pas fonctionner en asynchrone. Cette méthode est utile dans le cas où le thread principal ne répond plus
#### `broadcast` #### `broadcast`
Affiche un message sur le chat pour tout le monde connecté. Affiche un message sur le chat pour tout le monde connecté.
Le message passé dans la partie **donnée** est diffusé tel quel dans le chat et sur la console (attention à la bonne utilisation des codes couleurs) Le message passé dans la partie **donnée** est diffusé
#### `player_list` #### `player_list`
Renvoi la liste des joueurs connectés. La valeur passé dans la partie **donnée** doit contenir, selon les besoins : Renvoi la liste des joueurs connectés visibles, avec quelques infos utiles en convertissant les codes couleurs `&x` en `§x`
- `disp_name` pour donner les noms d'affichage du genre [Admin]Pseudo #### `player_list_op`
- `location` pour donner la localisation du joueur Renvoi la liste de tous les joueurs connectés (même vanish), avec quelques infos utiles en convertissant les codes couleurs `&x` en `§x`
- `ip` pour donner l'IP du joueur
- ...
## Structure d'une réponse ## Structure d'une réponse
La réponse est construite en mode texte, sur plusieurs lignes. Chaque ligne se fini par un '\n' : La réponse est construite en mode texte, sur plusieurs lignes. Chaque ligne se fini par un '\n' :
- Status de réponse (`OK` ou `ERROR`) + '\n' - Status de réponse (`OK` ou `ERROR`) + '\n'
- Longueur des données - Longueur des données
- Données, si nécessaire,ou message d'erreur, si status != `ok` - Données, si nécessaire,ou message d'erreur, si status != `ok`
### Exemple de paquets ### Exemple de paquets
Réponse à une requête sans résultat qui a bien été exécuté Réponse à une requête sans résultat qui a bien été exécuté
OK OK
0 0
---- ----
Réponse à une commande inexistante Réponse à une commande inexistante
ERROR ERROR
24 24
command_not_exists command_not_exists
---- ----
Réponse à une requête de type `player_list` Réponse à une requête de type `player_list`
OK OK
56 56
player\0disp_name player\0disp_name
marcbal\0§f[§4Admin§f]§4marcbal§r marcbal\0§f[§4Admin§f]§4marcbal§r

View File

@ -61,7 +61,7 @@ public class RequestAnalyser {
data = sB_data.toString(); data = sB_data.toString();
if (data.length() != data_size) if (data.getBytes().length != data_size)
throw new BadRequestException("wrong_data_size"); throw new BadRequestException("wrong_data_size");

View File

@ -1,5 +1,7 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors; package net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors;
import org.bukkit.ChatColor;
import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.Response; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.Response;
public class RequestExecutorBroadcast extends AbstractRequestExecutor { public class RequestExecutorBroadcast extends AbstractRequestExecutor {
@ -12,7 +14,7 @@ public class RequestExecutorBroadcast extends AbstractRequestExecutor {
@Override @Override
protected Response run(String data) { protected Response run(String data) {
plugin.broadcast(data, false); plugin.broadcast(ChatColor.translateAlternateColorCodes('&', data), false);
Response rep = new Response(); Response rep = new Response();
rep.good = true; rep.good = true;