+ *.keystore
*.js
*.yml
*.html
diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java
index 0b7469ccf..0b20199ea 100644
--- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java
+++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/WorldPart.java
@@ -1,11 +1,24 @@
package main.java.com.djrapitops.plan.data.analysis;
+import main.java.com.djrapitops.plan.data.time.WorldTimes;
import main.java.com.djrapitops.plan.ui.html.graphs.WorldPieCreator;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import java.util.HashMap;
import java.util.Map;
+/**
+ * Part responsible for all World Playtime related analysis.
+ *
+ * World times Pie
+ *
+ * Placeholder values can be retrieved using the get method.
+ *
+ * Contains following place-holders: worldtotal, worldseries
+ *
+ * @author Rsl1122
+ * @since 3.6.0
+ */
public class WorldPart extends RawData {
private final Map worldTimes;
@@ -16,7 +29,8 @@ public class WorldPart extends RawData {
@Override
protected void analyse() {
- addValue("worldtotal", FormatUtils.formatTimeAmount(worldTimes.values().stream().mapToLong(Long::longValue).sum()));
+ WorldTimes t = new WorldTimes(worldTimes);
+ addValue("worldtotal", FormatUtils.formatTimeAmount(t.getTotal()));
addValue("worldseries", WorldPieCreator.createSeriesData(worldTimes));
}
@@ -24,5 +38,4 @@ public class WorldPart extends RawData {
Long value = worldTimes.computeIfAbsent(worldName, ifNotFound -> 0L);
worldTimes.put(worldName, value + playTime);
}
-
}
diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/KillHandling.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/KillHandling.java
index fdea1bb63..75042f01f 100644
--- a/Plan/src/main/java/com/djrapitops/plan/data/handling/KillHandling.java
+++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/KillHandling.java
@@ -42,7 +42,7 @@ public class KillHandling {
int victimID;
try {
UUID victimUUID = deadPlayer.getUniqueId();
- victimID = plugin.getDB().getUsersTable().getUserId(victimUUID + "");
+ victimID = plugin.getDB().getUsersTable().getUserId(victimUUID);
if (victimID == -1) {
return;
}
diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanWorldChangeListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanWorldChangeListener.java
index d3903c9ce..543d0a086 100644
--- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanWorldChangeListener.java
+++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanWorldChangeListener.java
@@ -30,6 +30,6 @@ public class PlanWorldChangeListener implements Listener {
}
UUID uuid = p.getUniqueId();
long time = MiscUtils.getTime();
- handler.addToPool(new PlaytimeDependentInfo(uuid, InfoType.GM, time, p.getGameMode().name(), p.getWorld().getName()));
+ handler.addToPool(new PlaytimeDependentInfo(uuid, InfoType.WORLD, time, p.getGameMode().name(), p.getWorld().getName()));
}
}
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 1be5a247a..c6a824273 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
@@ -344,7 +344,11 @@ public abstract class SQLDB extends Database {
Map gmTimes = gmTimesTable.getGMTimes(userId);
data.getGmTimes().setTimes(gmTimes);
Map worldTimes = worldTimesTable.getWorldTimes(userId);
- data.getWorldTimes().setTimes(worldTimes);
+ WorldTimes worldT = data.getWorldTimes();
+ worldT.setTimes(worldTimes);
+ if (worldT.getLastStateChange() == 0) {
+ worldT.setLastStateChange(data.getPlayTime());
+ }
List sessions = sessionsTable.getSessionData(userId);
data.addSessions(sessions);
@@ -394,11 +398,19 @@ public abstract class SQLDB extends Database {
UUID uuid = uData.getUuid();
Integer id = userIds.get(uuid);
uData.addIpAddresses(ipList.get(id));
- uData.addNicknames(nicknames.get(id));
+ List userNicks = nicknames.get(id);
+ uData.addNicknames(userNicks);
+ if (!userNicks.isEmpty()) {
+ uData.setLastNick(userNicks.get(userNicks.size() - 1));
+ }
uData.addSessions(sessionData.get(id));
uData.setPlayerKills(playerKills.get(id));
uData.getGmTimes().setTimes(gmTimes.get(id));
- uData.getWorldTimes().setTimes(worldTimes.get(id));
+ WorldTimes worldT = uData.getWorldTimes();
+ worldT.setTimes(worldTimes.get(id));
+ if (worldT.getLastStateChange() == 0) {
+ worldT.setLastStateChange(uData.getPlayTime());
+ }
}
Benchmark.stop("Database: Get UserData for " + uuidsCol.size());
diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java
index 7ab6395aa..0bd9c6dbe 100644
--- a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java
+++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java
@@ -20,6 +20,7 @@ import javax.net.ssl.*;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.URI;
+import java.nio.file.Paths;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
@@ -169,7 +170,7 @@ public class WebServer {
private boolean startHttpsServer() throws IOException {
String keyStorePath = Settings.WEBSERVER_CERTIFICATE_PATH.toString();
- if (!keyStorePath.contains(":")) {
+ if (!Paths.get(keyStorePath).isAbsolute()) {
keyStorePath = plugin.getDataFolder() + keyStorePath;
}
char[] storepass = Settings.WEBSERVER_CERTIFICATE_STOREPASS.toString().toCharArray();
diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java
index d31280849..e74b4ca11 100644
--- a/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java
+++ b/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java
@@ -6,11 +6,13 @@ import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.analysis.GamemodePart;
+import main.java.com.djrapitops.plan.data.time.WorldTimes;
import main.java.com.djrapitops.plan.database.tables.GMTimesTable;
import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.ui.html.graphs.PlayerActivityGraphCreator;
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
import main.java.com.djrapitops.plan.ui.html.graphs.SessionLengthDistributionGraphCreator;
+import main.java.com.djrapitops.plan.ui.html.graphs.WorldPieCreator;
import main.java.com.djrapitops.plan.ui.html.tables.KillsTableCreator;
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
@@ -106,12 +108,15 @@ public class PlaceholderUtils {
Plan plugin = Plan.getInstance();
replaceMap.put("%version%", plugin.getDescription().getVersion());
replaceMap.put("%playersgraphcolor%", Settings.HCOLOR_ACT_ONL.toString());
- Set sessions = new HashSet<>(data.getSessions());
- replaceMap.put("%punchcardseries%", PunchCardGraphCreator.createDataSeries(sessions));
- List lengths = AnalysisUtils.transformSessionDataToLengths(sessions);
- replaceMap.put("%sessionlengthseries%", SessionLengthDistributionGraphCreator.createDataSeries(lengths));
+ Set sessions = new HashSet<>(data.getSessions());
+ List lengths = AnalysisUtils.transformSessionDataToLengths(sessions);
+ replaceMap.put("%punchcardseries%", PunchCardGraphCreator.createDataSeries(sessions));
+ replaceMap.put("%sessionlengthseries%", SessionLengthDistributionGraphCreator.createDataSeries(lengths));
replaceMap.put("%playersonlineseries%", PlayerActivityGraphCreator.buildSeriesDataStringSessions(sessions));
+ WorldTimes worldTimes = data.getWorldTimes();
+ replaceMap.put("%worldseries%", WorldPieCreator.createSeriesData(worldTimes.getTimes()));
+ replaceMap.put("%worldtotal%", FormatUtils.formatTimeAmount(worldTimes.getTotal()));
String[] colors = new String[]{Settings.HCOLOR_MAIN.toString(), Settings.HCOLOR_MAIN_DARK.toString(), Settings.HCOLOR_SEC.toString(), Settings.HCOLOR_TER.toString(), Settings.HCOLOR_TER_DARK.toString()};
String[] defaultCols = new String[]{"348e0f", "267F00", "5cb239", "89c471", "5da341"};
diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java
index 024ec1f28..0e26f9a31 100644
--- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java
+++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java
@@ -13,6 +13,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
@@ -34,7 +35,7 @@ public class ExportUtility {
*/
public static File getFolder() {
String path = Settings.ANALYSIS_EXPORT_PATH.toString();
- if (path.contains(":")) {
+ if (Paths.get(path).isAbsolute()) {
File folder = new File(path);
if (folder.exists()
&& folder.isDirectory()) {
diff --git a/Plan/src/main/resources/Cert.keystore b/Plan/src/main/resources/Cert.keystore
new file mode 100644
index 000000000..4ddf94995
Binary files /dev/null and b/Plan/src/main/resources/Cert.keystore differ
diff --git a/Plan/src/main/resources/player.html b/Plan/src/main/resources/player.html
index bc997fe36..f111fd04a 100644
--- a/Plan/src/main/resources/player.html
+++ b/Plan/src/main/resources/player.html
@@ -378,6 +378,9 @@
UUID: %uuid%
Has Connected from ips: %ips%
+
@@ -409,7 +412,7 @@