From 488792a142b714bc7099799ce53ae82b5f0b9301 Mon Sep 17 00:00:00 2001 From: Kaleb <12635144+kalebmmm@users.noreply.github.com> Date: Sun, 22 Oct 2017 21:09:28 -0400 Subject: [PATCH 01/36] IPv6 compatible schema (#355) This is in reference to #355 An IPv6 address can be up to 39 characters, so change the IP column to correspond. This won't help existing users. --- .../main/java/com/djrapitops/plan/database/tables/IPsTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java index 05a99343e..9ecad4c18 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java @@ -43,7 +43,7 @@ public class IPsTable extends UserIDTable { public void createTable() throws DBCreateTableException { createTable(TableSqlParser.createTable(tableName) .column(columnUserID, Sql.INT).notNull() - .column(columnIP, Sql.varchar(20)).notNull() + .column(columnIP, Sql.varchar(39)).notNull() .column(columnGeolocation, Sql.varchar(50)).notNull() .foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID()) .toString() From feff7de74688e81eb948354747492c7d009026c4 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 11:34:35 +0300 Subject: [PATCH 02/36] Fixes #373 --- .../plan/systems/info/BungeeInformationManager.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java index c0f2c16a3..3aa30e949 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java @@ -158,7 +158,14 @@ public class BungeeInformationManager extends InformationManager { */ private ServerInfo getInspectRequestProcessorServer(UUID uuid) { if (bukkitServers.isEmpty()) { - throw new IllegalStateException("No Bukkit Servers."); + try { + refreshBukkitServerMap(); + } catch (SQLException e) { + Log.toLog(this.getClass().getName(), e); + } + if (bukkitServers.isEmpty()) { + throw new IllegalStateException("No Bukkit Servers."); + } } Collection onlineServers = serverInfoManager.getOnlineBukkitServers(); From e7fbee7991f156829f143cf8ee18d6c8962a2ca5 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 11:43:40 +0300 Subject: [PATCH 03/36] Fixes #355 on existing MySQL databases --- .../java/com/djrapitops/plan/database/databases/SQLDB.java | 6 +++++- .../java/com/djrapitops/plan/database/tables/IPsTable.java | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java index 7dbb7f0f8..abb034dd3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java @@ -109,7 +109,7 @@ public abstract class SQLDB extends Database { if (newDatabase) { Log.info("New Database created."); - setVersion(11); + setVersion(12); } int version = getVersion(); @@ -131,6 +131,10 @@ public abstract class SQLDB extends Database { serverTable.alterTableV11(); setVersion(11); } + if (version < 12) { + ipsTable.alterTableV12(); + setVersion(12); + } } catch (SQLException e) { throw new DatabaseInitException("Failed to set-up Database", e); } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java index 9ecad4c18..c91a200f5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/IPsTable.java @@ -50,6 +50,12 @@ public class IPsTable extends UserIDTable { ); } + public void alterTableV12() throws SQLException { + if (usingMySQL) { + executeUnsafe("ALTER TABLE " + tableName + " MODIFY " + columnIP + " VARCHAR(39) NOT NULL"); + } + } + /** * @param uuid UUID of the user. * @return Users's Login Geolocations. From 7790058bbe1d0621e3c4d0b9ccea8e256bfa2299 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 11:47:13 +0300 Subject: [PATCH 04/36] Fixes #353 on new databases and existing MySQL databases --- .../com/djrapitops/plan/database/databases/SQLDB.java | 1 + .../com/djrapitops/plan/database/tables/ActionsTable.java | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java index abb034dd3..f2b2a3df8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java @@ -132,6 +132,7 @@ public abstract class SQLDB extends Database { setVersion(11); } if (version < 12) { + actionsTable.alterTableV12(); ipsTable.alterTableV12(); setVersion(12); } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/ActionsTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/ActionsTable.java index 678b07b50..3c02abad6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/ActionsTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/ActionsTable.java @@ -68,12 +68,18 @@ public class ActionsTable extends UserIDTable { .column(columnServerID, Sql.INT).notNull() .column(columnDate, Sql.LONG).notNull() .column(columnActionID, Sql.INT).notNull() - .column(columnAdditionalInfo, Sql.varchar(100)) + .column(columnAdditionalInfo, Sql.varchar(300)) .foreignKey(columnUserID, usersTable.toString(), usersTable.getColumnID()) .foreignKey(columnServerID, serverTable.toString(), serverTable.getColumnID()) .toString()); } + public void alterTableV12() throws SQLException { + if (usingMySQL) { + executeUnsafe("ALTER TABLE " + tableName + " MODIFY " + columnAdditionalInfo + " VARCHAR(300)"); + } + } + public void insertAction(UUID uuid, Action action) throws SQLException { execute(new ExecStatement(insertStatement) { @Override From 566fbc9cde283e50bd6a2f2d5f49a353f4585f64 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 11:49:51 +0300 Subject: [PATCH 05/36] Additional precautions against #353 --- .../plan/systems/processing/NewNickActionProcessor.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/processing/NewNickActionProcessor.java b/Plan/src/main/java/com/djrapitops/plan/systems/processing/NewNickActionProcessor.java index 31dd6192b..6ae71985f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/processing/NewNickActionProcessor.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/processing/NewNickActionProcessor.java @@ -34,9 +34,7 @@ public class NewNickActionProcessor extends PlayerProcessor { public void process() { UUID uuid = getUUID(); - String n = HtmlUtils.swapColorsToSpan(displayName); - - String info = HtmlUtils.removeXSS(n); + String info = HtmlUtils.removeXSS(displayName); Action action = new Action(MiscUtils.getTime(), Actions.NEW_NICKNAME, info); From 19e16a9afea35dcf208ac1e1e343cc69b40a4781 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 11:57:42 +0300 Subject: [PATCH 06/36] Implemented a way to add 00:00:59 and 00:59, time displays for #345 --- .../java/com/djrapitops/plan/utilities/FormatUtils.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java index ee7e361fb..ea3d8e906 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java @@ -119,6 +119,9 @@ public class FormatUtils { } if (minutes != 0) { String m = Settings.FORMAT_MINUTES.toString().replace("%minutes%", String.valueOf(minutes)); + if (hours == 0 && m.contains("%hours%")) { + m = m.replace("%hours%", Settings.FORMAT_MINUTES.toString().replace("%zero%", "0") + "0"); + } if (m.contains("%zero%") && String.valueOf(minutes).length() == 1) { builder.append('0'); } @@ -126,6 +129,9 @@ public class FormatUtils { } if (seconds != 0) { String s = Settings.FORMAT_SECONDS.toString().replace("%seconds%", String.valueOf(seconds)); + if (minutes == 0 && s.contains("%minutes%")) { + s = s.replace("%minutes%", Settings.FORMAT_MINUTES.toString().replace("%zero%", "0") + 0); + } if (s.contains("%zero%") && String.valueOf(seconds).length() == 1) { builder.append('0'); } From e6dfe7309c1a5b286de35bf77b6945788ac20ad8 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:00:52 +0300 Subject: [PATCH 07/36] Fixed a case where %hours% would appear, (Last commit) --- .../main/java/com/djrapitops/plan/utilities/FormatUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java index ea3d8e906..46142a52a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java @@ -130,7 +130,7 @@ public class FormatUtils { if (seconds != 0) { String s = Settings.FORMAT_SECONDS.toString().replace("%seconds%", String.valueOf(seconds)); if (minutes == 0 && s.contains("%minutes%")) { - s = s.replace("%minutes%", Settings.FORMAT_MINUTES.toString().replace("%zero%", "0") + 0); + s = s.replace("%minutes%", Settings.FORMAT_MINUTES.toString().replace("%hours", "").replace("%zero%", "0") + 0); } if (s.contains("%zero%") && String.valueOf(seconds).length() == 1) { builder.append('0'); From 74f024506b7df45f0465f80370f0014027842eb8 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:02:20 +0300 Subject: [PATCH 08/36] Fixed another case --- .../main/java/com/djrapitops/plan/utilities/FormatUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java index 46142a52a..b9dd466d8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java @@ -121,6 +121,8 @@ public class FormatUtils { String m = Settings.FORMAT_MINUTES.toString().replace("%minutes%", String.valueOf(minutes)); if (hours == 0 && m.contains("%hours%")) { m = m.replace("%hours%", Settings.FORMAT_MINUTES.toString().replace("%zero%", "0") + "0"); + } else { + m = m.replace("%hours", ""); } if (m.contains("%zero%") && String.valueOf(minutes).length() == 1) { builder.append('0'); @@ -131,6 +133,8 @@ public class FormatUtils { String s = Settings.FORMAT_SECONDS.toString().replace("%seconds%", String.valueOf(seconds)); if (minutes == 0 && s.contains("%minutes%")) { s = s.replace("%minutes%", Settings.FORMAT_MINUTES.toString().replace("%hours", "").replace("%zero%", "0") + 0); + } else { + s = s.replace("%minutes%", ""); } if (s.contains("%zero%") && String.valueOf(seconds).length() == 1) { builder.append('0'); From 2d752e481b9cd82ba43c4989742d0204ea1fc769 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:09:30 +0300 Subject: [PATCH 09/36] Sorted Network page content alphabetically for #363 --- .../java/com/djrapitops/plan/utilities/html/HtmlStructure.java | 1 + 1 file changed, 1 insertion(+) 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 37e696b28..3c0d66040 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 @@ -385,6 +385,7 @@ public class HtmlStructure { int i = 0; StringBuilder b = new StringBuilder(); List values = new ArrayList<>(networkPageContents.values()); + Collections.sort(values); int size = values.size(); int extra = size % 3; for (int j = 0; j < extra; j++) { From 394314a8887f9de20adef9f9c1b5674036c4d346 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:12:19 +0300 Subject: [PATCH 10/36] Registered Network page update task for #349 --- Plan/src/main/java/com/djrapitops/plan/PlanBungee.java | 8 +++++++- .../plan/systems/info/BungeeInformationManager.java | 10 +++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java index affafc428..fd47f97fb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java +++ b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java @@ -69,7 +69,7 @@ public class PlanBungee extends BungeePlugin implements IPlan { registerCommand(new ReloadCommand(this)); String ip = variableHolder.getIp(); - if ("0.0.0.0" .equals(ip)) { + if ("0.0.0.0".equals(ip)) { Log.error("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server."); Log.info("Player Analytics partially enabled (Use /planbungee to reload config)"); return; @@ -98,6 +98,12 @@ public class PlanBungee extends BungeePlugin implements IPlan { }).runTaskAsynchronously(); getRunnableFactory().createNew("Player Count task", new TPSCountTimer(this)) .runTaskTimerAsynchronously(1000, TimeAmount.SECOND.ticks()); + getRunnableFactory().createNew("NetworkPageContentUpdateTask", new AbsRunnable("NetworkPageContentUpdateTask") { + @Override + public void run() { + infoManager.updateNetworkPageContent(); + } + }).runTaskTimerAsynchronously(1500, TimeAmount.MINUTE.ticks()); // getProxy().registerChannel("Plan"); // registerListener(new BungeePluginChannelListener(this)); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java index 3aa30e949..794b906ee 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/BungeeInformationManager.java @@ -15,16 +15,14 @@ import main.java.com.djrapitops.plan.systems.info.parsing.NetworkPageParser; import main.java.com.djrapitops.plan.systems.info.server.BungeeServerInfoManager; import main.java.com.djrapitops.plan.systems.info.server.ServerInfo; import main.java.com.djrapitops.plan.systems.webserver.PageCache; -import main.java.com.djrapitops.plan.systems.webserver.response.InspectPageResponse; -import main.java.com.djrapitops.plan.systems.webserver.response.InternalErrorResponse; -import main.java.com.djrapitops.plan.systems.webserver.response.NotFoundResponse; -import main.java.com.djrapitops.plan.systems.webserver.response.Response; +import main.java.com.djrapitops.plan.systems.webserver.response.*; import main.java.com.djrapitops.plan.systems.webserver.webapi.WebAPIManager; import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.AnalysisReadyWebAPI; import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.AnalyzeWebAPI; import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.InspectWebAPI; import main.java.com.djrapitops.plan.systems.webserver.webapi.bukkit.IsOnlineWebAPI; import main.java.com.djrapitops.plan.systems.webserver.webapi.bungee.RequestPluginsTabWebAPI; +import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.html.HtmlStructure; import java.sql.SQLException; @@ -355,9 +353,7 @@ public class BungeeInformationManager extends InformationManager { @Override public void updateNetworkPageContent() { - Collection online = serverInfoManager.getOnlineBukkitServers(); - online.stream().map(ServerInfo::getUuid) - .forEach(this::removeNetworkPageContent); + PageCache.cachePage("analysisPage" + MiscUtils.getIPlan().getServerUuid(), () -> new AnalysisPageResponse(this)); } public void sendConfigSettings() { From ab3048b515e8e5a95fb1c786e8c199d6c7c249bd Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:16:57 +0300 Subject: [PATCH 11/36] Removed ${playersMax} from the network page because the max_players config setting is not made available via ProxyConfig. #362 --- .../djrapitops/plan/systems/info/parsing/NetworkPageParser.java | 1 - Plan/src/main/resources/html/network.html | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) 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 687ffe362..959a064b6 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 @@ -48,7 +48,6 @@ public class NetworkPageParser extends PageParser { addValue("playersOnlineSeries", PlayerActivityGraphCreator.buildSeriesDataString(networkOnlineData)); addValue("playersGraphColor", Colors.PLAYERS_ONLINE.getColor()); addValue("playersOnline", plugin.getProxy().getOnlineCount()); - addValue("playersMax", plugin.getProxy().getConfig().getPlayerLimit()); addValue("playersTotal", db.getUsersTable().getPlayerCount()); diff --git a/Plan/src/main/resources/html/network.html b/Plan/src/main/resources/html/network.html index 420a3f6b7..43b9c44b1 100644 --- a/Plan/src/main/resources/html/network.html +++ b/Plan/src/main/resources/html/network.html @@ -41,7 +41,7 @@

Information

-

${playersOnline}/${playersMax} Players Online

+

${playersOnline} Players Online

${playersTotal} Total Players

${playersNewDay} New Players Today
${playersNewWeek} New Players This Week

From 510d8d219aa20e98587585ca6cb8c7d3e06105b2 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:19:59 +0300 Subject: [PATCH 12/36] Fixed #368 - Also fixes plugin crash on /planbungee command. --- Plan/src/main/java/com/djrapitops/plan/PlanBungee.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java index fd47f97fb..a92dbbb2d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java +++ b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java @@ -27,7 +27,6 @@ import main.java.com.djrapitops.plan.utilities.Benchmark; import net.md_5.bungee.api.ChatColor; import java.io.InputStream; -import java.util.List; import java.util.UUID; /** @@ -128,10 +127,10 @@ public class PlanBungee extends BungeePlugin implements IPlan { @Override public void onDisable() { if (processingQueue != null) { - List processors = processingQueue.stopAndReturnLeftovers(); - Log.info("Processing unprocessed processors. (" + processors.size() + ")"); - for (Processor processor : processors) { - processor.process(); + try { + processingQueue.stop(); + } catch (IllegalArgumentException ignored) { + /*ignored*/ } } Log.info(Locale.get(Msg.DISABLED).toString()); From 70057c1105dcb6311ebcb64c2937539d2bc51adc Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:22:33 +0300 Subject: [PATCH 13/36] Fixes wrong command info messages for #358 --- .../djrapitops/plan/command/commands/ListServersCommand.java | 2 +- .../com/djrapitops/plan/command/commands/NetworkCommand.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java index d59eaf8e3..0a59ed1ed 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java @@ -33,7 +33,7 @@ public class ListServersCommand extends SubCommand { super("servers, serverlist, listservers, sl", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), - Locale.get(Msg.CMD_USG_RELOAD).toString()); + "List servers in the network"); this.plugin = plugin; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java index 0b147ba3a..dc8abd7ca 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java @@ -25,7 +25,10 @@ public class NetworkCommand extends SubCommand { * Class Constructor. */ public NetworkCommand(Plan plugin) { - super("network, n, netw", CommandType.CONSOLE, Permissions.ANALYZE.getPermission(), Locale.get(Msg.CMD_USG_LIST).toString(), ""); + super("network, n, netw", + CommandType.CONSOLE, + Permissions.ANALYZE.getPermission(), + "Get the link to the network page"); this.plugin = plugin; } From 911af1c0b361c925645f2205951f5bafa9d1634b Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:25:25 +0300 Subject: [PATCH 14/36] Prevents Bungee from sending itself Ping requests for #361 --- .../plan/systems/info/server/BungeeServerInfoManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java index 7a016d98c..db493514b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java @@ -129,6 +129,9 @@ public class BungeeServerInfoManager { } public void serverConnected(UUID serverUUID) { + if (plugin.getServerUuid().equals(serverUUID)) { + return; + } Log.info("Received a connection from a Bukkit server.."); if (onlineServers.contains(serverUUID)) { sendConfigSettings(serverUUID); From f1a96110a73e7aee8cb21274f444c343dc7a1054 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:33:31 +0300 Subject: [PATCH 15/36] Fixed network page link leading to incorrect relative links when the AlternativeIP contains a subdirectory #356 --- .../com/djrapitops/plan/command/commands/NetworkCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java index dc8abd7ca..9ccb11e69 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/NetworkCommand.java @@ -46,7 +46,7 @@ public class NetworkCommand extends SubCommand { sender.sendMessage(Locale.get(Msg.CMD_CONSTANT_FOOTER).parse()); // Link - String url = Plan.getInstance().getInfoManager().getLinkTo("/network"); + String url = Plan.getInstance().getInfoManager().getLinkTo("/network/"); String message = Locale.get(Msg.CMD_INFO_LINK).toString(); boolean console = !CommandUtils.isPlayer(sender); if (console) { From cfd69de91091a8cbb09c1719fb5e1f87dc5beec7 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:34:04 +0300 Subject: [PATCH 16/36] Fixed players page link leading to incorrect relative links when the AlternativeIP contains a subdirectory #356 --- .../java/com/djrapitops/plan/command/commands/ListCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ListCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ListCommand.java index e1babaade..fdcade3b4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ListCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ListCommand.java @@ -43,7 +43,7 @@ public class ListCommand extends SubCommand { sender.sendMessage(Locale.get(Msg.CMD_CONSTANT_FOOTER).parse()); // Link - String url = Plan.getInstance().getInfoManager().getLinkTo("/players"); + String url = Plan.getInstance().getInfoManager().getLinkTo("/players/"); String message = Locale.get(Msg.CMD_INFO_LINK).toString(); boolean console = !CommandUtils.isPlayer(sender); if (console) { From 0093e7d245e472df9816e42c9970f0a09ac80b18 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:39:01 +0300 Subject: [PATCH 17/36] Prevented NPE of #352 from occurring --- .../djrapitops/plan/data/AnalysisData.java | 33 ++++--------------- .../plan/utilities/analysis/Analysis.java | 1 - 2 files changed, 7 insertions(+), 27 deletions(-) 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 19ec39118..b944ce06f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/AnalysisData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/AnalysisData.java @@ -1,6 +1,5 @@ package main.java.com.djrapitops.plan.data; -import com.djrapitops.plugin.utilities.Verify; import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.data.analysis.*; import main.java.com.djrapitops.plan.utilities.Benchmark; @@ -38,7 +37,6 @@ public class AnalysisData extends RawData { private final TPSPart tpsPart; private final WorldPart worldPart; private long refreshDate; - private String planVersion; private String pluginsTabLayout; private Map additionalDataReplaceMap; private String playersTable; @@ -97,26 +95,10 @@ public class AnalysisData extends RawData { worldPart); } - public String getPlanVersion() { - return planVersion; - } - - public void setPlanVersion(String planVersion) { - this.planVersion = planVersion; - } - - public String getPluginsTabLayout() { - return pluginsTabLayout; - } - public void setPluginsTabLayout(String pluginsTabLayout) { this.pluginsTabLayout = pluginsTabLayout; } - public Map getAdditionalDataReplaceMap() { - return additionalDataReplaceMap; - } - public void setAdditionalDataReplaceMap(Map additionalDataReplaceMap) { this.additionalDataReplaceMap = additionalDataReplaceMap; } @@ -127,12 +109,15 @@ public class AnalysisData extends RawData { @Override protected void analyse() { - Verify.nullCheck(playersTable); - Verify.nullCheck(pluginsTabLayout); - Verify.nullCheck(planVersion); + if (playersTable == null) { + playersTable = ""; + } + if (pluginsTabLayout == null) { + pluginsTabLayout = ""; + } addValue("tableBodyPlayerList", playersTable); - addValue("version", planVersion); + addValue("version", MiscUtils.getIPlan().getVersion()); final List parts = getAllParts(); parts.forEach(part -> { @@ -157,8 +142,4 @@ public class AnalysisData extends RawData { public long getRefreshDate() { return refreshDate; } - - public void setRefreshDate(long refreshDate) { - this.refreshDate = refreshDate; - } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index c852c2ce7..0e64c4954 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -110,7 +110,6 @@ public class Analysis { AnalysisData analysisData = new AnalysisData(); List thirdPartyPlugins = plugin.getHookHandler().getAdditionalDataSources(); analysisData.setPluginsTabLayout(HtmlStructure.createAnalysisPluginsTabLayout(thirdPartyPlugins)); - analysisData.setPlanVersion(plugin.getVersion()); Benchmark.stop("Analysis", "Create Empty dataset"); fillDataset(analysisData, db); From 78688b1d59e2935630f2d48f970fe5a8a983f7ab Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 24 Oct 2017 12:41:26 +0300 Subject: [PATCH 18/36] Fixed #357 --- .../plan/systems/info/server/BukkitServerInfoManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java index 217816310..4cc2dcb44 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BukkitServerInfoManager.java @@ -97,7 +97,7 @@ public class BukkitServerInfoManager { } private UUID generateNewUUID(ServerVariableHolder variableHolder) { - String seed = variableHolder.getName() + variableHolder.getIp() + variableHolder.getPort() + variableHolder.getVersion() + variableHolder.getImplVersion(); + String seed = plugin.getServer().getServerId() + variableHolder.getName() + variableHolder.getIp() + variableHolder.getPort() + variableHolder.getVersion() + variableHolder.getImplVersion(); return UUID.nameUUIDFromBytes(seed.getBytes()); } From fb1d7f625cc5d41098481e0b35628d2c2d4bb103 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 25 Oct 2017 14:36:56 +0300 Subject: [PATCH 19/36] Removed the second icon next to server name on Inspect page plugins tab --- .../java/com/djrapitops/plan/utilities/html/HtmlStructure.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3c0d66040..d4574bc31 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 @@ -213,7 +213,7 @@ public class HtmlStructure { .append("
") .append("

") .append(serverName) - .append("

") + .append("") .append("
") .append("") .append("") From c77891c53ba8047f46d88a61abb865760d08bc65 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 25 Oct 2017 19:31:44 +0300 Subject: [PATCH 20/36] Started work on unifying session tabs on both pages. #354 - Config setting - Inspect page now can use a table. --- .../java/com/djrapitops/plan/Settings.java | 1 + .../plan/data/analysis/JoinInfoPart.java | 2 +- .../info/BukkitInformationManager.java | 2 +- .../info/parsing/InspectPageParser.java | 2 +- .../djrapitops/plan/utilities/html/Html.java | 17 +++++++-- .../plan/utilities/html/HtmlStructure.java | 37 ++++++++++++++----- .../html/tables/SessionsTableCreator.java | 6 ++- Plan/src/main/resources/config.yml | 2 + .../utilities/html/HtmlStructureTest.java | 3 +- 9 files changed, 54 insertions(+), 18 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/Settings.java b/Plan/src/main/java/com/djrapitops/plan/Settings.java index 76972284c..03ea1871a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Settings.java +++ b/Plan/src/main/java/com/djrapitops/plan/Settings.java @@ -26,6 +26,7 @@ public enum Settings { WRITE_NEW_LOCALE("Plugin.WriteNewLocaleFileOnStart"), DEV_MODE("Plugin.Dev"), USE_SERVER_TIME("Customization.UseServerTime"), + DISPLAY_SESSIONS_AS_TABLE("Customization.Display.SessionsAsTable"), // Integer WEBSERVER_PORT("WebServer.Port"), diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java index 6ea5b4f1e..7038e974a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java @@ -61,7 +61,7 @@ public class JoinInfoPart extends RawData { } private void sessionTables() { - String[] tables = SessionsTableCreator.createTables(this); + String[] tables = SessionsTableCreator.createTable(this); addValue("tableBodySessions", tables[0]); addValue("tableBodyRecentLogins", tables[1]); } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java index 060c75c70..9b0410b4a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java @@ -130,7 +130,7 @@ public class BukkitInformationManager extends InformationManager { HookHandler hookHandler = plugin.getHookHandler(); List plugins = hookHandler.getAdditionalDataSources(); Map replaceMap = hookHandler.getAdditionalInspectReplaceRules(uuid); - String contents = HtmlStructure.createInspectPageTabContent(serverName, plugins, replaceMap); + String contents = HtmlStructure.createInspectPluginsTabContent(serverName, plugins, replaceMap); cacheInspectPluginsTab(uuid, contents); } } 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 9d1275601..3461e759b 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 @@ -101,7 +101,7 @@ public class InspectPageParser extends PageParser { .sorted(new SessionStartComparator()) .collect(Collectors.toList()); - String[] sessionsTabContent = HtmlStructure.createSessionsTabContent(sessions, allSessions); + String[] sessionsTabContent = HtmlStructure.createSessionsTabContentInspectPage(sessions, allSessions, uuid); addValue("contentSessions", sessionsTabContent[0]); addValue("sessionTabGraphViewFunctions", sessionsTabContent[1]); addValue("contentServerOverview", HtmlStructure.createServerOverviewColumn(sessions)); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java index 52645d4fe..67a70a8e3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java @@ -1,6 +1,5 @@ package main.java.com.djrapitops.plan.utilities.html; -import com.djrapitops.plugin.utilities.Verify; import org.apache.commons.lang3.text.StrSubstitutor; import java.io.Serializable; @@ -38,9 +37,22 @@ public enum Html { LINK_CLASS("class=\"link\""), IMG(""), // + PARAGRAPH("

${0}

"), + HEADER("

${0}

"), + HEADER_2("

${0}

"), + // + DIV_W_CLASS("
${1}
"), + DIV_W_CLASS_STYLE("
${2}
"), + // + ROW(DIV_W_CLASS.parse("row", "${0}")), + // + TABLE_END(""), TABLE_START_2(""), TABLE_START_3("
${0}${1}
"), TABLE_START_4("
${0}${1}${2}
"), + TABLE_SESSIONS(DIV_W_CLASS_STYLE.parse("box-footer scrollbar", "padding: 2px;", + TABLE_START_4.parse("Player", "Started", "Length", "World - Time") + "${0}" + TABLE_END.parse()) + ), TABLE_SESSIONS_START(TABLE_START_3.parse("Session Started", "Session Ended", "Session Length")), TABLE_KILLS_START(TABLE_START_3.parse(FONT_AWESOME_ICON.parse("clock-o") + " Time", "Killed", "With")), TABLE_FACTIONS_START(TABLE_START_4.parse(FONT_AWESOME_ICON.parse("flag") + " Faction", FONT_AWESOME_ICON.parse("bolt") + " Power", FONT_AWESOME_ICON.parse("map-o") + " Land", FONT_AWESOME_ICON.parse("user") + " Leader")), @@ -50,8 +62,7 @@ public enum Html { TABLELINE_4(""), TABLELINE_PLAYERS("" + ""), TABLELINE_3_CUSTOMKEY(""), - TABLELINE_3_CUSTOMKEY_1(""), - TABLE_END("
${0}${1}${2}${3}
${0}${1}${2}${3}
${0}${1}${3}${4}${6}${8}${9}
${1}${3}${5}
${1}${2}${3}
"); + TABLELINE_3_CUSTOMKEY_1("${1}${2}${3}"); private final String html; 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 d4574bc31..56dffa0a0 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 @@ -6,6 +6,7 @@ package main.java.com.djrapitops.plan.utilities.html; import com.djrapitops.plugin.utilities.Verify; import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; @@ -14,6 +15,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.graphs.WorldPieCreator; import main.java.com.djrapitops.plan.utilities.html.tables.KillsTableCreator; +import main.java.com.djrapitops.plan.utilities.html.tables.SessionsTableCreator; import org.apache.commons.lang3.text.StrSubstitutor; import java.io.FileNotFoundException; @@ -92,7 +94,11 @@ public class HtmlStructure { return builder.toString(); } - public static String[] createSessionsTabContent(Map> sessions, List allSessions) throws FileNotFoundException { + public static String[] createSessionsTabContentInspectPage(Map> sessions, List allSessions, UUID uuid) throws FileNotFoundException { + if (Settings.DISPLAY_SESSIONS_AS_TABLE.isTrue()) { + return getSessionsAsTable(sessions, allSessions, uuid); + } + Map serverNameIDRelationMap = new HashMap<>(); if (Verify.isEmpty(allSessions)) { @@ -190,16 +196,27 @@ public class HtmlStructure { return new String[]{html.toString(), viewScript.toString()}; } - public static String createInspectPageTabContent(String serverName, List plugins, Map replaceMap) { + private static String[] getSessionsAsTable(Map> sessions, List allSessions, UUID uuid) { + Map uuidByID = new HashMap<>(); + for (List sessionList : sessions.values()) { + for (Session session : sessionList) { + uuidByID.put(session.getSessionID(), uuid); + } + } + + return new String[]{Html.TABLE_SESSIONS.parse(SessionsTableCreator.createTable(uuidByID, allSessions)[0]), ""}; + } + + public static String createInspectPluginsTabContent(String serverName, List plugins, Map replaceMap) { if (plugins.isEmpty()) { - return "
" + - "
" + - "
" + - "
" + - "
" + - "

" + serverName + - "

No Compatible Plugins

" + - "
"; + String icon = Html.FONT_AWESOME_ICON.parse("server"); + // TODO Move plain text to Locale + String headerText = Html.HEADER_2.parse(icon + " " + serverName) + Html.PARAGRAPH.parse("No Compatible Plugins"); + return Html.DIV_W_CLASS.parse("plugins-server", + Html.DIV_W_CLASS.parse("plugins-header", + Html.ROW.parse(Html.DIV_W_CLASS.parse("box-header", headerText)) + ) + ); } Map> placeholders = getPlaceholdersInspect(plugins); 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 43194e9f9..e8a466b21 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 @@ -24,7 +24,7 @@ import java.util.*; */ public class SessionsTableCreator { - public static String[] createTables(JoinInfoPart joinInfoPart) { + public static String[] createTable(JoinInfoPart joinInfoPart) { Map uuidByID = new HashMap<>(); for (Map.Entry> entry : joinInfoPart.getSessions().entrySet()) { List sessions = entry.getValue(); @@ -34,6 +34,10 @@ public class SessionsTableCreator { } List allSessions = joinInfoPart.getAllSessions(); + return createTable(uuidByID, allSessions); + } + + public static String[] createTable(Map uuidByID, List allSessions) { if (allSessions.isEmpty()) { return new String[]{Html.TABLELINE_4.parse("No Sessions", "", "", ""), Html.TABLELINE_2.parse("No Sessions", "")}; diff --git a/Plan/src/main/resources/config.yml b/Plan/src/main/resources/config.yml index 3d54a53ba..67836116f 100644 --- a/Plan/src/main/resources/config.yml +++ b/Plan/src/main/resources/config.yml @@ -52,6 +52,8 @@ Data: Customization: UseServerTime: true + Display: + SessionsAsTable: false Formatting: DecimalPoints: '#.##' TimeAmount: diff --git a/Plan/test/main/java/com/djrapitops/plan/utilities/html/HtmlStructureTest.java b/Plan/test/main/java/com/djrapitops/plan/utilities/html/HtmlStructureTest.java index 23106a7c1..90350c9a5 100644 --- a/Plan/test/main/java/com/djrapitops/plan/utilities/html/HtmlStructureTest.java +++ b/Plan/test/main/java/com/djrapitops/plan/utilities/html/HtmlStructureTest.java @@ -8,6 +8,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import test.java.utils.MockUtils; import test.java.utils.RandomData; import test.java.utils.TestInit; @@ -47,7 +48,7 @@ public class HtmlStructureTest { @Test public void createSessionsTabContent() throws Exception { List allSessions = sessions.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); - String[] sessionsTab = HtmlStructure.createSessionsTabContent(sessions, allSessions); + String[] sessionsTab = HtmlStructure.createSessionsTabContentInspectPage(sessions, allSessions, MockUtils.getPlayerUUID()); int opened = StringUtils.countMatches(sessionsTab[0], " Date: Wed, 25 Oct 2017 19:35:58 +0300 Subject: [PATCH 21/36] Improved Exception JavaDocs --- .../djrapitops/plan/api/exceptions/DBCreateTableException.java | 2 +- .../com/djrapitops/plan/api/exceptions/DatabaseException.java | 2 +- .../djrapitops/plan/api/exceptions/DatabaseInitException.java | 2 +- .../java/com/djrapitops/plan/api/exceptions/ParseException.java | 2 +- .../plan/api/exceptions/WebAPIConnectionFailException.java | 2 +- .../com/djrapitops/plan/api/exceptions/WebAPIException.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DBCreateTableException.java b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DBCreateTableException.java index d45730796..28f6686a7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DBCreateTableException.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DBCreateTableException.java @@ -5,7 +5,7 @@ package main.java.com.djrapitops.plan.api.exceptions; /** - * Thrown when something goes wrong with creating tables with Table#createTable. + * Thrown when something goes wrong with creating tables with {@code Table#createTable}. * * @author Rsl1122 */ diff --git a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseException.java b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseException.java index 9688da38f..98e28b753 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseException.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseException.java @@ -5,7 +5,7 @@ package main.java.com.djrapitops.plan.api.exceptions; /** - * Thrown when something goes wrong in the database, generic exception. + * Thrown when something goes wrong with the Database, generic exception. * * @author Rsl1122 */ diff --git a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseInitException.java b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseInitException.java index 1df4cda7b..e63ba8fc7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseInitException.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/DatabaseInitException.java @@ -5,7 +5,7 @@ package main.java.com.djrapitops.plan.api.exceptions; /** - * Thrown when something goes wrong with Database#init. + * Thrown when something goes wrong with {@code Database#init}. * * @author Rsl1122 */ diff --git a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/ParseException.java b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/ParseException.java index 3974982be..4d854f457 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/ParseException.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/ParseException.java @@ -5,7 +5,7 @@ package main.java.com.djrapitops.plan.api.exceptions; /** - * Exception thrown when Html page parsing fails. + * Exception thrown when PageParser encounters an Exception. * * @author Rsl1122 */ diff --git a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIConnectionFailException.java b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIConnectionFailException.java index 008eba0b1..02a8bada4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIConnectionFailException.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIConnectionFailException.java @@ -5,7 +5,7 @@ package main.java.com.djrapitops.plan.api.exceptions; /** - * Thrown when WebAPI fails to connect. + * Thrown when WebAPI fails to connect to an address. * * @author Rsl1122 */ diff --git a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIException.java b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIException.java index 724fc4f19..e5ab24a0e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIException.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/exceptions/WebAPIException.java @@ -5,7 +5,7 @@ package main.java.com.djrapitops.plan.api.exceptions; /** - * Thrown when web api post request fails. + * Thrown when WebAPI POST-request fails, general Exception. * * @author Rsl1122 */ From 4b26755d5b185fcf1b8790d50404cc8f8055c302 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Fri, 27 Oct 2017 19:08:48 +0300 Subject: [PATCH 22/36] Implemented unified Session display on both pages (#354) and added SessionID as a tooltip. (#332) --- .../java/com/djrapitops/plan/api/API.java | 27 ++- .../plan/data/analysis/JoinInfoPart.java | 4 + .../info/parsing/InspectPageParser.java | 2 +- .../djrapitops/plan/utilities/html/Html.java | 1 + .../plan/utilities/html/HtmlStructure.java | 106 +---------- .../structure/SessionTabStructureCreator.java | 177 ++++++++++++++++++ .../html/tables/SessionsTableCreator.java | 3 +- Plan/src/main/resources/html/server.html | 24 +-- 8 files changed, 216 insertions(+), 128 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionTabStructureCreator.java diff --git a/Plan/src/main/java/com/djrapitops/plan/api/API.java b/Plan/src/main/java/com/djrapitops/plan/api/API.java index 9dac148fc..722a3de1e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/API.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/API.java @@ -27,14 +27,14 @@ import java.util.UUID; * @author Rsl1122 * @see PluginData * @see AnalysisType - * @since 2.0.0 + * @since 4.0.0 */ public class API { private final Plan plugin; /** - * Class Constructor. + * Creates a new API instance - not supposed to be called outside {@code Plan.onEnable}. * * @param plugin Current instance of Plan */ @@ -78,7 +78,7 @@ public class API { * {@code PlayerName} * * @param name Name of the player - * @return ./player/PlayerName + * @return {@code ../player/PlayerName} */ public String getPlayerInspectPageLink(String name) { String link = "../player/" + name; @@ -86,7 +86,7 @@ public class API { } /** - * Check if Players's Inspect page is cached to pagecache. + * Check if Players's Inspect page is cached to PageCache. * * @param uuid UUID of the player. * @return true/false @@ -97,12 +97,21 @@ public class API { return isPlayerHtmlCached(uuid); } + /** + * Check if Players's Inspect page is cached to PageCache of the providing WebServer. + *

+ * Using BungeeCord: Will send a {@code IsCachedWebAPI} request to check if the page is in Bungee's PageCache. + * Only Bukkit: Checks PageCache for page. + * + * @param uuid UUID of the player. + * @return true/false + */ public boolean isPlayerHtmlCached(UUID uuid) { return plugin.getInfoManager().isCached(uuid); } /** - * Cache Players's Inspect page to the PageCache of the WebServer. + * Cache Players's Inspect page to the PageCache of the providing WebServer. * * @param uuid UUID of the player. * @deprecated use {@code cachePlayerHtml} @@ -113,9 +122,13 @@ public class API { } /** - * Cache Players's Inspect page to the PageCache of the WebServer. + * Cache Players's Inspect page to the PageCache of the providing WebServer. + *

+ * Using BungeeCord: Will send a {@code PostHtmlWebAPI} request after calculating the inspect page. + * Only Bukkit: Calculates inspect page and places it in the PageCache. * * @param uuid UUID of the player. + * @deprecated use {@code cachePlayerHtml} */ public void cachePlayerHtml(UUID uuid) { plugin.getInfoManager().cachePlayer(uuid); @@ -124,7 +137,7 @@ public class API { /** * Used to get the full Html of the Inspect page as a string. *

- * Check if the data is cached to InspectCache before calling this. + * Re-calculates the inspect html on this server. * * @param uuid UUID of the player. * @return player.html with all placeholders replaced. diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java index 7038e974a..d95dbaa8d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java @@ -5,6 +5,7 @@ import com.djrapitops.plugin.utilities.Verify; import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; +import main.java.com.djrapitops.plan.utilities.html.structure.SessionTabStructureCreator; import main.java.com.djrapitops.plan.utilities.html.tables.SessionsTableCreator; import java.util.*; @@ -62,6 +63,9 @@ public class JoinInfoPart extends RawData { private void sessionTables() { String[] tables = SessionsTableCreator.createTable(this); + String[] sessionContent = SessionTabStructureCreator.creteStructure(this); + addValue("contentSessions", sessionContent[0]); + addValue("sessionTabGraphViewFunctions", sessionContent[1]); addValue("tableBodySessions", tables[0]); addValue("tableBodyRecentLogins", tables[1]); } 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 3461e759b..74c28cf61 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 @@ -98,7 +98,7 @@ public class InspectPageParser extends PageParser { Map> sessions = sessionsTable.getSessions(uuid); List allSessions = sessions.values().stream() .flatMap(Collection::stream) - .sorted(new SessionStartComparator()) + .sorted(new SessionStartComparator()) // Sorted Newest first. .collect(Collectors.toList()); String[] sessionsTabContent = HtmlStructure.createSessionsTabContentInspectPage(sessions, allSessions, uuid); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java index 67a70a8e3..2b9e0b2fe 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/Html.java @@ -33,6 +33,7 @@ public enum Html { BUTTON("${1}"), BUTTON_CLASS("class=\"button\""), LINK("${1}"), + LINK_TOOLTIP("${1}"), LINK_EXTERNAL("${1}"), LINK_CLASS("class=\"link\""), IMG(""), 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 56dffa0a0..83a90737f 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 @@ -6,15 +6,13 @@ package main.java.com.djrapitops.plan.utilities.html; import com.djrapitops.plugin.utilities.Verify; import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.systems.info.BukkitInformationManager; 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.graphs.WorldPieCreator; -import main.java.com.djrapitops.plan.utilities.html.tables.KillsTableCreator; +import main.java.com.djrapitops.plan.utilities.html.structure.SessionTabStructureCreator; import main.java.com.djrapitops.plan.utilities.html.tables.SessionsTableCreator; import org.apache.commons.lang3.text.StrSubstitutor; @@ -95,105 +93,9 @@ public class HtmlStructure { } public static String[] createSessionsTabContentInspectPage(Map> sessions, List allSessions, UUID uuid) throws FileNotFoundException { - if (Settings.DISPLAY_SESSIONS_AS_TABLE.isTrue()) { - return getSessionsAsTable(sessions, allSessions, uuid); - } - - Map serverNameIDRelationMap = new HashMap<>(); - - if (Verify.isEmpty(allSessions)) { - return new String[]{"

" + - "
" + - "
" + - "

No Sessions

" + - "
", ""}; - } - - for (Map.Entry> entry : sessions.entrySet()) { - String serverName = entry.getKey(); - List serverSessions = entry.getValue(); - for (Session session : serverSessions) { - serverNameIDRelationMap.put(session.getSessionID(), serverName); - } - } - - StringBuilder html = new StringBuilder(); - StringBuilder viewScript = new StringBuilder(); - int i = 0; - for (Session session : allSessions) { - if (i >= 50) { - break; - } - - String sessionStart = FormatUtils.formatTimeStampYear(session.getSessionStart()); - String sessionLength = FormatUtils.formatTimeAmount(session.getLength()); - String sessionEnd = FormatUtils.formatTimeStampYear(session.getSessionEnd()); - - String dotSeparated = separateWithDots(sessionStart, sessionLength); - - // Session-column starts & header. - html.append("
") - .append("
") - .append("
") - .append("

").append(dotSeparated).append("

") - .append("
") - .append("
"); - - String serverName = serverNameIDRelationMap.get(session.getSessionID()); - - // Left side of Session box - html.append("
") - .append("
") // - .append("
"); - - // Left side header - html.append("
") - .append("

") - .append(sessionStart) - .append("

") - .append("
"); - - // Left side content - html.append("
") - .append("

Session Length: ").append(sessionLength).append("
") - .append("Session Ended: ").append(sessionEnd).append("
") - .append("Server: ").append(serverName).append("

") - .append("Mob Kills: ").append(session.getMobKills()).append("
") - .append("Deaths: ").append(session.getDeaths()).append("

"); - - html.append(KillsTableCreator.createTable(session.getPlayerKills())) - .append("
"); // Left Side content ends - - // Left side ends & Right side starts - html.append("
") - .append("
"); - - String id = "worldPie" + session.getSessionStart() + i; - - html.append("
"); - - String[] worldData = WorldPieCreator.createSeriesData(session.getWorldTimes()); - - html.append(""); - - viewScript.append("worldPie(") - .append(id).append(", ") - .append(id).append("series, ") - .append(id).append("gmseries") - .append(");"); - - // Session-col, Row, Session-Content, Session-column ends. - html.append("
") - .append("
") - .append("
") - .append("
"); - - i++; - } - return new String[]{html.toString(), viewScript.toString()}; + Map>> map = new HashMap<>(); + map.put(uuid, sessions); + return SessionTabStructureCreator.creteStructure(map, allSessions, false); } private static String[] getSessionsAsTable(Map> sessions, List allSessions, UUID uuid) { 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 new file mode 100644 index 000000000..5e9c9439c --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/SessionTabStructureCreator.java @@ -0,0 +1,177 @@ +/* + * 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.structure; + +import com.djrapitops.plugin.utilities.Verify; +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.Settings; +import main.java.com.djrapitops.plan.data.Session; +import main.java.com.djrapitops.plan.data.analysis.JoinInfoPart; +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.HtmlStructure; +import main.java.com.djrapitops.plan.utilities.html.graphs.WorldPieCreator; +import main.java.com.djrapitops.plan.utilities.html.tables.KillsTableCreator; +import main.java.com.djrapitops.plan.utilities.html.tables.SessionsTableCreator; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class SessionTabStructureCreator { + + public static String[] creteStructure(Map>> sessions, List allSessions, boolean appendName) { + + Map uuidsByID = generateIDtoUUIDMap(sessions); + + if (Settings.DISPLAY_SESSIONS_AS_TABLE.isTrue()) { + return new String[]{Html.TABLE_SESSIONS.parse(SessionsTableCreator.createTable(uuidsByID, allSessions)[0]), ""}; + } + + if (Verify.isEmpty(allSessions)) { + return new String[]{"
" + + "
" + + "
" + + "

No Sessions

" + + "
", ""}; + } + + Map serverNameIDMap = generateIDtoServerNameMap(sessions); + + StringBuilder html = new StringBuilder(); + StringBuilder viewScript = new StringBuilder(); + int i = 0; + for (Session session : allSessions) { + if (i >= 50) { + break; + } + + int sessionID = session.getSessionID(); + UUID uuid = uuidsByID.get(sessionID); + String serverName = serverNameIDMap.get(sessionID); + + String sessionStart = FormatUtils.formatTimeStampYear(session.getSessionStart()); + String sessionLength = FormatUtils.formatTimeAmount(session.getLength()); + String sessionEnd = FormatUtils.formatTimeStampYear(session.getSessionEnd()); + + String name = Plan.getInstance().getDataCache().getName(uuid); + String link = Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(name), name); + String dotSeparated = appendName ? + HtmlStructure.separateWithDots(link, sessionStart, sessionLength) : + HtmlStructure.separateWithDots(sessionStart, sessionLength); + + // Session-column starts & header. + html.append("
") + .append("
") + .append("
") + .append("

").append(dotSeparated).append("

") + .append("
") + .append("
"); + + + // Left side of Session box + html.append("
") + .append("
") // + .append("
"); + + // Left side header + html.append("
") + .append("

") + .append(sessionStart) + .append("

") + .append("
"); + + // Left side content + html.append("
") + .append("

Session Length: ").append(sessionLength).append("
") + .append("Session Ended: ").append(sessionEnd).append("
") + .append("Server: ").append(serverName).append("

") + .append("Mob Kills: ").append(session.getMobKills()).append("
") + .append("Deaths: ").append(session.getDeaths()).append("

"); + + html.append(KillsTableCreator.createTable(session.getPlayerKills())) + .append("
"); // Left Side content ends + + // Left side ends & Right side starts + html.append("
") + .append("
"); + + String id = "worldPie" + session.getSessionStart() + i; + + html.append("
"); + + String[] worldData = WorldPieCreator.createSeriesData(session.getWorldTimes()); + + html.append(""); + + viewScript.append("worldPie(") + .append(id).append(", ") + .append(id).append("series, ") + .append(id).append("gmseries") + .append(");"); + + // Session-col, Row, Session-Content, Session-column ends. + html.append("
") + .append("
") + .append("
") + .append("
"); + + i++; + } + return new String[]{html.toString(), viewScript.toString()}; + } + + private static Map generateIDtoServerNameMap(Map>> sessions) { + Map serverNameIDRelationMap = new HashMap<>(); + for (Map> map : sessions.values()) { + for (Map.Entry> entry : map.entrySet()) { + String serverName = entry.getKey(); + List serverSessions = entry.getValue(); + for (Session session : serverSessions) { + serverNameIDRelationMap.put(session.getSessionID(), serverName); + } + } + } + return serverNameIDRelationMap; + } + + private static Map generateIDtoUUIDMap(Map>> sessions) { + Map uuidsByID = new HashMap<>(); + for (Map.Entry>> entry : sessions.entrySet()) { + UUID uuid = entry.getKey(); + for (List sessionList : entry.getValue().values()) { + for (Session session : sessionList) { + uuidsByID.put(session.getSessionID(), uuid); + } + } + } + return uuidsByID; + } + + public static String[] creteStructure(JoinInfoPart joinInfoPart) { + Map>> map = new HashMap<>(); + Map> sessions = joinInfoPart.getSessions(); + for (Map.Entry> entry : sessions.entrySet()) { + Map> serverSpecificMap = new HashMap<>(); + serverSpecificMap.put("This server", entry.getValue()); + map.put(entry.getKey(), serverSpecificMap); + } + + List allSessions = sessions.values().stream() + .flatMap(Collection::stream) + .sorted(new SessionStartComparator()) + .collect(Collectors.toList()); + + return creteStructure(map, allSessions, true); + } +} \ No newline at end of file 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 e8a466b21..3ff13a72d 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 @@ -77,8 +77,9 @@ public class SessionsTableCreator { String world = getLongestWorldPlayed(session); String inspectUrl = Plan.getPlanAPI().getPlayerInspectPageLink(name); + String toolTip = "Session ID: " + (session.isFetchedFromDB() ? session.getSessionID() : "Not Saved."); sessionTableBuilder.append(Html.TABLELINE_4.parse( - Html.LINK.parse(inspectUrl, name), + Html.LINK_TOOLTIP.parse(inspectUrl, name, toolTip), start, length, world diff --git a/Plan/src/main/resources/html/server.html b/Plan/src/main/resources/html/server.html index 75dad1b6c..090d15ddd 100644 --- a/Plan/src/main/resources/html/server.html +++ b/Plan/src/main/resources/html/server.html @@ -14,6 +14,10 @@ +
@@ -183,21 +187,7 @@

50 Most Recent Sessions

- + ${contentSessions}
@@ -358,6 +348,7 @@ +