From 41e7fad9e1746e134b53d9319e8f81bb80246b7d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 2 May 2017 15:39:04 +0300 Subject: [PATCH] =?UTF-8?q?MCSM:=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcserver-manager/build.gradle | 2 +- .../asys/mcsmanager/CSPingJsonSerializer.java | 26 ++++++++++ .../java/asys/mcsmanager/MCSM_WebModule.java | 22 +++++++-- .../main/java/asys/mcsmanager/Manager.java | 14 ++---- .../main/java/asys/mcsmanager/ServerInfo.java | 48 +++++++++++++++++++ .../asys/mcsmanager/ServerInfoSerializer.java | 25 ++++++++++ .../src/main/resources/components.js | 14 +++++- 7 files changed, 136 insertions(+), 15 deletions(-) create mode 100644 mcserver-manager/src/main/java/asys/mcsmanager/CSPingJsonSerializer.java create mode 100644 mcserver-manager/src/main/java/asys/mcsmanager/ServerInfo.java create mode 100644 mcserver-manager/src/main/java/asys/mcsmanager/ServerInfoSerializer.java diff --git a/mcserver-manager/build.gradle b/mcserver-manager/build.gradle index d13918c..cfdfed1 100644 --- a/mcserver-manager/build.gradle +++ b/mcserver-manager/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.8.2-SNAPSHOT' +version = '0.8.3-SNAPSHOT' apply plugin: 'osgi' diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/CSPingJsonSerializer.java b/mcserver-manager/src/main/java/asys/mcsmanager/CSPingJsonSerializer.java new file mode 100644 index 0000000..c34c632 --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/CSPingJsonSerializer.java @@ -0,0 +1,26 @@ +/* + * DmitriyMX + * 2017-05-02 + */ +package asys.mcsmanager; + +import asys.mcsmanager.packets.CS_Ping; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; + +public class CSPingJsonSerializer implements JsonSerializer { + @Override + public JsonElement serialize(CS_Ping pingPacket, Type typeOfSrc, JsonSerializationContext context) { + JsonObject resultJson = new JsonObject(); + + resultJson.addProperty("time", pingPacket.getTime()); + resultJson.addProperty("tps", pingPacket.getTps()); + resultJson.addProperty("online", pingPacket.getCountPlayers()); + + return resultJson; + } +} diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java b/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java index c0becc2..95fde21 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java @@ -4,8 +4,10 @@ */ package asys.mcsmanager; +import asys.mcsmanager.packets.CS_Ping; import asys.webinterface.api.WebModule; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.sun.net.httpserver.HttpExchange; @@ -17,11 +19,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class MCSM_WebModule extends WebModule { - private static final Gson GSON = new Gson(); - private Manager manager; + private static final Gson GSON = new GsonBuilder() + .registerTypeAdapter(ServerInfo.class, new ServerInfoSerializer()) + .registerTypeAdapter(CS_Ping.class, new CSPingJsonSerializer()) + .create(); private final String MODULE_NAME = "mcsmanager"; private final String MODULE_URL = "/"+MODULE_NAME; private final Pattern URL_PATTERN_JS = Pattern.compile(MODULE_URL+"/(\\w+)\\.js"); + private Manager manager; MCSM_WebModule(Manager manager) { this.manager = manager; @@ -67,7 +72,18 @@ public class MCSM_WebModule extends WebModule { } private boolean handleServersJson(HttpExchange httpExchange) throws IOException { - this.sendJson(httpExchange, serverList()); + if (httpExchange.getRequestURI().getQuery() != null && + !httpExchange.getRequestURI().getQuery().isEmpty()) { + Map query = this.queryToMap(httpExchange.getRequestURI().getQuery()); + ServerInfo serverInfo = manager.getInfo(query.get("clientid")); + if (serverInfo == null) { + this.sendJson(httpExchange, "{}"); + } else { + this.sendJson(httpExchange, GSON.toJson(serverInfo)); + } + } else { + this.sendJson(httpExchange, serverList()); + } return true; } diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java b/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java index b248277..e05e6af 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/Manager.java @@ -12,7 +12,7 @@ import java.util.*; public class Manager { private Logger logger = LoggerFactory.getLogger(Manager.class); - private Map> serversMap = new HashMap<>(); + private Map serversMap = new HashMap<>(); /** * Добавляем в список ClientID @@ -25,7 +25,7 @@ public class Manager { } logger.debug("addClientId: {}", clientId); - serversMap.put(clientId, new LinkedList<>()); + serversMap.put(clientId, new ServerInfo(clientId)); return true; } @@ -37,20 +37,14 @@ public class Manager { */ public void putInfo(String clientId, CS_Ping pingPacket) { if (!serversMap.containsKey(clientId)) return; - - Deque list = serversMap.get(clientId); - if (list.size() == 720) { - list.removeFirst(); - } - list.addLast(pingPacket); - logger.debug("putInfo: {} [{}]", clientId, pingPacket.getTime()); + serversMap.get(clientId).putPing(pingPacket); } public Set getServerList() { return serversMap.keySet(); } - public Deque getInfo(String clientId) { + public ServerInfo getInfo(String clientId) { return serversMap.get(clientId); } } diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/ServerInfo.java b/mcserver-manager/src/main/java/asys/mcsmanager/ServerInfo.java new file mode 100644 index 0000000..fd29a74 --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/ServerInfo.java @@ -0,0 +1,48 @@ +/* + * DmitriyMX + * 2017-05-02 + */ +package asys.mcsmanager; + +import asys.mcsmanager.packets.CS_Ping; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Deque; +import java.util.LinkedList; + +public class ServerInfo { + private final Logger logger = LoggerFactory.getLogger(ServerInfo.class); + private final String name; + private int lastOnline; + private Deque pingDeque; + + public ServerInfo(String name) { + this.name = name; + this.pingDeque = new LinkedList<>(); + } + + public String getName() { + return name; + } + + public int getLastOnline() { + return lastOnline; + } + + public void setLastOnline(int lastOnline) { + this.lastOnline = lastOnline; + } + + public Deque getPingDeque() { + return pingDeque; + } + + public void putPing(CS_Ping ping) { + if (pingDeque.size() == 720) { + pingDeque.removeFirst(); + } + pingDeque.addLast(ping); + logger.debug("putPing: {} [{}]", name, ping.getTime()); + } +} diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/ServerInfoSerializer.java b/mcserver-manager/src/main/java/asys/mcsmanager/ServerInfoSerializer.java new file mode 100644 index 0000000..55aaa03 --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/ServerInfoSerializer.java @@ -0,0 +1,25 @@ +/* + * DmitriyMX + * 2017-05-02 + */ +package asys.mcsmanager; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; + +public class ServerInfoSerializer implements JsonSerializer { + @Override + public JsonElement serialize(ServerInfo serverInfo, Type typeOfSrc, JsonSerializationContext context) { + JsonObject resultJson = new JsonObject(); + + resultJson.addProperty("name", serverInfo.getName()); + resultJson.addProperty("lastOnline", serverInfo.getLastOnline()); + resultJson.add("pingList", context.serialize(serverInfo.getPingDeque())); + + return resultJson; + } +} diff --git a/mcserver-manager/src/main/resources/components.js b/mcserver-manager/src/main/resources/components.js index db6f44f..252ad1c 100644 --- a/mcserver-manager/src/main/resources/components.js +++ b/mcserver-manager/src/main/resources/components.js @@ -71,9 +71,21 @@ var ServerInfo = React.createClass({ }); var ServerListItem = React.createClass({ + requestServerInfo: function() { + fetch('/mcsmanager/servers.json?clientid='+this.props.title) + .then(function(response){ + response.json().then(function(data){ + console.debug(data); + }); + }) + .catch(function(err){ + console.error(err); + }); + }, render: function(){ return( - ce('a', {className: 'list-group-item clearfix' + (this.props.active ? ' active' : ''), href: '#'}, + ce('a', {className: 'list-group-item clearfix' + (this.props.active ? ' active' : ''), href: '#', + onClick: this.requestServerInfo}, ce('span', {style: {'padding-top': '15px'}}, ce('span', {className: 'glyphicon glyphicon-tasks'}), nbsp,