From 517ffa0bcf396567a839e76d45ddc6760aa1b31b Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 6 Mar 2018 19:58:28 +0200 Subject: [PATCH] Added Session Calendar to Server page (#115 100%) --- .../plan/data/calculation/AnalysisData.java | 6 + .../webserver/pages/parsing/InspectPage.java | 2 +- .../utilities/file/export/HtmlExport.java | 3 +- .../graphs/{ => calendar}/PlayerCalendar.java | 2 +- .../html/graphs/calendar/ServerCalendar.java | 109 ++++++++++++++++++ .../web/js/charts/onlineActivityCalendar.js | 28 +++++ .../web/js/charts/sessionCalendar.js | 4 +- Plan/src/main/resources/web/player.html | 6 +- Plan/src/main/resources/web/server.html | 76 ++++++++---- 9 files changed, 207 insertions(+), 29 deletions(-) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => calendar}/PlayerCalendar.java (98%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java create mode 100644 Plan/src/main/resources/web/js/charts/onlineActivityCalendar.js diff --git a/Plan/src/main/java/com/djrapitops/plan/data/calculation/AnalysisData.java b/Plan/src/main/java/com/djrapitops/plan/data/calculation/AnalysisData.java index d5f2ed561..0c23517ef 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/calculation/AnalysisData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/calculation/AnalysisData.java @@ -23,6 +23,7 @@ import com.djrapitops.plan.utilities.html.Html; import com.djrapitops.plan.utilities.html.graphs.ActivityStackGraph; import com.djrapitops.plan.utilities.html.graphs.PunchCardGraph; import com.djrapitops.plan.utilities.html.graphs.WorldMap; +import com.djrapitops.plan.utilities.html.graphs.calendar.ServerCalendar; import com.djrapitops.plan.utilities.html.graphs.line.*; import com.djrapitops.plan.utilities.html.graphs.pie.ActivityPie; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; @@ -128,6 +129,11 @@ public class AnalysisData extends RawData { geolocationsTab(geoLocations); commandUsage(commandUsage); + List registered = profile.getPlayers().stream().map(PlayerProfile::getRegistered).collect(Collectors.toList()); + ServerCalendar serverCalendar = new ServerCalendar(registered, sessions); + addValue("calendarSeries", serverCalendar.toCalendarSeries()); + addValue("firstDay", 1); + addValue("ops", ops.size()); addValue("playersTotal", playersTotal); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java index 40f30f5fb..cc13f25e7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java @@ -25,8 +25,8 @@ import com.djrapitops.plan.utilities.comparators.SessionStartComparator; import com.djrapitops.plan.utilities.file.FileUtil; import com.djrapitops.plan.utilities.html.HtmlStructure; import com.djrapitops.plan.utilities.html.HtmlUtils; -import com.djrapitops.plan.utilities.html.graphs.PlayerCalendar; import com.djrapitops.plan.utilities.html.graphs.PunchCardGraph; +import com.djrapitops.plan.utilities.html.graphs.calendar.PlayerCalendar; import com.djrapitops.plan.utilities.html.graphs.pie.ServerPreferencePie; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; import com.djrapitops.plan.utilities.html.structure.ServerAccordion; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java b/Plan/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java index 51f0558f7..084c67e34 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java @@ -138,7 +138,8 @@ public class HtmlExport extends SpecificExport { "web/js/charts/serverPie.js", "web/js/charts/worldPie.js", "web/js/charts/healthGauge.js", - "web/js/charts/sessionCalendar.js" + "web/js/charts/sessionCalendar.js", + "web/js/charts/onlineActivityCalendar.js" }; copyFromJar(resources); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PlayerCalendar.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java similarity index 98% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PlayerCalendar.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java index 1579d107f..7e2222a38 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PlayerCalendar.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/PlayerCalendar.java @@ -2,7 +2,7 @@ * Licence is provided in the jar as license.yml also here: * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml */ -package com.djrapitops.plan.utilities.html.graphs; +package com.djrapitops.plan.utilities.html.graphs.calendar; import com.djrapitops.plan.data.container.PlayerKill; import com.djrapitops.plan.data.container.Session; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java new file mode 100644 index 000000000..c1ec725ca --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/calendar/ServerCalendar.java @@ -0,0 +1,109 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package com.djrapitops.plan.utilities.html.graphs.calendar; + +import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.utilities.FormatUtils; + +import java.util.*; + +/** + * Utility for creating FullCalendar calendar event array on Player page. + * + * @author Rsl1122 + */ +public class ServerCalendar { + + private final List registerDates; + private final Map> sessions; + + public ServerCalendar(List registerDates, Map> sessions) { + this.registerDates = registerDates; + this.sessions = sessions; + } + + public String toCalendarSeries() { + StringBuilder series = new StringBuilder("["); + + series.append("{title: 'badcode',start:0}"); + appendSessionRelatedData(series); + appendRegistered(series); + + return series.append("]").toString(); + } + + private void appendRegistered(StringBuilder series) { + Map registeredByDay = getRegisteredByDay(); + + for (Map.Entry entry : registeredByDay.entrySet()) { + String day = entry.getKey(); + Integer newPlayers = entry.getValue(); + + series.append(",{title: 'New: ").append(newPlayers) + .append("',start:'").append(day) + .append("',color: '#8BC34A'") + .append("}"); + } + + } + + private void appendSessionRelatedData(StringBuilder series) { + Map>> sessionsByDay = getSessionsByDay(); + + for (Map.Entry>> entry : sessionsByDay.entrySet()) { + String day = entry.getKey(); + + Map> sessionsPerUsers = entry.getValue(); + long sessionCount = sessionsPerUsers.values().stream().mapToLong(Collection::size).sum(); + long playtime = sessionsPerUsers.values().stream().flatMap(Collection::stream).mapToLong(Session::getLength).sum(); + long uniquePlayers = sessionsPerUsers.size(); + + series.append(",{title: 'Playtime: ").append(FormatUtils.formatTimeAmount(playtime)) + .append("',start:'").append(day) + .append("',color: '#4CAF50'") + .append("}"); + + series.append(",{title: 'Sessions: ").append(sessionCount) + .append("',start:'").append(day) + .append("',color: '#009688'") + .append("}"); + + series.append(",{title: 'Unique: ").append(uniquePlayers) + .append("',start:'").append(day) + .append("'}"); + } + } + + private Map>> getSessionsByDay() { + Map>> sessionsByDay = new HashMap<>(); + for (Map.Entry> entry : sessions.entrySet()) { + UUID player = entry.getKey(); + List sessions = entry.getValue(); + + for (Session session : sessions) { + String day = FormatUtils.formatTimeStampISO8601NoClock(session.getSessionStart()); + + Map> sessionsPerUserOfDay = sessionsByDay.getOrDefault(day, new HashMap<>()); + List sessionsOfUser = sessionsPerUserOfDay.getOrDefault(player, new ArrayList<>()); + sessionsOfUser.add(session); + sessionsPerUserOfDay.put(player, sessionsOfUser); + sessionsByDay.put(day, sessionsPerUserOfDay); + } + } + return sessionsByDay; + } + + private Map getRegisteredByDay() { + Map RegisteredByDay = new HashMap<>(); + for (Long registered : registerDates) { + String day = FormatUtils.formatTimeStampISO8601NoClock(registered); + + int registeredPerDay = RegisteredByDay.getOrDefault(day, 0); + registeredPerDay += 1; + RegisteredByDay.put(day, registeredPerDay); + } + return RegisteredByDay; + } +} \ No newline at end of file diff --git a/Plan/src/main/resources/web/js/charts/onlineActivityCalendar.js b/Plan/src/main/resources/web/js/charts/onlineActivityCalendar.js new file mode 100644 index 000000000..4d3c64074 --- /dev/null +++ b/Plan/src/main/resources/web/js/charts/onlineActivityCalendar.js @@ -0,0 +1,28 @@ +function onlineActivityCalendar(id, events, firstDay) { + $(id).fullCalendar({ + eventColor: '#2196F3', + firstDay: firstDay, + + eventRender: function (eventObj, $el) { + $el.popover({ + content: eventObj.title, + trigger: 'hover', + placement: 'top', + container: 'body' + }); + }, + + events: events, + + height: 'parent', + header: { + left: 'title', + center: '', + right: 'month prev,next' + } + }); + + setTimeout(function () { + $(id).fullCalendar('render') + }, 1000); +} \ No newline at end of file diff --git a/Plan/src/main/resources/web/js/charts/sessionCalendar.js b/Plan/src/main/resources/web/js/charts/sessionCalendar.js index cfb954cb8..d12c02d97 100644 --- a/Plan/src/main/resources/web/js/charts/sessionCalendar.js +++ b/Plan/src/main/resources/web/js/charts/sessionCalendar.js @@ -1,7 +1,7 @@ function sessionCalendar(id, events, firstDay) { $(id).fullCalendar({ eventColor: '#009688', - eventLimit: true, + eventLimit: 4, firstDay: firstDay, eventRender: function (eventObj, $el) { @@ -20,7 +20,7 @@ function sessionCalendar(id, events, firstDay) { header: { left: 'title', center: '', - right: 'month agendaWeek agendaDay prev,next' + right: 'month agendaWeek agendaDay today prev,next' } }); diff --git a/Plan/src/main/resources/web/player.html b/Plan/src/main/resources/web/player.html index 74a1aa668..417b3a342 100644 --- a/Plan/src/main/resources/web/player.html +++ b/Plan/src/main/resources/web/player.html @@ -708,10 +708,8 @@ color: '#222', data: ${punchCardSeries} }; - var calendarSeries =; - ${calendarSeries} - var firstDay = - ${firstDay} + var calendarSeries = ${calendarSeries}; + var firstDay = ${firstDay}; diff --git a/Plan/src/main/resources/web/server.html b/Plan/src/main/resources/web/server.html index 2c24ddb1b..0e45604bc 100644 --- a/Plan/src/main/resources/web/server.html +++ b/Plan/src/main/resources/web/server.html @@ -454,12 +454,10 @@
-
+
+
-
-

Online Activity

-
- + + +
+
+
+
+
+
-
-
-
-
+
+
-
-

Punchcard

-
- + + +
+
+
+
+
+
-
-
-
@@ -1086,6 +1113,11 @@ + + + + + @@ -1098,6 +1130,7 @@ +