From 0e4c0b4d88d07f327dc1d118f971b5347c3ea0ce Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 29 Nov 2017 20:57:24 +0200 Subject: [PATCH] Rewrote Activity Pie & Wrote Activity Stack Graph - moved some graphcreators to better packages --- .../djrapitops/plan/data/AnalysisData.java | 16 +++- .../info/parsing/InspectPageParser.java | 4 +- .../info/parsing/NetworkPageParser.java | 2 +- .../comparators/PieSliceComparator.java | 20 +++++ .../plan/utilities/html/HtmlStructure.java | 2 +- .../graphs/ActivityStackGraphCreator.java | 73 +++++++++++++++++++ .../graphs/{ => line}/CPUGraphCreator.java | 2 +- .../PlayerActivityGraphCreator.java | 2 +- .../graphs/{ => line}/RamGraphCreator.java | 2 +- .../html/graphs/{ => line}/SeriesCreator.java | 2 +- .../ServerPreferencePieCreator.java | 2 +- .../graphs/{ => line}/TPSGraphCreator.java | 2 +- .../{ => line}/WorldLoadGraphCreator.java | 2 +- .../html/graphs/pie/ActivityPieCreator.java | 42 +++++++++++ .../html/graphs/pie/PieSeriesCreator.java | 34 +++++++++ .../utilities/html/graphs/pie/PieSlice.java | 37 ++++++++++ .../graphs/{ => pie}/WorldPieCreator.java | 54 +------------- .../structure/ServerAccordionCreator.java | 2 +- .../structure/SessionTabStructureCreator.java | 2 +- .../html/tables/SessionsTableCreator.java | 2 +- Plan/src/main/resources/config.yml | 2 +- .../resources/web/js/charts/activityPie.js | 3 +- .../web/js/charts/activityStackGraph.js | 44 +++++++++++ Plan/src/main/resources/web/server.html | 25 ++----- .../djrapitops/plan/ui/graphs/GraphTest.java | 3 +- 25 files changed, 293 insertions(+), 88 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/comparators/PieSliceComparator.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraphCreator.java rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/CPUGraphCreator.java (91%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/PlayerActivityGraphCreator.java (91%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/RamGraphCreator.java (94%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/SeriesCreator.java (96%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/ServerPreferencePieCreator.java (94%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/TPSGraphCreator.java (93%) rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => line}/WorldLoadGraphCreator.java (96%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPieCreator.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSeriesCreator.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSlice.java rename Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/{ => pie}/WorldPieCreator.java (82%) create mode 100644 Plan/src/main/resources/web/js/charts/activityStackGraph.js diff --git a/Plan/src/main/java/com/djrapitops/plan/data/AnalysisData.java b/Plan/src/main/java/com/djrapitops/plan/data/AnalysisData.java index 96734f070..23dd520fc 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/AnalysisData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/AnalysisData.java @@ -15,7 +15,12 @@ import main.java.com.djrapitops.plan.utilities.analysis.MathUtils; import main.java.com.djrapitops.plan.utilities.comparators.SessionStartComparator; import main.java.com.djrapitops.plan.utilities.html.Html; import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; -import main.java.com.djrapitops.plan.utilities.html.graphs.*; +import main.java.com.djrapitops.plan.utilities.html.graphs.ActivityStackGraphCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.PunchCardGraphCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.WorldMapCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.line.*; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.ActivityPieCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.WorldPieCreator; import main.java.com.djrapitops.plan.utilities.html.structure.AnalysisPluginsTabContentCreator; import main.java.com.djrapitops.plan.utilities.html.structure.SessionTabStructureCreator; import main.java.com.djrapitops.plan.utilities.html.tables.CommandUseTableCreator; @@ -135,7 +140,7 @@ public class AnalysisData extends RawData { if (!players.isEmpty()) { for (PlayerProfile player : players) { - for (long date = now; date >= now - TimeAmount.MONTH.ms() * 2L; date -= TimeAmount.WEEK.ms() * 2L) { + for (long date = now; date >= now - TimeAmount.MONTH.ms() * 2L; date -= TimeAmount.WEEK.ms()) { double activityIndex = player.getActivityIndex(date); String index = FormatUtils.readableActivityIndex(activityIndex)[1]; @@ -151,6 +156,13 @@ public class AnalysisData extends RawData { Map> activityNow = activityData.getOrDefault(now, new HashMap<>()); Map> activityFourWAgo = activityData.getOrDefault(fourWeeksAgo, new HashMap<>()); + String[] activityStackSeries = ActivityStackGraphCreator.createSeries(activityData); + String activityPieSeries = ActivityPieCreator.createSeriesData(activityNow); + + addValue("activityStackCategories", activityStackSeries[0]); + addValue("activityStackSeries", activityStackSeries[1]); + addValue("activityPieSeries", activityPieSeries); + Set veryActiveNow = activityNow.getOrDefault("Very Active", new HashSet<>()); Set activeNow = activityNow.getOrDefault("Active", new HashSet<>()); Set regularNow = activityNow.getOrDefault("Regular", new HashSet<>()); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java index 101e3d5d2..5fb1323e6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java @@ -25,8 +25,8 @@ import main.java.com.djrapitops.plan.utilities.file.FileUtil; import main.java.com.djrapitops.plan.utilities.html.HtmlStructure; import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import main.java.com.djrapitops.plan.utilities.html.graphs.PunchCardGraphCreator; -import main.java.com.djrapitops.plan.utilities.html.graphs.ServerPreferencePieCreator; -import main.java.com.djrapitops.plan.utilities.html.graphs.WorldPieCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.line.ServerPreferencePieCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.WorldPieCreator; import main.java.com.djrapitops.plan.utilities.html.structure.ServerAccordionCreator; import main.java.com.djrapitops.plan.utilities.html.tables.ActionsTableCreator; import main.java.com.djrapitops.plan.utilities.html.tables.IpTableCreator; diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java index d54738bb5..f657ef837 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java @@ -19,7 +19,7 @@ import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.file.FileUtil; import main.java.com.djrapitops.plan.utilities.html.HtmlStructure; import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; -import main.java.com.djrapitops.plan.utilities.html.graphs.PlayerActivityGraphCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.line.PlayerActivityGraphCreator; import java.sql.SQLException; import java.util.List; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/PieSliceComparator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/PieSliceComparator.java new file mode 100644 index 000000000..6a8bac4eb --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/PieSliceComparator.java @@ -0,0 +1,20 @@ +/* + * 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 main.java.com.djrapitops.plan.utilities.comparators; + +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.PieSlice; + +import java.util.Comparator; + +/** + * Compares PieSlices to descending Percentage order. + */ +public class PieSliceComparator implements Comparator { + + @Override + public int compare(PieSlice o1, PieSlice o2) { + return -Long.compare(o1.getY(), o2.getY()); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java index b320c9323..d223aaab2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java @@ -13,7 +13,7 @@ import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.systems.info.BukkitInformationManager; import main.java.com.djrapitops.plan.utilities.FormatUtils; -import main.java.com.djrapitops.plan.utilities.html.graphs.PlayerActivityGraphCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.line.PlayerActivityGraphCreator; import main.java.com.djrapitops.plan.utilities.html.structure.SessionTabStructureCreator; import main.java.com.djrapitops.plan.utilities.html.tables.SessionsTableCreator; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraphCreator.java new file mode 100644 index 000000000..82ecfe02d --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ActivityStackGraphCreator.java @@ -0,0 +1,73 @@ +/* + * 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 main.java.com.djrapitops.plan.utilities.html.graphs; + +import main.java.com.djrapitops.plan.Settings; +import main.java.com.djrapitops.plan.utilities.FormatUtils; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.ActivityPieCreator; + +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.UUID; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class ActivityStackGraphCreator { + + private ActivityStackGraphCreator() { + throw new IllegalStateException("Utility Class"); + } + + public static String[] createSeries(TreeMap>> activityData) { + String[] sliceNames = ActivityPieCreator.getSliceNames(); + String[] colors = Settings.THEME_GRAPH_ACTIVITY_PIE.toString().split(", "); + int maxCol = colors.length; + + StringBuilder[] series = new StringBuilder[sliceNames.length + 1]; + for (int i = 0; i <= sliceNames.length; i++) { + series[i] = new StringBuilder(); + } + for (int i = 1; i <= sliceNames.length; i++) { + series[i] = new StringBuilder("{name: '") + .append(sliceNames[i - 1]) + .append("',color:").append(colors[(i - 1) % maxCol]) + .append(",data: ["); + } + + int size = activityData.size(); + int i = 0; + for (Long date : activityData.navigableKeySet()) { + Map> data = activityData.get(date); + + series[0].append("'").append(FormatUtils.formatTimeStamp(date)).append("'"); + for (int j = 1; j <= sliceNames.length; j++) { + Set players = data.get(sliceNames[j - 1]); + series[j].append(players != null ? players.size() : 0); + } + + if (i < size - 1) { + for (int j = 0; j <= sliceNames.length; j++) { + series[j].append(","); + } + } + i++; + } + + StringBuilder seriesBuilder = new StringBuilder("["); + + for (int j = 1; j <= sliceNames.length; j++) { + seriesBuilder.append(series[j].append("]}").toString()); + if (j < sliceNames.length) { + seriesBuilder.append(","); + } + } + + return new String[]{series[0].toString(), seriesBuilder.append("]").toString()}; + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/CPUGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraphCreator.java similarity index 91% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/CPUGraphCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraphCreator.java index b6191232c..d863b3a98 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/CPUGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/CPUGraphCreator.java @@ -1,4 +1,4 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.utilities.analysis.Point; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PlayerActivityGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayerActivityGraphCreator.java similarity index 91% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PlayerActivityGraphCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayerActivityGraphCreator.java index 3d62cbb61..7e29400aa 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/PlayerActivityGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/PlayerActivityGraphCreator.java @@ -1,4 +1,4 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.utilities.analysis.Point; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/RamGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraphCreator.java similarity index 94% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/RamGraphCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraphCreator.java index 5f6c894c7..99b9dad40 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/RamGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/RamGraphCreator.java @@ -1,4 +1,4 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.systems.tasks.TPSCountTimer; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/SeriesCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/SeriesCreator.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/SeriesCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/SeriesCreator.java index 542011e8b..8bc55b0f5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/SeriesCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/SeriesCreator.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.utilities.analysis.Point; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ServerPreferencePieCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ServerPreferencePieCreator.java similarity index 94% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ServerPreferencePieCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ServerPreferencePieCreator.java index b74b0e752..6caae56c6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/ServerPreferencePieCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/ServerPreferencePieCreator.java @@ -1,4 +1,4 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.data.time.WorldTimes; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/TPSGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraphCreator.java similarity index 93% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/TPSGraphCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraphCreator.java index da3a11ea2..56a719c31 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/TPSGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/TPSGraphCreator.java @@ -1,4 +1,4 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.utilities.analysis.Point; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldLoadGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/WorldLoadGraphCreator.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldLoadGraphCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/WorldLoadGraphCreator.java index 5baca537a..b8dbd3800 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldLoadGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/line/WorldLoadGraphCreator.java @@ -1,4 +1,4 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.line; import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.systems.tasks.TPSCountTimer; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPieCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPieCreator.java new file mode 100644 index 000000000..eff00efec --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/ActivityPieCreator.java @@ -0,0 +1,42 @@ +/* + * 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 main.java.com.djrapitops.plan.utilities.html.graphs.pie; + +import main.java.com.djrapitops.plan.Settings; + +import java.util.*; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class ActivityPieCreator { + + private ActivityPieCreator() { + throw new IllegalStateException("Utility Class"); + } + + public static String[] getSliceNames() { + return new String[]{"Very Active", "Active", "Regular", "Irregular", "Inactive"}; + } + + public static String createSeriesData(Map> activityData) { + String[] colors = Settings.THEME_GRAPH_ACTIVITY_PIE.toString().split(", "); + int maxCol = colors.length; + + List slices = new ArrayList<>(); + int i = 0; + for (String slice : getSliceNames()) { + Set players = activityData.getOrDefault(slice, new HashSet<>()); + int num = players.size(); + + slices.add(new PieSlice(slice, num, colors[i % maxCol], false)); + i++; + } + + return PieSeriesCreator.createSeriesData(slices); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSeriesCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSeriesCreator.java new file mode 100644 index 000000000..22f33f23f --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSeriesCreator.java @@ -0,0 +1,34 @@ +/* + * 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 main.java.com.djrapitops.plan.utilities.html.graphs.pie; + +import java.util.List; + +/** + * PieSeries data creation utility class. + * + * @author Rsl1122 + */ +public class PieSeriesCreator { + private PieSeriesCreator() { + throw new IllegalStateException("Utility Class"); + } + + public static String createSeriesData(List slices) { + StringBuilder seriesBuilder = new StringBuilder("["); + int i = 0; + int size = slices.size(); + for (PieSlice slice : slices) { + seriesBuilder.append(slice.toString()); + if (i < size - 1) { + seriesBuilder.append(","); + } + i++; + } + seriesBuilder.append("]"); + + return seriesBuilder.toString(); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSlice.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSlice.java new file mode 100644 index 000000000..ad358cc69 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/PieSlice.java @@ -0,0 +1,37 @@ +/* + * 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 main.java.com.djrapitops.plan.utilities.html.graphs.pie; + +/** + * Represents a slice of a pie. + * + * @author Rsl1122 + */ +public class PieSlice { + private final String name; + private final long y; + private final String color; + private final boolean drilldown; + + public PieSlice(String name, long y, String color, boolean drilldown) { + this.name = name; + this.y = y; + this.color = color; + this.drilldown = drilldown; + } + + @Override + public String toString() { + return "{name:'" + name + "'," + + "y:" + y + "," + + "color:" + color + + (drilldown ? "," + "drilldown: '" + name + "'" : "") + + "}"; + } + + public long getY() { + return y; + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPieCreator.java similarity index 82% rename from Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPieCreator.java index 8ff57c52b..ab3b0c31c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/pie/WorldPieCreator.java @@ -1,10 +1,11 @@ -package main.java.com.djrapitops.plan.utilities.html.graphs; +package main.java.com.djrapitops.plan.utilities.html.graphs.pie; import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.WorldAliasSettings; import main.java.com.djrapitops.plan.data.time.GMTimes; import main.java.com.djrapitops.plan.data.time.WorldTimes; +import main.java.com.djrapitops.plan.utilities.comparators.PieSliceComparator; import java.util.*; import java.util.stream.Collectors; @@ -28,7 +29,7 @@ public class WorldPieCreator { slices.sort(new PieSliceComparator()); } - String seriesData = buildSeries(slices); + String seriesData = PieSeriesCreator.createSeriesData(slices); String drilldownData = createDrilldownData(worldTimes); @@ -53,29 +54,13 @@ public class WorldPieCreator { for (String alias : worlds) { Long value = playtimePerAlias.getOrDefault(alias, 0L); if (value != 0L) { - slices.add(new PieSlice(alias, value, colors[i % colLenght])); + slices.add(new PieSlice(alias, value, colors[i % colLenght], true)); } i++; } return slices; } - private static String buildSeries(List slices) { - StringBuilder seriesBuilder = new StringBuilder("["); - int i = 0; - int size = slices.size(); - for (PieSlice slice : slices) { - seriesBuilder.append(slice.toString()); - if (i < size - 1) { - seriesBuilder.append(","); - } - i++; - } - seriesBuilder.append("]"); - - return seriesBuilder.toString(); - } - private static Map transformToAliases(Map playtimePerWorld) { WorldAliasSettings aliasSettings = new WorldAliasSettings(Plan.getInstance()); Map aliases = aliasSettings.getAliases(); @@ -181,34 +166,3 @@ public class WorldPieCreator { drilldownBuilder.append("]}"); } } - -class PieSlice { - private final String name; - final long y; - private final String color; - - public PieSlice(String name, long y, String color) { - this.name = name; - this.y = y; - this.color = color; - } - - @Override - public String toString() { - return "{name:'" + name + "'," + - "y:" + y + "," + - "color:" + color + "," + - "drilldown: '" + name + "'}"; - } -} - -/** - * Compares PieSlices to descending Percentage order. - */ -class PieSliceComparator implements Comparator { - - @Override - public int compare(PieSlice o1, PieSlice o2) { - return -Long.compare(o1.y, o2.y); - } -} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordionCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordionCreator.java index 9ae7b7838..db4e1360f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordionCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordionCreator.java @@ -10,7 +10,7 @@ import main.java.com.djrapitops.plan.data.time.WorldTimes; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.analysis.MathUtils; -import main.java.com.djrapitops.plan.utilities.html.graphs.WorldPieCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.WorldPieCreator; import java.util.List; import java.util.Map; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionTabStructureCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionTabStructureCreator.java index 7a5e06f88..a6d87aecf 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionTabStructureCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionTabStructureCreator.java @@ -13,7 +13,7 @@ import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.html.Html; import main.java.com.djrapitops.plan.utilities.html.HtmlStructure; -import main.java.com.djrapitops.plan.utilities.html.graphs.WorldPieCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.WorldPieCreator; import main.java.com.djrapitops.plan.utilities.html.tables.KillsTableCreator; import main.java.com.djrapitops.plan.utilities.html.tables.SessionsTableCreator; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java index c3729cbf6..19ee0088b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java @@ -14,7 +14,7 @@ import main.java.com.djrapitops.plan.systems.cache.SessionCache; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.comparators.SessionStartComparator; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.graphs.WorldPieCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.pie.WorldPieCreator; import java.util.*; import java.util.stream.Collectors; diff --git a/Plan/src/main/resources/config.yml b/Plan/src/main/resources/config.yml index 5cd66e7f0..0b7a7ad06 100644 --- a/Plan/src/main/resources/config.yml +++ b/Plan/src/main/resources/config.yml @@ -130,7 +130,7 @@ Theme: Entities: Base WorldPie: '"#0099C6", "#66AA00", "#316395", "#994499", "#22AA99", "#AAAA11", "#6633CC", "#E67300", "#329262", "#5574A6"' GMDrilldown: '"#438c99", "#639A67", "#D8EBB5", "#D9BF77"' - ActivityPie: '"#228B22", "#A9A9A9", "#808080", "#951800"' + ActivityPie: '"#4CAF50", "#8BC34A", "#CDDC39", "#FFC107", "#607D8B"' ServerPreferencePie: '"#0099C6", "#66AA00", "#316395", "#994499", "#22AA99", "#AAAA11", "#6633CC", "#E67300", "#329262", "#5574A6"' # ----------------------------------------------------- Plugins: diff --git a/Plan/src/main/resources/web/js/charts/activityPie.js b/Plan/src/main/resources/web/js/charts/activityPie.js index afe280c7d..42f1682fc 100644 --- a/Plan/src/main/resources/web/js/charts/activityPie.js +++ b/Plan/src/main/resources/web/js/charts/activityPie.js @@ -1,4 +1,4 @@ -function activityPie(id, activitySeries, activityTotal, activityColors) { +function activityPie(id, activitySeries) { Highcharts.chart(id, { chart: { plotBackgroundColor: null, @@ -17,7 +17,6 @@ function activityPie(id, activitySeries, activityTotal, activityColors) { dataLabels: { enabled: false }, -// colors: activityColors, showInLegend: true } }, diff --git a/Plan/src/main/resources/web/js/charts/activityStackGraph.js b/Plan/src/main/resources/web/js/charts/activityStackGraph.js new file mode 100644 index 000000000..c04b8bdce --- /dev/null +++ b/Plan/src/main/resources/web/js/charts/activityStackGraph.js @@ -0,0 +1,44 @@ +function activityStackChart(id, categories, activitySeries) { + Highcharts.chart(id, { + chart: { + type: 'area' + }, + title: { + text: '' + }, + xAxis: { + categories: categories, + tickmarkPlacement: 'on', + title: { + enabled: false + } + }, + yAxis: { + title: { + text: 'Players' + }, + labels: { + formatter: function () { + return this.value; + } + } + }, + tooltip: { + split: true, + valueSuffix: ' Players' + }, + plotOptions: { + area: { + stacking: 'normal', + // lineColor: '#666666', + lineWidth: 1 + // , + // marker: { + // lineWidth: 1, + // lineColor: '#666666' + // } + } + }, + series: activitySeries + }); +} \ No newline at end of file diff --git a/Plan/src/main/resources/web/server.html b/Plan/src/main/resources/web/server.html index 13ab2fef8..a856b8ea4 100644 --- a/Plan/src/main/resources/web/server.html +++ b/Plan/src/main/resources/web/server.html @@ -603,7 +603,7 @@
-
+
@@ -943,6 +943,7 @@ + @@ -1026,22 +1027,7 @@ var activitySeries = { name: 'Players', colorByPoint: true, - colors: [${activityPieColors}], - data: [{ - name: 'Active', - y: ${active} - }, { - name: 'Inactive', - y: ${inactive}, - sliced: true, - selected: true - }, { - name: 'Single Join', - y: ${joinLeaver} - }, { - name: 'Banned', - y: ${banned} - }] + data: ${activityPieSeries} }; var worldSeries = { name: 'World Playtime', @@ -1062,6 +1048,8 @@ color: '#222', data: ${punchCardSeries} }; + var activityStackSeries = ${activityStackSeries}; + var activityCategories = [${activityStackCategories}] @@ -1089,7 +1077,8 @@ openFunc(slideIndex)(); // Chart draw scripts - activityPie('activityPie', activitySeries, ${playersTotal}, [${activityPieColors}]); + activityPie('activityPie', activitySeries); + activityStackChart('activityStackGraph', activityCategories, activityStackSeries); worldPie('worldPie', worldSeries, gmSeries); playersChart('playerChartDay', playersOnlineSeries, 3); playersChart('playerChartMonth', playersOnlineSeries, 2); diff --git a/Plan/test/main/java/com/djrapitops/plan/ui/graphs/GraphTest.java b/Plan/test/main/java/com/djrapitops/plan/ui/graphs/GraphTest.java index 66f26e9b4..bb3e134fb 100644 --- a/Plan/test/main/java/com/djrapitops/plan/ui/graphs/GraphTest.java +++ b/Plan/test/main/java/com/djrapitops/plan/ui/graphs/GraphTest.java @@ -8,7 +8,8 @@ import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.time.WorldTimes; import main.java.com.djrapitops.plan.utilities.analysis.Point; -import main.java.com.djrapitops.plan.utilities.html.graphs.*; +import main.java.com.djrapitops.plan.utilities.html.graphs.PunchCardGraphCreator; +import main.java.com.djrapitops.plan.utilities.html.graphs.line.*; import org.apache.commons.lang3.StringUtils; import org.bukkit.plugin.java.JavaPlugin; import org.junit.Assert;