diff --git a/Plan/src/main/java/com/djrapitops/plan/data/PlayerProfile.java b/Plan/src/main/java/com/djrapitops/plan/data/PlayerProfile.java index 3bf66b97c..9160e0cc9 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/PlayerProfile.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/PlayerProfile.java @@ -202,6 +202,9 @@ public class PlayerProfile implements OfflinePlayer { return 0L; } + public boolean playedBetween(long after, long before) { + return getSessions(after, before).findFirst().isPresent(); + } // Special Getters @@ -211,7 +214,7 @@ public class PlayerProfile implements OfflinePlayer { public Stream getSessions(long after, long before) { return getAllSessions() - .filter(session -> session.getSessionStart() > after && session.getSessionEnd() < before); + .filter(session -> session.getSessionStart() >= after && session.getSessionEnd() <= before); } public GeoInfo getMostRecentGeoInfo() { diff --git a/Plan/src/main/java/com/djrapitops/plan/data/ServerProfile.java b/Plan/src/main/java/com/djrapitops/plan/data/ServerProfile.java new file mode 100644 index 000000000..dd415fc8d --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/data/ServerProfile.java @@ -0,0 +1,139 @@ +/* + * 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.data; + +import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; + +import java.util.*; +import java.util.stream.Stream; + +/** + * Data class for streamlining Analysis data. + *

+ * Most of the methods are not the most efficient when multiple of them are used. + * + * @author Rsl1122 + */ +public class ServerProfile { + + private final UUID serverUUID; + + // Database information + private List players; + private List tps; + private Map commandUsage; + + // Active information + private int playersOnline; + private int playersMax; + + public ServerProfile(UUID serverUUID) { + this.serverUUID = serverUUID; + players = new ArrayList<>(); + tps = new ArrayList<>(); + commandUsage = new HashMap<>(); + } + + public List getPlayers() { + return players; + } + + public void setPlayers(List players) { + this.players = players; + } + + public List getTps() { + return tps; + } + + public void setTps(List tps) { + this.tps = tps; + } + + public Map getCommandUsage() { + return commandUsage; + } + + public void setCommandUsage(Map commandUsage) { + this.commandUsage = commandUsage; + } + + public double getAverageTPS(long after, long before) { + OptionalDouble average = getTPSData(after, before) + .mapToDouble(TPS::getTicksPerSecond) + .average(); + if (average.isPresent()) { + return average.getAsDouble(); + } + return -1; + } + + public double getAverageCPU(long after, long before) { + OptionalDouble average = getTPSData(after, before) + .mapToDouble(TPS::getCPUUsage) + .filter(num -> num >= 0) + .average(); + if (average.isPresent()) { + return average.getAsDouble(); + } + return -1; + } + + public double getAverageRAM(long after, long before) { + OptionalDouble average = getTPSData(after, before) + .mapToDouble(TPS::getUsedMemory) + .average(); + if (average.isPresent()) { + return average.getAsDouble(); + } + return -1; + } + + public double getAverageEntities(long after, long before) { + OptionalDouble average = getTPSData(after, before) + .mapToDouble(TPS::getEntityCount) + .average(); + if (average.isPresent()) { + return average.getAsDouble(); + } + return -1; + } + + public double getAverageChunks(long after, long before) { + OptionalDouble average = getTPSData(after, before) + .mapToDouble(TPS::getChunksLoaded) + .average(); + if (average.isPresent()) { + return average.getAsDouble(); + } + return -1; + } + + public long getNewPlayers(long after, long before) { + return getPlayersWhoRegistered(after, before).count(); + } + + public long getUniquePlayers(long after, long before) { + return getPlayersWhoPlayedBetween(after, before).count(); + } + + public double getNewPlayersPerDay(long after, long before) { + return getNewPlayers(after, before) * 1.0 / AnalysisUtils.getNumberOfDaysBetween(after, before); + } + + private Stream getPlayersWhoPlayedBetween(long after, long before) { + return players.stream() + .filter(player -> player.playedBetween(after, before)); + } + + public Stream getPlayersWhoRegistered(long after, long before) { + return players.stream() + .filter(player -> player.getRegistered() >= after && player.getRegistered() <= before); + } + + public Stream getTPSData(long after, long before) { + return tps.stream().filter(tps -> tps.getDate() >= after && tps.getDate() <= before); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java index 3193e43f3..1dc67ffdd 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java @@ -1,5 +1,6 @@ package main.java.com.djrapitops.plan.utilities.analysis; +import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.utility.log.Log; import main.java.com.djrapitops.plan.api.IPlan; import main.java.com.djrapitops.plan.data.Session; @@ -218,6 +219,7 @@ public class AnalysisUtils { return total / numberOfDays; } + @Deprecated public static long getNewUsersPerDay(List registers, long scale) { long now = MiscUtils.getTime(); long nowMinusScale = now - scale; @@ -271,17 +273,32 @@ public class AnalysisUtils { }).collect(Collectors.toList()); } - private static int getDayOfYear(Session session) { + public static int getDayOfYear(Session session) { return getDayOfYear(session.getSessionStart()); } - private static int getDayOfYear(long date) { + public static int getDayOfYear(long date) { Calendar day = Calendar.getInstance(); day.setTimeInMillis(date); return day.get(Calendar.DAY_OF_YEAR); } + public double getAveragePerDay(long after, long before, long total) { + return total / getNumberOfDaysBetween(after, before); + } + + public static long getNumberOfDaysBetween(long start, long end) { + long value = 0; + long test = start; + long day = TimeAmount.DAY.ms(); + while (test < end) { + test += day; + value++; + } + return value; + } + @Deprecated public static long getTotalPlaytime(List sessions) { return sessions.stream().mapToLong(Session::getLength).sum();