Ajout de la requête plater_list dans le networkAPI

This commit is contained in:
Marc Baloup 2015-02-08 22:28:57 -05:00
parent 13a3ab93b9
commit f950434030
9 changed files with 136 additions and 46 deletions

View File

@ -41,13 +41,28 @@ Pareil que `command` mais cette fois, celle-ci n'est pas forcément exécutée d
#### `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é Le message passé dans la partie **donnée** est diffusé en convertissant les codes couleurs `&x` en `§x`
#### `player_list` #### `player_list`
Renvoi la liste des joueurs connectés visibles, avec quelques infos utiles en convertissant les codes couleurs `&x` en `§x` Renvoi la liste des joueurs connectés, avec quelques infos utiles.
Si la partie **donnée** de la requête contient `op` et seulement ça (c'est à dire que `data.trim().equalsIgnoreCase("op")` doit être vrai), la liste des joueurs contiendra
aussi les joueurs vanish. Sinon, les joueurs vanish ne seront pas inclus dans la liste retournée
La première ligne de la réponse sera de la forme `5/30` avec le premier nombre représentant le nombre de joueur retourné, et le deuxième nombre étant le nombre de slots disponible sur le serveur. Le tout est suivi d'un `\n`.
Ensuite, une ligne pour un joueur. Chaque ligne, séparé par un `\n`, aura cette forme :
Pseudojoueur\0§f[§4Admin§f]§4Pseudojoueur§r\01\0creative;20;20\01
Chaque information sur une ligne sera séparé par un `\0` représentant le caractère NULL. Les informations données sont les suivantes :
1. Pseudo réel du joueur (répondant à la regex `[A-Za-z0-9_]{2,16}`)
2. Pseudo du joueur tel qu'il est affiché IG (avec le préfixe et le suffixe, + éventuellement un nickname, et les codes couleurs de la forme `§x`)
3. `1` si le joueur est actif, `0` si il est AFK.
4. 3 informations séparés par des `;`<br/>- Gamemode du joueur<br/>- Point de vie arrondi à l'unité<br/>- Point de faim arrondi à l'unité
5. `1` si le joueur est visible, `0` si il est vanish.
#### `player_list_op`
Renvoi la liste de tous les joueurs connectés (même vanish), avec quelques infos utiles en convertissant les codes couleurs `&x` en `§x`
## 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' :
@ -71,7 +86,7 @@ Réponse à une commande inexistante
Réponse à une requête de type `player_list` Réponse à une requête de type `player_list`
OK OK
56 52
player\0disp_name 1/30
marcbal\0§f[§4Admin§f]§4marcbal§r marcbal\0§f[§4Admin§f]§4marcbal§r\01\01;20;20\01

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc> <jardesc>
<jar path="PandacraftUtils/jar_export/PandacraftUtils-3.5.jar"/> <jar path="PandacraftUtils/jar_export/PandacraftUtils-3.6.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"/> <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"/> <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/> <selectedProjects/>

View File

@ -1,6 +1,6 @@
name: PandacraftUtils name: PandacraftUtils
main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils
version: 3.5 version: 3.6

View File

@ -2,6 +2,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.modules;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.List; import java.util.List;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -18,7 +19,6 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.ConfigManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface;
public class PacketOutServerInfoListener { public class PacketOutServerInfoListener {
private PandacraftUtils plugin = PandacraftUtils.getInstance(); private PandacraftUtils plugin = PandacraftUtils.getInstance();
@ -39,7 +39,7 @@ public class PacketOutServerInfoListener {
@Override @Override
public void onPacketSending(PacketEvent event) public void onPacketSending(PacketEvent event)
{ {
Player[] pl_list = PacketOutServerInfoListener.this.plugin.getServer().getOnlinePlayers(); Collection<OnlinePlayer> pl_list = OnlinePlayerManager.getAllNotVanished();
int count_player = 0; int count_player = 0;
@ -50,28 +50,21 @@ public class PacketOutServerInfoListener {
List<Player> plPlayerPremium = new ArrayList<Player>(); List<Player> plPlayerPremium = new ArrayList<Player>();
List<Player> plPlayer = new ArrayList<Player>(); List<Player> plPlayer = new ArrayList<Player>();
for (Player p : pl_list) for (OnlinePlayer op : pl_list)
{ {
if (p != null && p.isOnline())
{
// on passe si le joueur est vanish
if(EssentialsInterface.isPlayerVanished(p)) continue;
OnlinePlayer op = OnlinePlayerManager.get(p); if (op.isInGroup("admins"))
plAdmin.add(op.getPlayer());
else if (op.isInStaff())
plStaff.add(op.getPlayer());
else if (op.isInGroup("ultimate"))
plPlayerUltimate.add(op.getPlayer());
else if (op.isInGroup("premium"))
plPlayerPremium.add(op.getPlayer());
else
plPlayer.add(op.getPlayer());
if (op.isInGroup("admins")) count_player++;
plAdmin.add(p);
else if (op.isInStaff())
plStaff.add(p);
else if (op.isInGroup("ultimate"))
plPlayerUltimate.add(p);
else if (op.isInGroup("premium"))
plPlayerPremium.add(p);
else
plPlayer.add(p);
count_player++;
}
} }

View File

@ -3,6 +3,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.network_api;
import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorBroadcast; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorBroadcast;
import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorCommand; 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.RequestExecutorCommandAsync;
import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors.RequestExecutorPlayerList;
public class NetworkAPI { public class NetworkAPI {
@ -13,21 +14,14 @@ public class NetworkAPI {
/* /*
* Initialisation des exécuteurs des commandes réseau * Initialisation des exécuteurs des commandes réseau
* LEs constructeurs s'occupent eux même de se référencer dans l'instance de la classe NetworkAPIListener * Les constructeurs s'occupent eux même de se référencer dans l'instance de la classe NetworkAPIListener
*/ */
new RequestExecutorCommand(); new RequestExecutorCommand();
new RequestExecutorBroadcast(); new RequestExecutorBroadcast();
new RequestExecutorCommandAsync(); new RequestExecutorCommandAsync();
new RequestExecutorPlayerList();
} }
/*
public static void main(String[] args) throws Throwable {
loadNewInstance();
System.out.println(NetworkAPIListener.getInstance().getCommandList());
NetworkAPIListener.getInstance().join();
}
*/
} }

View File

@ -7,12 +7,21 @@ public class Response {
public String data = ""; public String data = "";
public Response(boolean good, String data) {
this.good = good;
this.data = data;
}
public Response() {
}
public void sendPacket(PrintStream out) { public void sendPacket(PrintStream out) {
if (data == null) data = ""; if (data == null) data = "";
out.print((good?"OK":"ERROR")+"\n"); out.print((good?"OK":"ERROR")+"\n");
out.print(data.length()+"\n"); out.print(data.getBytes().length+"\n");
out.print(data); out.print(data);
out.flush(); out.flush();
} }

View File

@ -0,0 +1,54 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.network_api.request_executors;
import java.util.Collection;
import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.Response;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
public class RequestExecutorPlayerList extends AbstractRequestExecutor {
public RequestExecutorPlayerList() {
super("player_list");
}
@Override
protected Response run(String data) {
boolean ope = data.trim().equalsIgnoreCase("op");
Collection<OnlinePlayer> players = ope ?
OnlinePlayerManager.getAll() :
OnlinePlayerManager.getAllNotVanished();
char nul = '\u0000', nl = '\n';
StringBuilder returnData = new StringBuilder();
// d'abord, le nombre de connecté / le nombre de slot
returnData.append(players.size()+"/"+plugin.getServer().getMaxPlayers()+nl);
for (OnlinePlayer op : players) {
returnData.append(op.getPlayer().getName());
returnData.append(nul+op.getPlayer().getDisplayName());
returnData.append(nul+(op.isAfk()?"0":"1"));
returnData.append(nul+op.getPlayer().getGameMode().toString());
returnData.append(';'+op.getPlayer().getHealth());
returnData.append(';'+op.getPlayer().getFoodLevel());
returnData.append(nul+(op.isVanished()?"0":"1"));
returnData.append(nl);
}
return new Response(true, returnData.toString());
}
}

View File

@ -249,6 +249,17 @@ public class OnlinePlayer {
/**
* Indique si le joueur est vanish, en se basant sur le plugin Essentials, qui
* gère cette foncionnalitée
*/
public boolean isVanished() {
return EssentialsInterface.isPlayerVanished(player);
}

View File

@ -1,7 +1,10 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.players; package net.mc_pandacraft.java.plugin.pandacraftutils.players;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
@ -33,7 +36,7 @@ public final class OnlinePlayerManager implements Listener {
HashMap<Player, OnlinePlayer> players = new HashMap<Player, OnlinePlayer>(); Map<Player, OnlinePlayer> players = Collections.synchronizedMap(new HashMap<Player, OnlinePlayer>());
private OnlinePlayerManager() { private OnlinePlayerManager() {
@ -80,12 +83,23 @@ public final class OnlinePlayerManager implements Listener {
} }
public static Collection<OnlinePlayer> getAll() { public static Collection<OnlinePlayer> getAll() {
return getInstance().players.values(); return new ArrayList<OnlinePlayer>(getInstance().players.values());
} }
public static boolean contains(Player p) { public static boolean isOnline(Player p) {
return getInstance().players.containsKey(p); return getInstance().players.containsKey(p);
} }
public static Collection<OnlinePlayer> getAllNotVanished() {
Collection<OnlinePlayer> players = getAll();
for (OnlinePlayer op : players.toArray(new OnlinePlayer[players.size()])) {
if (op.isVanished())
players.remove(op);
}
return players;
}
} }