diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/json/GraphJSONParser.java b/Plan/common/src/main/java/com/djrapitops/plan/system/json/GraphJSONParser.java index ca67556ce..e22e33479 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/json/GraphJSONParser.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/json/GraphJSONParser.java @@ -25,6 +25,7 @@ import com.djrapitops.plan.data.store.objects.DateMap; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.db.Database; import com.djrapitops.plan.db.access.queries.analysis.ActivityIndexQueries; +import com.djrapitops.plan.db.access.queries.analysis.NetworkActivityIndexQueries; import com.djrapitops.plan.db.access.queries.analysis.PlayerCountQueries; import com.djrapitops.plan.db.access.queries.objects.*; import com.djrapitops.plan.system.database.DBSystem; @@ -169,6 +170,27 @@ public class GraphJSONParser { return dataMap; } + public Map activityGraphsJSONAsMap() { + Database db = dbSystem.getDatabase(); + long date = System.currentTimeMillis(); + Long threshold = config.get(TimeSettings.ACTIVE_PLAY_THRESHOLD); + + DateMap> activityData = new DateMap<>(); + for (long time = date; time >= date - TimeAmount.MONTH.toMillis(2L); time -= TimeAmount.WEEK.toMillis(1L)) { + activityData.put(time, db.query(NetworkActivityIndexQueries.fetchActivityIndexGroupingsOn(time, threshold))); + } + + Map.Entry> lastActivityEntry = activityData.lastEntry(); + Pie activityPie = graphs.pie().activityPie(lastActivityEntry != null ? lastActivityEntry.getValue() : Collections.emptyMap()); + StackGraph activityStackGraph = graphs.stack().activityStackGraph(activityData); + + Map dataMap = new HashMap<>(); + dataMap.put("activity_series", activityStackGraph.getDataSets()); + dataMap.put("activity_labels", activityStackGraph.getLabels()); + dataMap.put("activity_pie_series", activityPie.getSlices()); + return dataMap; + } + public Map geolocationGraphsJSONAsMap(UUID serverUUID) { Database db = dbSystem.getDatabase(); Map geolocationCounts = db.query(GeoInfoQueries.serverGeolocationCounts(serverUUID)); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/GraphsJSONHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/GraphsJSONHandler.java index 8b54a50b0..1b356805e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/GraphsJSONHandler.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/GraphsJSONHandler.java @@ -54,10 +54,15 @@ public class GraphsJSONHandler implements PageHandler { @Override public Response getResponse(Request request, RequestTarget target) throws WebException { - UUID serverUUID = identifiers.getServerUUID(target); // Can throw BadRequestException String type = target.getParameter("type") .orElseThrow(() -> new BadRequestException("'type' parameter was not defined.")); - return generateGraphDataJSONOfType(type, serverUUID); + + if (target.getParameter("server").isPresent()) { + UUID serverUUID = identifiers.getServerUUID(target); // Can throw BadRequestException + return generateGraphDataJSONOfType(type, serverUUID); + } + // Assume network + return generateGraphDataJSONOfType(type); } private JSONResponse generateGraphDataJSONOfType(String type, UUID serverUUID) throws BadRequestException { @@ -83,6 +88,15 @@ public class GraphsJSONHandler implements PageHandler { } } + private JSONResponse generateGraphDataJSONOfType(String type) throws BadRequestException { + switch (type) { + case "activity": + return new JSONResponse(graphJSON.activityGraphsJSONAsMap()); + default: + throw new BadRequestException("unknown 'type' parameter: " + type); + } + } + @Override public boolean isAuthorized(Authentication auth, RequestTarget target) throws WebUserAuthException { return auth.getWebUser().getPermLevel() <= 0; diff --git a/Plan/common/src/main/resources/assets/plan/web/network.html b/Plan/common/src/main/resources/assets/plan/web/network.html index c0973af03..78c7a14f4 100644 --- a/Plan/common/src/main/resources/assets/plan/web/network.html +++ b/Plan/common/src/main/resources/assets/plan/web/network.html @@ -1288,6 +1288,19 @@ setLoadingText('Calculating values..'); jsonRequest("../v1/network/playerbaseOverview", loadPlayerbaseOverviewValues); setLoadingText('Rendering graphs..'); + + jsonRequest("../v1/graph?type=activity", function (json, error) { + if (json) { + activityPie('activityPie', { + name: 'Players', colorByPoint: true, data: json.activity_pie_series + }); + stackChart('activityStackGraph', json.activity_labels, json.activity_series, 'Players'); + } else if (error) { + $('#activityPie').text("Failed to load graph data: " + error); + $('#activityStackGraph').text("Failed to load graph data: " + error); + } + }); + setLoadingText('Sorting players table..'); setLoadingText('Almost done..'); var navButtons = document.getElementsByClassName("nav-button");