diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayerJSONParser.java b/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayerJSONParser.java index 4a5f8a2a8..0aa82c848 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayerJSONParser.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayerJSONParser.java @@ -34,6 +34,7 @@ import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; +import com.djrapitops.plan.utilities.html.structure.ServerAccordion; import javax.inject.Inject; import javax.inject.Singleton; @@ -84,6 +85,7 @@ public class PlayerJSONParser { PlayerContainer player = db.query(new PlayerContainerQuery(playerUUID)); SessionsMutator sessionsMutator = SessionsMutator.forContainer(player); Map worldTimesPerServer = PerServerMutator.forContainer(player).worldTimesPerServer(); + List> serverAccordion = new ServerAccordion(player, serverNames, graphs, year, timeAmount).asMaps(); Map data = new HashMap<>(); data.put("info", createInfoJSONMap(player, serverNames)); @@ -99,6 +101,7 @@ public class PlayerJSONParser { data.put("player_kills", player.getValue(PlayerKeys.PLAYER_KILLS).orElse(Collections.emptyList())); data.put("player_deaths", player.getValue(PlayerKeys.PLAYER_DEATHS_KILLS).orElse(Collections.emptyList())); data.put("sessions", sessionsMutator.toServerNameJSONMaps(graphs, config.getWorldAliasSettings(), formatters)); + data.put("servers", serverAccordion); data.put("punchcard_series", graphs.special().punchCard(sessionsMutator).getDots()); WorldPie worldPie = graphs.pie().worldPie(player.getValue(PlayerKeys.WORLD_TIMES).orElse(new WorldTimes())); data.put("world_pie_series", worldPie.getSlices()); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java index 2f052c905..7766e274a 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/structure/ServerAccordion.java @@ -23,141 +23,76 @@ import com.djrapitops.plan.data.store.keys.PerServerKeys; import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.mutators.SessionsMutator; import com.djrapitops.plan.data.time.WorldTimes; -import com.djrapitops.plan.system.settings.theme.Theme; -import com.djrapitops.plan.system.settings.theme.ThemeVal; import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie; -import com.djrapitops.plan.utilities.html.icon.Color; -import com.djrapitops.plan.utilities.html.icon.Icon; -import com.djrapitops.plan.utilities.html.icon.Icons; -import com.djrapitops.plugin.utilities.Format; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; /** * HTML utility class for creating a Server Accordion. * * @author Rsl1122 */ -public class ServerAccordion extends Accordion { - - private final StringBuilder viewScript; +public class ServerAccordion { private final Map serverNames; - private PerServerContainer perServer; + private final PerServerContainer perServer; - private final Theme theme; private final Graphs graphs; - private final Formatter yearLongFormatter; - private final Formatter timeAmountFormatter; + private final Formatter year; + private final Formatter timeAmount; public ServerAccordion( PlayerContainer container, Map serverNames, - Theme theme, Graphs graphs, - Formatter yearLongFormatter, - Formatter timeAmountFormatter + Formatter year, + Formatter timeAmount ) { - super("server_accordion"); - this.theme = theme; this.graphs = graphs; - this.yearLongFormatter = yearLongFormatter; - this.timeAmountFormatter = timeAmountFormatter; - - viewScript = new StringBuilder(); + this.year = year; + this.timeAmount = timeAmount; this.serverNames = serverNames; - Optional perServerData = container.getValue(PlayerKeys.PER_SERVER); - if (perServerData.isPresent()) { - perServer = perServerData.get(); - } else { - return; - } - - addElements(); + perServer = container.getValue(PlayerKeys.PER_SERVER) + .orElse(new PerServerContainer()); } - public String toViewScript() { - return viewScript.toString(); - } - - private void addElements() { - int i = 0; + public List> asMaps() { + List> servers = new ArrayList<>(); for (Map.Entry entry : perServer.entrySet()) { UUID serverUUID = entry.getKey(); - DataContainer container = entry.getValue(); + DataContainer perServer = entry.getValue(); + Map server = new HashMap<>(); + String serverName = serverNames.getOrDefault(serverUUID, "Unknown"); - WorldTimes worldTimes = container.getValue(PerServerKeys.WORLD_TIMES).orElse(new WorldTimes()); - SessionsMutator sessionsMutator = SessionsMutator.forContainer(container); + WorldTimes worldTimes = perServer.getValue(PerServerKeys.WORLD_TIMES).orElse(new WorldTimes()); + SessionsMutator sessionsMutator = SessionsMutator.forContainer(perServer); - boolean banned = container.getValue(PerServerKeys.BANNED).orElse(false); - boolean operator = container.getValue(PerServerKeys.OPERATOR).orElse(false); - long registered = container.getValue(PerServerKeys.REGISTERED).orElse(0L); + server.put("server_name", serverName); - long playtime = sessionsMutator.toPlaytime(); - long afkTime = sessionsMutator.toAfkTime(); - int sessionCount = sessionsMutator.count(); - long sessionMedian = sessionsMutator.toMedianSessionLength(); - long longestSession = sessionsMutator.toLongestSessionLength(); + server.put("banned", perServer.getValue(PerServerKeys.BANNED).orElse(false)); + server.put("operator", perServer.getValue(PerServerKeys.OPERATOR).orElse(false)); + server.put("registered", year.apply(perServer.getValue(PerServerKeys.REGISTERED).orElse(0L))); + server.put("last_seen", year.apply(sessionsMutator.toLastSeen())); - long mobKills = sessionsMutator.toMobKillCount(); - long playerKills = sessionsMutator.toPlayerKillCount(); - long deaths = sessionsMutator.toDeathCount(); + server.put("session_count", sessionsMutator.count()); + server.put("playtime", timeAmount.apply(sessionsMutator.toPlaytime())); + server.put("afk_time", timeAmount.apply(sessionsMutator.toAfkTime())); + server.put("session_median", timeAmount.apply(sessionsMutator.toMedianSessionLength())); + server.put("longest_session_length", timeAmount.apply(sessionsMutator.toLongestSessionLength())); - String play = timeAmountFormatter.apply(playtime); - String afk = timeAmountFormatter.apply(afkTime); - String median = timeAmountFormatter.apply(sessionMedian); - String longest = timeAmountFormatter.apply(longestSession); - - String sanitizedServerName = new Format(serverName) - .removeSymbols() - .removeWhitespace().toString() + i; - String htmlID = "server_" + sanitizedServerName; - - String worldId = "worldPieServer" + sanitizedServerName; + server.put("mob_kills", sessionsMutator.toMobKillCount()); + server.put("player_kills", sessionsMutator.toPlayerKillCount()); + server.put("deaths", sessionsMutator.toDeathCount()); WorldPie worldPie = graphs.pie().worldPie(worldTimes); + server.put("world_pie_series", worldPie.getSlices()); + server.put("gm_series", worldPie.toHighChartsDrillDownMaps()); - String title = serverName + "" + play + ""; - - String leftSide = new AccordionElementContentBuilder() - .addRowBold(Icons.OPERATOR, "Operator", operator ? "Yes" : "No") - .addRowBold(Icons.BANNED, "Banned", banned ? "Yes" : "No") - .addRowBold(Icon.called("user-plus").of(Color.LIGHT_GREEN), "Registered", yearLongFormatter.apply(registered)) - .addBreak() - .addRowBold(Icons.SESSION_COUNT, "Sessions", sessionCount) - .addRowBold(Icons.PLAYTIME, "Server Playtime", play) - .addRowBold(Icons.AFK_LENGTH, "Time AFK", afk) - .addRowBold(Icons.SESSION_LENGTH, "Longest Session", longest) - .addRowBold(Icons.SESSION_LENGTH, "Session Median", median) - .addBreak() - .addRowBold(Icons.PLAYER_KILLS, "Player Kills", playerKills) - .addRowBold(Icons.MOB_KILLS, "Mob Kills", mobKills) - .addRowBold(Icons.DEATHS, "Deaths", deaths) - .toHtml(); - - String rightSide = "
" + - ""; - - addElement(new AccordionElement(htmlID, title) - .setColor(theme.getValue(ThemeVal.PARSED_SERVER_ACCORDION)) - .setLeftSide(leftSide) - .setRightSide(rightSide)); - - viewScript.append("worldPie(") - .append(worldId).append(", ") - .append(worldId).append("series, ") - .append(worldId).append("gmseries") - .append(");"); - - i++; + servers.add(server); } + return servers; } } diff --git a/Plan/common/src/main/resources/assets/plan/web/js/player-values.js b/Plan/common/src/main/resources/assets/plan/web/js/player-values.js index 816541560..0a2546883 100644 --- a/Plan/common/src/main/resources/assets/plan/web/js/player-values.js +++ b/Plan/common/src/main/resources/assets/plan/web/js/player-values.js @@ -142,4 +142,68 @@ function createConnectionsTableBody(connections) { table += ''; return table; +} + +function loadServerAccordion(json, error) { + if (error) { + $('#server-overview').addClass('forbidden'); // TODO Figure out 403 + return; + } + + serverTable = $("#server-overview").find("#tableServerAccordion").find("tbody"); + + var servers = json.servers; + + if (!servers.length) { + serverTable.append('No Sessions---') + } + + for (var i = 0; i < servers.length; i++) { + var server = servers[i]; + var title = createServerAccordionTitle(i, server); + var body = createServerAccordionBody(i, server); + + var worldSeries = {name: 'World Playtime', colorByPoint: true, data: server.world_pie_series}; + var gmSeries = server.gm_series; + + serverTable.append(title); + serverTable.append(body); + + worldPie("worldpie_server_" + i, worldSeries, gmSeries); + } +} + +function createServerAccordionTitle(i, server) { + return '' + + server.server_name + + (server.operator ? ' ' : '') + + (server.banned ? ' ' : '') + + '' + + '' + server.playtime + '' + + '' + server.registered + '' + + '' + server.last_seen + '' +} + +function createServerAccordionBody(i, server) { + + return '' + + '' + + '
' + + '
' + + (server.operator ? '

Operator

' : '') + + (server.banned ? '

Banned

' : '') + + (server.operator || server.banned ? '
' : '') + + '

Sessions' + server.session_count + '

' + + '

Playtime' + server.playtime + '

' + + '

Time AFK' + server.afk_time + '

' + + '

Longest Session' + server.longest_session_length + '

' + + '

Session Median' + server.session_median + '

' + + '
' + + '

Player Kills' + server.player_kills + '

' + + '

Mob Kills' + server.mob_kills + '

' + + '

Deaths' + server.deaths + '

' + + '
' + + '
' + + '
' + + '
' } \ No newline at end of file diff --git a/Plan/common/src/main/resources/assets/plan/web/js/sessionAccordion.js b/Plan/common/src/main/resources/assets/plan/web/js/sessionAccordion.js index 77de2b749..29cc961e7 100644 --- a/Plan/common/src/main/resources/assets/plan/web/js/sessionAccordion.js +++ b/Plan/common/src/main/resources/assets/plan/web/js/sessionAccordion.js @@ -60,7 +60,7 @@ function createAccordionBody(i, session) { '
' + '

Session Ended' + session.end + '

' + '

Session Length' + session.length + '

' + - '

AFK' + session.afk_time + '

' + + '

Time AFK' + session.afk_time + '

' + '

Server' + session.server_name + '


' + '

Player Kills' + session.player_kills.length + '

' + '

Mob Kills' + session.mob_kills + '

' + diff --git a/Plan/common/src/main/resources/assets/plan/web/player.html b/Plan/common/src/main/resources/assets/plan/web/player.html index 6e2a746d3..f940e3036 100644 --- a/Plan/common/src/main/resources/assets/plan/web/player.html +++ b/Plan/common/src/main/resources/assets/plan/web/player.html @@ -521,7 +521,7 @@
-
+
@@ -553,427 +553,7 @@ Registered Last Seen - - - Server 1 - 54s - Oct 28 2018, 10:05 - Oct 28 2018, 10:05 - - - -
-
-

- OperatorNo -

-

BannedNo

-

- RegisteredMay 30 2017, - 15:02


-

- Sessions96 -

-

Server - Playtime8h 4m - 21s

-

Time AFK4h 26m 32s

-

Longest - Session4h 33m - 6s

-

Session - Median22s

-
-

Player - Kills0

-

Mob - Kills22

-

Deaths8

-
-
-
-
- - Created with Highstock 7.0.3 - - - - - - - - - - - - - - - - - - - - - Click the slices to view used - GameMode - - - - - - - - - world - - - - - - - Highcharts.com - - - - - - - - - world: - - 3s (100.00%) - - - -
-
- - - - -
-
- - - - Server 2 - 7m 43s - Oct 28 2018, 9:05 - Oct 28 2018, 9:05 - - - -
-
-

- OperatorNo -

-

BannedNo

-

- RegisteredMay 30 2017, - 15:02


-

- Sessions96 -

-

Server - Playtime8h 4m - 21s

-

Time AFK4h 26m 32s

-

Longest - Session4h 33m - 6s

-

Session - Median22s

-
-

Player - Kills0

-

Mob - Kills22

-

Deaths8

-
-
-
-
- - Created with Highstock 7.0.3 - - - - - - - - - - - - - - - - - - - - - Click the slices to view used - GameMode - - - - - - - - - world - - - - - - - Highcharts.com - - - - - - - - - world: - - 3s (100.00%) - - - -
-
- -
-
- - - +
@@ -1301,6 +881,7 @@ jsonRequest("../v1/player?player=${playerName}", function (json, error) { loadPlayerOverviewValues(json, error); loadSessionAccordion(json, error); + loadServerAccordion(json, error); loadPlayerKills(json, error); loadPlayerDeaths(json, error); loadPvPPvEValues(json, error);