mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-07-01 09:04:50 +02:00
JSON end-point for Graphs
This commit is contained in:
parent
252136fabf
commit
6ecad861da
|
@ -144,19 +144,22 @@ public class SessionQueries {
|
||||||
* @return Map: Player UUID - List of sessions on the server.
|
* @return Map: Player UUID - List of sessions on the server.
|
||||||
*/
|
*/
|
||||||
public static Query<Map<UUID, List<Session>>> fetchSessionsOfServer(UUID serverUUID) {
|
public static Query<Map<UUID, List<Session>>> fetchSessionsOfServer(UUID serverUUID) {
|
||||||
|
return db -> SessionsMutator.sortByPlayers(db.query(fetchSessionsOfServerFlat(serverUUID)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static QueryStatement<List<Session>> fetchSessionsOfServerFlat(UUID serverUUID) {
|
||||||
String sql = SELECT_SESSIONS_STATEMENT +
|
String sql = SELECT_SESSIONS_STATEMENT +
|
||||||
WHERE + SessionsTable.TABLE_NAME + '.' + SessionsTable.SERVER_UUID + "=?" +
|
WHERE + SessionsTable.TABLE_NAME + '.' + SessionsTable.SERVER_UUID + "=?" +
|
||||||
ORDER_BY_SESSION_START_DESC;
|
ORDER_BY_SESSION_START_DESC;
|
||||||
return new QueryStatement<Map<UUID, List<Session>>>(sql, 50000) {
|
return new QueryStatement<List<Session>>(sql, 50000) {
|
||||||
@Override
|
@Override
|
||||||
public void prepare(PreparedStatement statement) throws SQLException {
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
statement.setString(1, serverUUID.toString());
|
statement.setString(1, serverUUID.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<UUID, List<Session>> processResults(ResultSet set) throws SQLException {
|
public List<Session> processResults(ResultSet set) throws SQLException {
|
||||||
List<Session> sessions = extractDataFromSessionSelectStatement(set);
|
return extractDataFromSessionSelectStatement(set);
|
||||||
return SessionsMutator.sortByPlayers(sessions);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ public class ResponseHandler extends TreePageHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
registerPage("info", infoRequestPageHandler);
|
registerPage("info", infoRequestPageHandler);
|
||||||
registerPage("json", rootJSONHandler);
|
registerPage("v1", rootJSONHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response getResponse(Request request) {
|
public Response getResponse(Request request) {
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Player Analytics (Plan).
|
||||||
|
*
|
||||||
|
* Plan is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License v3 as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Plan is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.djrapitops.plan.system.webserver.pages.json;
|
||||||
|
|
||||||
|
import com.djrapitops.plan.api.exceptions.WebUserAuthException;
|
||||||
|
import com.djrapitops.plan.api.exceptions.connection.BadRequestException;
|
||||||
|
import com.djrapitops.plan.api.exceptions.connection.WebException;
|
||||||
|
import com.djrapitops.plan.data.store.mutators.MutatorFunctions;
|
||||||
|
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
||||||
|
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
|
||||||
|
import com.djrapitops.plan.data.store.mutators.TPSMutator;
|
||||||
|
import com.djrapitops.plan.db.Database;
|
||||||
|
import com.djrapitops.plan.db.access.queries.containers.ServerPlayerContainersQuery;
|
||||||
|
import com.djrapitops.plan.db.access.queries.objects.SessionQueries;
|
||||||
|
import com.djrapitops.plan.db.access.queries.objects.TPSQueries;
|
||||||
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
|
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
||||||
|
import com.djrapitops.plan.system.settings.paths.TimeSettings;
|
||||||
|
import com.djrapitops.plan.system.webserver.Request;
|
||||||
|
import com.djrapitops.plan.system.webserver.RequestTarget;
|
||||||
|
import com.djrapitops.plan.system.webserver.auth.Authentication;
|
||||||
|
import com.djrapitops.plan.system.webserver.response.Response;
|
||||||
|
import com.djrapitops.plan.system.webserver.response.data.JSONResponse;
|
||||||
|
import com.djrapitops.plan.utilities.html.graphs.Graphs;
|
||||||
|
import com.djrapitops.plan.utilities.html.graphs.line.LineGraphFactory;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON handler for different graph data JSON requests.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class GraphsJSONHandler extends ServerParameterJSONHandler {
|
||||||
|
|
||||||
|
private final Graphs graphs;
|
||||||
|
private final TimeZone timeZone;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public GraphsJSONHandler(
|
||||||
|
PlanConfig config,
|
||||||
|
DBSystem dbSystem,
|
||||||
|
Graphs graphs
|
||||||
|
) {
|
||||||
|
super(dbSystem);
|
||||||
|
this.graphs = graphs;
|
||||||
|
|
||||||
|
this.timeZone = config.get(TimeSettings.USE_SERVER_TIME) ? TimeZone.getDefault() : TimeZone.getTimeZone("GMT");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Response getResponse(Request request, RequestTarget target) throws WebException {
|
||||||
|
UUID serverUUID = getServerUUID(target); // Can throw BadRequestException
|
||||||
|
String type = target.getParameter("type")
|
||||||
|
.orElseThrow(() -> new BadRequestException("'type' parameter was not defined."));
|
||||||
|
String graphDataJSON = generateGraphDataJSONOfType(type, serverUUID);
|
||||||
|
return new JSONResponse(graphDataJSON);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateGraphDataJSONOfType(String type, UUID serverUUID) throws BadRequestException {
|
||||||
|
Database db = dbSystem.getDatabase();
|
||||||
|
LineGraphFactory lineGraphs = graphs.line();
|
||||||
|
switch (type) {
|
||||||
|
case "performance":
|
||||||
|
TPSMutator tpsMutator = new TPSMutator(db.query(TPSQueries.fetchTPSDataOfServer(serverUUID)))
|
||||||
|
.filterDataBetween(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(180L), System.currentTimeMillis());
|
||||||
|
return '{' +
|
||||||
|
"\"playersOnline\":" + lineGraphs.playersOnlineGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
",\"tps\":" + lineGraphs.tpsGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
",\"cpu\":" + lineGraphs.cpuGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
",\"ram\":" + lineGraphs.ramGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
",\"entities\":" + lineGraphs.entityGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
",\"chunks\":" + lineGraphs.chunkGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
",\"disk\":" + lineGraphs.diskGraph(tpsMutator).toHighChartsSeries() +
|
||||||
|
'}';
|
||||||
|
case "uniqueAndNew":
|
||||||
|
SessionsMutator sessionsMutator = new SessionsMutator(db.query(SessionQueries.fetchSessionsOfServerFlat(serverUUID)))
|
||||||
|
.filterSessionsBetween(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(180L), System.currentTimeMillis());
|
||||||
|
PlayersMutator playersMutator = new PlayersMutator(db.query(new ServerPlayerContainersQuery(serverUUID)))
|
||||||
|
.filterRegisteredBetween(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(180L), System.currentTimeMillis());
|
||||||
|
|
||||||
|
return "{\"uniquePlayers\":" +
|
||||||
|
lineGraphs.lineGraph(MutatorFunctions.toPointsWithRemovedOffset(sessionsMutator.uniqueJoinsPerDay(timeZone), timeZone)).toHighChartsSeries() +
|
||||||
|
",\"newPlayers\":" +
|
||||||
|
lineGraphs.lineGraph(MutatorFunctions.toPointsWithRemovedOffset(playersMutator.newPerDay(timeZone), timeZone)).toHighChartsSeries() +
|
||||||
|
'}';
|
||||||
|
default:
|
||||||
|
throw new BadRequestException("unknown 'type' parameter: " + type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAuthorized(Authentication auth, RequestTarget target) throws WebUserAuthException {
|
||||||
|
return auth.getWebUser().getPermLevel() <= 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,21 +17,16 @@
|
||||||
package com.djrapitops.plan.system.webserver.pages.json;
|
package com.djrapitops.plan.system.webserver.pages.json;
|
||||||
|
|
||||||
import com.djrapitops.plan.api.exceptions.WebUserAuthException;
|
import com.djrapitops.plan.api.exceptions.WebUserAuthException;
|
||||||
import com.djrapitops.plan.api.exceptions.connection.BadRequestException;
|
|
||||||
import com.djrapitops.plan.api.exceptions.connection.WebException;
|
import com.djrapitops.plan.api.exceptions.connection.WebException;
|
||||||
import com.djrapitops.plan.db.access.queries.objects.ServerQueries;
|
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.Server;
|
|
||||||
import com.djrapitops.plan.system.webserver.Request;
|
import com.djrapitops.plan.system.webserver.Request;
|
||||||
import com.djrapitops.plan.system.webserver.RequestTarget;
|
import com.djrapitops.plan.system.webserver.RequestTarget;
|
||||||
import com.djrapitops.plan.system.webserver.auth.Authentication;
|
import com.djrapitops.plan.system.webserver.auth.Authentication;
|
||||||
import com.djrapitops.plan.system.webserver.pages.PageHandler;
|
|
||||||
import com.djrapitops.plan.system.webserver.response.Response;
|
import com.djrapitops.plan.system.webserver.response.Response;
|
||||||
import com.djrapitops.plan.system.webserver.response.data.JSONResponse;
|
import com.djrapitops.plan.system.webserver.response.data.JSONResponse;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,9 +36,8 @@ import java.util.UUID;
|
||||||
* @see com.djrapitops.plan.utilities.html.tables.PlayersTableJSONParser For JSON parsing of /server players table.
|
* @see com.djrapitops.plan.utilities.html.tables.PlayersTableJSONParser For JSON parsing of /server players table.
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class PlayersTableJSONHandler implements PageHandler {
|
public class PlayersTableJSONHandler extends ServerParameterJSONHandler {
|
||||||
|
|
||||||
private final DBSystem dbSystem;
|
|
||||||
private final JSONFactory jsonFactory;
|
private final JSONFactory jsonFactory;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -51,8 +45,8 @@ public class PlayersTableJSONHandler implements PageHandler {
|
||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
JSONFactory jsonFactory
|
JSONFactory jsonFactory
|
||||||
) {
|
) {
|
||||||
|
super(dbSystem);
|
||||||
this.jsonFactory = jsonFactory;
|
this.jsonFactory = jsonFactory;
|
||||||
this.dbSystem = dbSystem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -61,31 +55,6 @@ public class PlayersTableJSONHandler implements PageHandler {
|
||||||
return new JSONResponse(jsonFactory.serverPlayersTableJSON(serverUUID));
|
return new JSONResponse(jsonFactory.serverPlayersTableJSON(serverUUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
private UUID getServerUUID(RequestTarget target) throws BadRequestException {
|
|
||||||
Optional<String> serverUUID = target.getParameter("serverUUID");
|
|
||||||
if (serverUUID.isPresent()) {
|
|
||||||
return getServerUUIDDirectly(serverUUID.get());
|
|
||||||
} else {
|
|
||||||
return getServerUUIDFromName(target); // Preferred
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private UUID getServerUUIDFromName(RequestTarget target) throws BadRequestException {
|
|
||||||
String serverName = target.getParameter("serverName")
|
|
||||||
.orElseThrow(() -> new BadRequestException("'serverName' parameter was not defined."));
|
|
||||||
return dbSystem.getDatabase().query(ServerQueries.fetchServerMatchingIdentifier(serverName))
|
|
||||||
.map(Server::getUuid)
|
|
||||||
.orElseThrow(() -> new BadRequestException("'serverName' was not found in the database.: '" + serverName + "'"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private UUID getServerUUIDDirectly(String serverUUIDString) throws BadRequestException {
|
|
||||||
try {
|
|
||||||
return UUID.fromString(serverUUIDString);
|
|
||||||
} catch (IllegalArgumentException malformedUUIDException) {
|
|
||||||
throw new BadRequestException("'serverName' was not a valid UUID: " + malformedUUIDException.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAuthorized(Authentication auth, RequestTarget target) throws WebUserAuthException {
|
public boolean isAuthorized(Authentication auth, RequestTarget target) throws WebUserAuthException {
|
||||||
return auth.getWebUser().getPermLevel() <= 0;
|
return auth.getWebUser().getPermLevel() <= 0;
|
||||||
|
|
|
@ -36,11 +36,13 @@ public class RootJSONHandler extends TreePageHandler {
|
||||||
@Inject
|
@Inject
|
||||||
public RootJSONHandler(
|
public RootJSONHandler(
|
||||||
ResponseFactory responseFactory,
|
ResponseFactory responseFactory,
|
||||||
|
GraphsJSONHandler graphsJSONHandler,
|
||||||
PlayersTableJSONHandler playersTableJSONHandler
|
PlayersTableJSONHandler playersTableJSONHandler
|
||||||
) {
|
) {
|
||||||
super(responseFactory);
|
super(responseFactory);
|
||||||
|
|
||||||
registerPage("players", playersTableJSONHandler);
|
registerPage("players", playersTableJSONHandler);
|
||||||
|
registerPage("graph", graphsJSONHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Player Analytics (Plan).
|
||||||
|
*
|
||||||
|
* Plan is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License v3 as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Plan is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.djrapitops.plan.system.webserver.pages.json;
|
||||||
|
|
||||||
|
import com.djrapitops.plan.api.exceptions.connection.BadRequestException;
|
||||||
|
import com.djrapitops.plan.db.access.queries.objects.ServerQueries;
|
||||||
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
|
import com.djrapitops.plan.system.info.server.Server;
|
||||||
|
import com.djrapitops.plan.system.webserver.RequestTarget;
|
||||||
|
import com.djrapitops.plan.system.webserver.pages.PageHandler;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON handler for different graph data JSON requests.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public abstract class ServerParameterJSONHandler implements PageHandler {
|
||||||
|
|
||||||
|
protected final DBSystem dbSystem;
|
||||||
|
|
||||||
|
protected ServerParameterJSONHandler(DBSystem dbSystem) {
|
||||||
|
this.dbSystem = dbSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected UUID getServerUUID(RequestTarget target) throws BadRequestException {
|
||||||
|
Optional<String> serverUUID = target.getParameter("serverUUID");
|
||||||
|
if (serverUUID.isPresent()) {
|
||||||
|
return getServerUUIDDirectly(serverUUID.get());
|
||||||
|
} else {
|
||||||
|
return getServerUUIDFromName(target); // Preferred
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected UUID getServerUUIDFromName(RequestTarget target) throws BadRequestException {
|
||||||
|
String serverName = target.getParameter("serverName")
|
||||||
|
.orElseThrow(() -> new BadRequestException("'serverName' parameter was not defined."));
|
||||||
|
return dbSystem.getDatabase().query(ServerQueries.fetchServerMatchingIdentifier(serverName))
|
||||||
|
.map(Server::getUuid)
|
||||||
|
.orElseThrow(() -> new BadRequestException("'serverName' was not found in the database.: '" + serverName + "'"));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected UUID getServerUUIDDirectly(String serverUUIDString) throws BadRequestException {
|
||||||
|
try {
|
||||||
|
return UUID.fromString(serverUUIDString);
|
||||||
|
} catch (IllegalArgumentException malformedUUIDException) {
|
||||||
|
throw new BadRequestException("'serverName' was not a valid UUID: " + malformedUUIDException.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12086,6 +12086,8 @@ a:focus {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 12rem;
|
height: 12rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
padding: 0.5rem;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
|
|
|
@ -4,27 +4,25 @@
|
||||||
* @param callback function with (json, error) parameters to call after the request.
|
* @param callback function with (json, error) parameters to call after the request.
|
||||||
*/
|
*/
|
||||||
function jsonRequest(address, callback) {
|
function jsonRequest(address, callback) {
|
||||||
var xhttp = new XMLHttpRequest();
|
|
||||||
xhttp.onreadystatechange = function () {
|
|
||||||
if (this.readyState === 4) {
|
|
||||||
try {
|
|
||||||
if (this.status === 200) {
|
|
||||||
var json = JSON.parse(this.responseText);
|
|
||||||
callback(json, null)
|
|
||||||
} else if (this.status === 404 || this.status === 403 || this.status === 500) {
|
|
||||||
callback(null, this.status)
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
callback(null, e.message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhttp.open("GET", address, true);
|
|
||||||
xhttp.send();
|
|
||||||
}
|
|
||||||
|
|
||||||
function asyncJsonRequest(address, callback) {
|
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
jsonRequest(address, callback)
|
var xhttp = new XMLHttpRequest();
|
||||||
|
xhttp.onreadystatechange = function () {
|
||||||
|
if (this.readyState === 4) {
|
||||||
|
try {
|
||||||
|
if (this.status === 200) {
|
||||||
|
var json = JSON.parse(this.responseText);
|
||||||
|
setTimeout(function () {
|
||||||
|
callback(json, null)
|
||||||
|
}, 0);
|
||||||
|
} else if (this.status === 404 || this.status === 403 || this.status === 500) {
|
||||||
|
callback(null, this.status)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
callback(null, e.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhttp.open("GET", address, true);
|
||||||
|
xhttp.send();
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
|
@ -31,7 +31,7 @@
|
||||||
</script>
|
</script>
|
||||||
<div class="page-loader">
|
<div class="page-loader">
|
||||||
<span class="loader"></span>
|
<span class="loader"></span>
|
||||||
<span class="loader-text">Please wait..</span>
|
<p class="loader-text">Please wait..</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Page Wrapper -->
|
<!-- Page Wrapper -->
|
||||||
|
@ -175,7 +175,7 @@
|
||||||
class="fas fa-fw fa-chart-area col-blue"></i>
|
class="fas fa-fw fa-chart-area col-blue"></i>
|
||||||
Online Activity</h6>
|
Online Activity</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="chart-area" id="playerChartWeek"></div>
|
<div class="chart-area" id="playersOnlineChart"><span class="loader"></span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -352,9 +352,7 @@
|
||||||
class="fas fa-fw fa-chart-area col-blue"></i>
|
class="fas fa-fw fa-chart-area col-blue"></i>
|
||||||
New & Unique Players</h6>
|
New & Unique Players</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="chart-area">
|
<div class="chart-area" id="uniqueChart"><span class="loader"></span></div>
|
||||||
<canvas id="myAreaChart2"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -368,7 +366,7 @@
|
||||||
Calendar</h6>
|
Calendar</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="chart-area">
|
<div class="chart-area">
|
||||||
<canvas id="myAreaChart2"></canvas>
|
<span class="loader"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -823,9 +821,7 @@
|
||||||
class="fas fa-fw fa-chart-line col-amber"></i>
|
class="fas fa-fw fa-chart-line col-amber"></i>
|
||||||
Playerbase development</h6>
|
Playerbase development</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="chart-area">
|
<div class="chart-area" id="playerBaseDevelopmentChart"></div>
|
||||||
<canvas id="myAreaChart2"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -980,7 +976,11 @@
|
||||||
Player List</h6>
|
Player List</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-bordered table-striped table-hover player-table dataTable"></table>
|
<table class="table table-bordered table-striped table-hover player-table dataTable">
|
||||||
|
<tr>
|
||||||
|
<td>Loading..</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1014,7 +1014,7 @@
|
||||||
Geolocations</h6>
|
Geolocations</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="chart-area">
|
<div class="chart-area">
|
||||||
<canvas id="myAreaChart"></canvas>
|
<span class="loader"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1075,49 +1075,66 @@
|
||||||
<ul class="nav nav-tabs" id="myTab" role="tablist">
|
<ul class="nav nav-tabs" id="myTab" role="tablist">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a aria-controls="home" aria-selected="true" class="nav-link active col-black"
|
<a aria-controls="home" aria-selected="true" class="nav-link active col-black"
|
||||||
data-toggle="tab" href="#all" id="home-tab" role="tab"><i
|
data-toggle="tab" href="#all" id="performance-all-tab" role="tab"><i
|
||||||
class="fa fa-fw fa-cogs col-blue-grey"></i> All</a>
|
class="fa fa-fw fa-cogs col-blue-grey"></i> All</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a aria-controls="profile" aria-selected="false" class="nav-link col-black"
|
<a aria-controls="profile" aria-selected="false" class="nav-link col-black"
|
||||||
data-toggle="tab"
|
data-toggle="tab"
|
||||||
href="#tps" id="profile-tab" role="tab"><i
|
href="#tps" id="performance-tps-tab" role="tab"><i
|
||||||
class="fa fa-fw fa-tachometer-alt col-blue-grey"></i> TPS</a>
|
class="fa fa-fw fa-tachometer-alt col-blue-grey"></i> TPS</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
||||||
data-toggle="tab" href="#cpuram" id="contact-tab"
|
data-toggle="tab" href="#cpuram" id="performance-hardware-tab"
|
||||||
role="tab"><i
|
role="tab"><i
|
||||||
class="fa fa-fw fa-microchip col-blue-grey"></i> CPU
|
class="fa fa-fw fa-microchip col-blue-grey"></i> CPU
|
||||||
& RAM</a>
|
& RAM</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
||||||
data-toggle="tab" href="#worldload" id="contact-tab"
|
data-toggle="tab" href="#worldload" id="performance-minecraft-tab"
|
||||||
role="tab"><i class="fa fa-fw fa-map col-blue-grey"></i>
|
role="tab"><i class="fa fa-fw fa-map col-blue-grey"></i>
|
||||||
World
|
World
|
||||||
Load</a>
|
Load</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
||||||
data-toggle="tab" href="#ping" id="contact-tab" role="tab"><i
|
data-toggle="tab" href="#ping" id="performance-ping-tab" role="tab"><i
|
||||||
class="fa fa-fw fa-signal col-blue-grey"></i> Ping</a>
|
class="fa fa-fw fa-signal col-blue-grey"></i> Ping</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
<a aria-controls="contact" aria-selected="false" class="nav-link col-black"
|
||||||
data-toggle="tab" href="#ping" id="contact-tab" role="tab"><i
|
data-toggle="tab" href="#disk" id="performance-disk-tab" role="tab"><i
|
||||||
class="fa fa-fw fa-hdd col-blue-grey"></i> Disk Space</a>
|
class="fa fa-fw fa-hdd col-blue-grey"></i> Disk Space</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content" id="myTabContent">
|
<div class="tab-content" id="myTabContent">
|
||||||
<div aria-labelledby="home-tab" class="tab-pane fade show active" id="all"
|
<div aria-labelledby="performance-all-tab" class="tab-pane fade show active"
|
||||||
role="tabpanel">...
|
id="all"
|
||||||
|
role="tabpanel">
|
||||||
|
<div class="chart-area" id="performanceGraph"><span class="loader"></span></div>
|
||||||
</div>
|
</div>
|
||||||
<div aria-labelledby="profile-tab" class="tab-pane fade" id="tps"
|
<div aria-labelledby="performance-tps-tab" class="tab-pane fade" id="tps"
|
||||||
role="tabpanel">...
|
role="tabpanel">
|
||||||
|
<div class="chart-area" id="tpsGraph"><span class="loader"></span></div>
|
||||||
</div>
|
</div>
|
||||||
<div aria-labelledby="contact-tab" class="tab-pane fade" id="cpuram"
|
<div aria-labelledby="performance-hardware-tab" class="tab-pane fade" id="cpuram"
|
||||||
role="tabpanel">...
|
role="tabpanel">
|
||||||
|
<div class="chart-area" id="resourceGraph"><span class="loader"></span></div>
|
||||||
|
</div>
|
||||||
|
<div aria-labelledby="performance-minecraft-tab" class="tab-pane fade"
|
||||||
|
id="worldload"
|
||||||
|
role="tabpanel">
|
||||||
|
<div class="chart-area" id="worldGraph"><span class="loader"></span></div>
|
||||||
|
</div>
|
||||||
|
<div aria-labelledby="performance-ping-tab" class="tab-pane fade" id="ping"
|
||||||
|
role="tabpanel">
|
||||||
|
<div class="chart-area" id="pingGraph"><span class="loader"></span></div>
|
||||||
|
</div>
|
||||||
|
<div aria-labelledby="performance-disk-tab" class="tab-pane fade" id="disk"
|
||||||
|
role="tabpanel">
|
||||||
|
<div class="chart-area" id="diskGraph"><span class="loader"></span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1494,6 +1511,20 @@
|
||||||
<!-- Page level custom scripts -->
|
<!-- Page level custom scripts -->
|
||||||
<script src="js/server-values.js"></script>
|
<script src="js/server-values.js"></script>
|
||||||
<script src="js/charts/playerGraph.js"></script>
|
<script src="js/charts/playerGraph.js"></script>
|
||||||
|
<script src="js/charts/punchCard.js"></script>
|
||||||
|
<script src="js/charts/healthGauge.js"></script>
|
||||||
|
<script src="js/charts/activityPie.js"></script>
|
||||||
|
<script src="js/charts/lineGraph.js"></script>
|
||||||
|
<script src="js/charts/stackGraph.js"></script>
|
||||||
|
<script src="js/charts/worldPie.js"></script>
|
||||||
|
<script src="js/charts/performanceGraph.js"></script>
|
||||||
|
<script src="js/charts/tpsGraph.js"></script>
|
||||||
|
<script src="js/charts/resourceGraph.js"></script>
|
||||||
|
<script src="js/charts/diskGraph.js"></script>
|
||||||
|
<script src="js/charts/worldGraph.js"></script>
|
||||||
|
<script src="js/charts/worldMap.js"></script>
|
||||||
|
<script src="js/charts/onlineActivityCalendar.js"></script>
|
||||||
|
<script src="js/charts/horizontalBarGraph.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
setLoadingText('Calculating values..');
|
setLoadingText('Calculating values..');
|
||||||
|
@ -1831,9 +1862,6 @@
|
||||||
firstDay: ${firstDay}
|
firstDay: ${firstDay}
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
playersOnline: ${playersOnlineSeries},
|
|
||||||
uniquePlayers: ${uniquePlayersSeries},
|
|
||||||
newPlayers: ${newPlayersSeries},
|
|
||||||
tps: ${tpsSeries},
|
tps: ${tpsSeries},
|
||||||
cpu: ${cpuSeries},
|
cpu: ${cpuSeries},
|
||||||
ram: ${ramSeries},
|
ram: ${ramSeries},
|
||||||
|
@ -1908,20 +1936,141 @@
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var series = {
|
|
||||||
playersOnline: {
|
|
||||||
name: s.name.playersOnline,
|
|
||||||
type: s.type.areaSpline,
|
|
||||||
tooltip: s.tooltip.zeroDecimals,
|
|
||||||
data: v.data.playersOnline,
|
|
||||||
color: v.colors.playersOnline,
|
|
||||||
yAxis: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
playersChart('playerChartWeek', series.playersOnline, 3);
|
jsonRequest("../v1/graph?type=performance&serverName=${serverName}", function (data, error) {
|
||||||
|
if (data) {
|
||||||
|
var series = {
|
||||||
|
playersOnline: {
|
||||||
|
name: s.name.playersOnline,
|
||||||
|
type: s.type.areaSpline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.playersOnline,
|
||||||
|
color: v.colors.playersOnline,
|
||||||
|
yAxis: 0
|
||||||
|
},
|
||||||
|
tps: {
|
||||||
|
name: s.name.tps,
|
||||||
|
type: s.type.spline,
|
||||||
|
color: v.colors.tpsHigh,
|
||||||
|
zones: s.zones.tps,
|
||||||
|
tooltip: s.tooltip.twoDecimals,
|
||||||
|
data: data.tps,
|
||||||
|
yAxis: 1
|
||||||
|
},
|
||||||
|
cpu: {
|
||||||
|
name: s.name.cpu,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.twoDecimals,
|
||||||
|
data: data.cpu,
|
||||||
|
color: v.colors.cpu,
|
||||||
|
yAxis: 2
|
||||||
|
},
|
||||||
|
cpu_alt: {
|
||||||
|
name: s.name.cpu,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.twoDecimals,
|
||||||
|
data: data.cpu,
|
||||||
|
color: v.colors.cpu,
|
||||||
|
yAxis: 1
|
||||||
|
},
|
||||||
|
ram: {
|
||||||
|
name: s.name.ram,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.ram,
|
||||||
|
color: v.colors.ram,
|
||||||
|
yAxis: 3
|
||||||
|
},
|
||||||
|
ram_alt: {
|
||||||
|
name: s.name.ram,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.ram,
|
||||||
|
color: v.colors.ram,
|
||||||
|
yAxis: 2
|
||||||
|
},
|
||||||
|
entities: {
|
||||||
|
name: s.name.entities,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.entities,
|
||||||
|
color: v.colors.entities,
|
||||||
|
yAxis: 4
|
||||||
|
},
|
||||||
|
entities_alt: {
|
||||||
|
name: s.name.entities,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.entities,
|
||||||
|
color: v.colors.entities,
|
||||||
|
yAxis: 1
|
||||||
|
},
|
||||||
|
chunks: {
|
||||||
|
name: s.name.chunks,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.chunks,
|
||||||
|
color: v.colors.chunks,
|
||||||
|
yAxis: 5
|
||||||
|
},
|
||||||
|
chunks_alt: {
|
||||||
|
name: s.name.chunks,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.chunks,
|
||||||
|
color: v.colors.chunks,
|
||||||
|
yAxis: 2
|
||||||
|
},
|
||||||
|
disk: {
|
||||||
|
name: s.name.disk,
|
||||||
|
type: s.type.spline,
|
||||||
|
color: v.colors.tpsHigh,
|
||||||
|
zones: s.zones.disk,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.disk
|
||||||
|
}
|
||||||
|
};
|
||||||
|
playersChart('playersOnlineChart', series.playersOnline, 2);
|
||||||
|
performanceChart('performanceGraph', series.playersOnline, series.tps, series.cpu, series.ram, series.entities, series.chunks);
|
||||||
|
tpsChart('tpsGraph', series.tps, series.playersOnline);
|
||||||
|
resourceChart('resourceGraph', series.cpu_alt, series.ram_alt, series.playersOnline);
|
||||||
|
worldChart('worldGraph', series.entities_alt, series.chunks_alt, series.playersOnline);
|
||||||
|
diskChart('diskGraph', [series.disk]);
|
||||||
|
} else if (error) {
|
||||||
|
$('#playersOnlineChart').text("Failed to load graph data: " + error);
|
||||||
|
$('#performanceGraph').text("Failed to load graph data: " + error);
|
||||||
|
$('#tpsGraph').text("Failed to load graph data: " + error);
|
||||||
|
$('#resourceGraph').text("Failed to load graph data: " + error);
|
||||||
|
$('#worldGraph').text("Failed to load graph data: " + error);
|
||||||
|
$('#diskGraph').text("Failed to load graph data: " + error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jsonRequest("../v1/graph?type=uniqueAndNew&serverName=${serverName}", function (data, error) {
|
||||||
|
if (data) {
|
||||||
|
var uniquePlayers = {
|
||||||
|
name: s.name.uniquePlayers,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.uniquePlayers,
|
||||||
|
color: v.colors.playersOnline
|
||||||
|
};
|
||||||
|
var newPlayers = {
|
||||||
|
name: s.name.newPlayers,
|
||||||
|
type: s.type.spline,
|
||||||
|
tooltip: s.tooltip.zeroDecimals,
|
||||||
|
data: data.newPlayers,
|
||||||
|
color: v.colors.newPlayers
|
||||||
|
};
|
||||||
|
lineChart('uniqueChart', [uniquePlayers, newPlayers]);
|
||||||
|
} else if (error) {
|
||||||
|
$('#uniqueChart').text("Failed to load graph data: " + error)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
setLoadingText('Sorting players table..');
|
setLoadingText('Sorting players table..');
|
||||||
jsonRequest("../json/players?serverName=${serverName}", function (playersTableJson, error) {
|
|
||||||
|
jsonRequest("../v1/players?serverName=${serverName}", function (playersTableJson, error) {
|
||||||
if (playersTableJson) {
|
if (playersTableJson) {
|
||||||
$('.player-table').DataTable({
|
$('.player-table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user