From 01ce503c77c059210c229932cafea50f299f3b7b Mon Sep 17 00:00:00 2001 From: Aurora Lahtela <24460436+AuroraLS3@users.noreply.github.com> Date: Sat, 27 Jan 2024 13:34:49 +0200 Subject: [PATCH] Add network session placeholders Affects issues: - Close #2267 --- .../plan/placeholder/ServerPlaceHolders.java | 2 + .../plan/placeholder/SessionPlaceHolders.java | 339 +++++++++++++----- .../queries/analysis/PlayerCountQueries.java | 20 ++ .../queries/analysis/TopListQueries.java | 8 +- .../database/queries/objects/PingQueries.java | 8 + .../queries/objects/SessionQueries.java | 10 + 6 files changed, 293 insertions(+), 94 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/placeholder/ServerPlaceHolders.java b/Plan/common/src/main/java/com/djrapitops/plan/placeholder/ServerPlaceHolders.java index 998fa360d..c766be181 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/placeholder/ServerPlaceHolders.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/placeholder/ServerPlaceHolders.java @@ -215,7 +215,9 @@ public class ServerPlaceHolders implements Placeholders { private void registerDynamicCategoryPlaceholders(PlanPlaceholders placeholders, Database database) { List> queries = new ArrayList<>(); queries.addAll(createCategoryQueriesForAllTimespans("playtime", (index, timespan, parameters) -> TopListQueries.fetchNthTop10PlaytimePlayerOn(getServerUUID(parameters), index, System.currentTimeMillis() - timespan, System.currentTimeMillis()))); + queries.addAll(createCategoryQueriesForAllTimespans("network_playtime", (index, timespan, parameters) -> TopListQueries.fetchNthTop10PlaytimePlayerOn(null, index, System.currentTimeMillis() - timespan, System.currentTimeMillis()))); queries.addAll(createCategoryQueriesForAllTimespans("active_playtime", (index, timespan, parameters) -> TopListQueries.fetchNthTop10ActivePlaytimePlayerOn(getServerUUID(parameters), index, System.currentTimeMillis() - timespan, System.currentTimeMillis()))); + queries.addAll(createCategoryQueriesForAllTimespans("network_active_playtime", (index, timespan, parameters) -> TopListQueries.fetchNthTop10ActivePlaytimePlayerOn(null, index, System.currentTimeMillis() - timespan, System.currentTimeMillis()))); queries.addAll(createCategoryQueriesForAllTimespans("player_kills", (index, timespan, parameters) -> TopListQueries.fetchNthTop10PlayerKillCountOn(getServerUUID(parameters), index, System.currentTimeMillis() - timespan, System.currentTimeMillis()))); for (int i = 0; i < 10; i++) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/placeholder/SessionPlaceHolders.java b/Plan/common/src/main/java/com/djrapitops/plan/placeholder/SessionPlaceHolders.java index 0d7d70512..9bd1c672d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/placeholder/SessionPlaceHolders.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/placeholder/SessionPlaceHolders.java @@ -52,6 +52,11 @@ public class SessionPlaceHolders implements Placeholders { private final ServerInfo serverInfo; private final Formatters formatters; + private Formatter timeAmount; + private Formatter year; + private Formatter decimals; + private Database database; + @Inject public SessionPlaceHolders( PlanConfig config, @@ -71,67 +76,149 @@ public class SessionPlaceHolders implements Placeholders { return timeAmount.apply(sessionCount != 0 ? playtime / sessionCount : playtime); } + + private static String getPlaytime(Database database, long after, long before, Formatter timeAmount) { + Long playtime = database.query(SessionQueries.playtime(after, before)); + Long sessionCount = database.query(SessionQueries.sessionCount(after, before)); + return timeAmount.apply(sessionCount != 0 ? playtime / sessionCount : playtime); + } + @Override public void register( PlanPlaceholders placeholders ) { int tzOffsetMs = config.getTimeZone().getOffset(System.currentTimeMillis()); - Formatter timeAmount = formatters.timeAmount(); - Formatter year = formatters.year(); - Formatter decimals = formatters.decimals(); - Database database = dbSystem.getDatabase(); + timeAmount = formatters.timeAmount(); + year = formatters.year(); + decimals = formatters.decimals(); + database = dbSystem.getDatabase(); - placeholders.registerStatic("sessions_play_time_total", - parameters -> timeAmount.apply(database.query(SessionQueries.playtime(0L, now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_play_time_total_raw", - parameters -> database.query(SessionQueries.playtime(0L, now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_play_time_day", - parameters -> timeAmount.apply(database.query(SessionQueries.playtime(dayAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_play_time_day_raw", - parameters -> database.query(SessionQueries.playtime(dayAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_play_time_week", - parameters -> timeAmount.apply(database.query(SessionQueries.playtime(weekAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_play_time_week_raw", - parameters -> database.query(SessionQueries.playtime(weekAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_play_time_month", - parameters -> timeAmount.apply(database.query(SessionQueries.playtime(monthAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_play_time_month_raw", - parameters -> database.query(SessionQueries.playtime(monthAgo(), now(), getServerUUID(parameters)))); + registerServerPlaytime(placeholders); + registerNetworkPlaytime(placeholders); + registerServerActivePlaytime(placeholders); + registerNetworkActivePlaytime(placeholders); + registerServerAfkTime(placeholders); + registerNetworkAfkTime(placeholders); - placeholders.registerStatic("sessions_active_time_total", - parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(0L, now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_active_time_total_raw", - parameters -> database.query(SessionQueries.activePlaytime(0L, now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_active_time_day", - parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(dayAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_active_time_day_raw", - parameters -> database.query(SessionQueries.activePlaytime(dayAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_active_time_week", - parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(weekAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_active_time_week_raw", - parameters -> database.query(SessionQueries.activePlaytime(weekAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_active_time_month", - parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(monthAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_active_time_month_raw", - parameters -> database.query(SessionQueries.activePlaytime(monthAgo(), now(), getServerUUID(parameters)))); + registerServerPve(placeholders); + registerSessionLength(placeholders); - placeholders.registerStatic("sessions_afk_time_total", - parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(0L, now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_afk_time_total_raw", - parameters -> database.query(SessionQueries.afkTime(0L, now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_afk_time_day", - parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(dayAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_afk_time_day_raw", - parameters -> database.query(SessionQueries.afkTime(dayAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_afk_time_week", - parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(weekAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_afk_time_week_raw", - parameters -> database.query(SessionQueries.afkTime(weekAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_afk_time_month", - parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(monthAgo(), now(), getServerUUID(parameters))))); - placeholders.registerStatic("sessions_afk_time_month_raw", - parameters -> database.query(SessionQueries.afkTime(monthAgo(), now(), getServerUUID(parameters)))); + registerServerUniquePlayers(placeholders); + registerNetworkUniquePlayers(placeholders); + registerAverageUniquePlayer(placeholders, tzOffsetMs); + registerNewPlayer(placeholders); + registerPing(placeholders); + registerServerPeakCounts(placeholders); + } + + private void registerServerPeakCounts(PlanPlaceholders placeholders) { + placeholders.registerStatic("sessions_peak_count", + parameters -> database.query(TPSQueries.fetchAllTimePeakPlayerCount(getServerUUID(parameters))).map(DateObj::getValue).orElse(0)); + placeholders.registerStatic("sessions_peak_date", + parameters -> database.query(TPSQueries.fetchAllTimePeakPlayerCount(getServerUUID(parameters))).map(year).orElse("-")); + placeholders.registerStatic("sessions_recent_peak_count", + parameters -> database.query(TPSQueries.fetchPeakPlayerCount(getServerUUID(parameters), now() - TimeUnit.DAYS.toMillis(2L))).map(DateObj::getValue).orElse(0)); + placeholders.registerStatic("sessions_recent_peak_date", + parameters -> database.query(TPSQueries.fetchPeakPlayerCount(getServerUUID(parameters), now() - TimeUnit.DAYS.toMillis(2L))).map(year).orElse("-")); + } + + private void registerPing(PlanPlaceholders placeholders) { + placeholders.registerStatic("ping_total", + parameters -> decimals.apply(database.query(PingQueries.averagePing(0L, now(), getServerUUID(parameters)))) + " ms"); + placeholders.registerStatic("ping_day", + parameters -> decimals.apply(database.query(PingQueries.averagePing(dayAgo(), now(), getServerUUID(parameters)))) + " ms"); + placeholders.registerStatic("ping_week", + parameters -> decimals.apply(database.query(PingQueries.averagePing(weekAgo(), now(), getServerUUID(parameters)))) + " ms"); + placeholders.registerStatic("ping_month", + parameters -> decimals.apply(database.query(PingQueries.averagePing(monthAgo(), now(), getServerUUID(parameters)))) + " ms"); + + placeholders.registerStatic("network_ping_total", + parameters -> decimals.apply(database.query(PingQueries.averagePing(0L, now()))) + " ms"); + placeholders.registerStatic("network_ping_day", + parameters -> decimals.apply(database.query(PingQueries.averagePing(dayAgo(), now()))) + " ms"); + placeholders.registerStatic("network_ping_week", + parameters -> decimals.apply(database.query(PingQueries.averagePing(weekAgo(), now()))) + " ms"); + placeholders.registerStatic("network_ping_month", + parameters -> decimals.apply(database.query(PingQueries.averagePing(monthAgo(), now()))) + " ms"); + } + + private void registerNewPlayer(PlanPlaceholders placeholders) { + placeholders.registerStatic("sessions_new_players_day", + parameters -> database.query(PlayerCountQueries.newPlayerCount(dayAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_new_players_week", + parameters -> database.query(PlayerCountQueries.newPlayerCount(weekAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_new_players_month", + parameters -> database.query(PlayerCountQueries.newPlayerCount(monthAgo(), now(), getServerUUID(parameters)))); + + placeholders.registerStatic("network_sessions_new_players_day", + parameters -> database.query(PlayerCountQueries.newPlayerCount(dayAgo(), now()))); + placeholders.registerStatic("network_sessions_new_players_week", + parameters -> database.query(PlayerCountQueries.newPlayerCount(weekAgo(), now()))); + placeholders.registerStatic("network_sessions_new_players_month", + parameters -> database.query(PlayerCountQueries.newPlayerCount(monthAgo(), now()))); + } + + private void registerAverageUniquePlayer(PlanPlaceholders placeholders, int tzOffsetMs) { + placeholders.registerStatic("sessions_average_unique_players_total", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(0L, now(), tzOffsetMs, getServerUUID(parameters)))); + placeholders.registerStatic("sessions_average_unique_players_day", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(dayAgo(), now(), tzOffsetMs, getServerUUID(parameters)))); + placeholders.registerStatic("sessions_average_unique_players_week", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(weekAgo(), now(), tzOffsetMs, getServerUUID(parameters)))); + placeholders.registerStatic("sessions_average_unique_players_month", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(monthAgo(), now(), tzOffsetMs, getServerUUID(parameters)))); + + + placeholders.registerStatic("network_sessions_average_unique_players_total", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(0L, now(), tzOffsetMs))); + placeholders.registerStatic("network_sessions_average_unique_players_day", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(dayAgo(), now(), tzOffsetMs))); + placeholders.registerStatic("network_sessions_average_unique_players_week", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(weekAgo(), now(), tzOffsetMs))); + placeholders.registerStatic("network_sessions_average_unique_players_month", + parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(monthAgo(), now(), tzOffsetMs))); + } + + private void registerSessionLength(PlanPlaceholders placeholders) { + placeholders.registerStatic("sessions_average_session_length_total", + parameters -> getPlaytime(database, 0L, now(), getServerUUID(parameters), timeAmount)); + placeholders.registerStatic("sessions_average_session_length_day", + parameters -> getPlaytime(database, dayAgo(), now(), getServerUUID(parameters), timeAmount)); + placeholders.registerStatic("sessions_average_session_length_week", + parameters -> getPlaytime(database, weekAgo(), now(), getServerUUID(parameters), timeAmount)); + placeholders.registerStatic("sessions_average_session_length_month", + parameters -> getPlaytime(database, monthAgo(), now(), getServerUUID(parameters), timeAmount)); + + placeholders.registerStatic("network_sessions_average_session_length_total", + parameters -> getPlaytime(database, 0L, now(), timeAmount)); + placeholders.registerStatic("network_sessions_average_session_length_day", + parameters -> getPlaytime(database, dayAgo(), now(), timeAmount)); + placeholders.registerStatic("network_sessions_average_session_length_week", + parameters -> getPlaytime(database, weekAgo(), now(), timeAmount)); + placeholders.registerStatic("network_sessions_average_session_length_month", + parameters -> getPlaytime(database, monthAgo(), now(), timeAmount)); + } + + private void registerNetworkUniquePlayers(PlanPlaceholders placeholders) { + PlanPlaceholders.StaticPlaceholderLoader networkUniquePlayers = parameters -> database.query(PlayerCountQueries.newPlayerCount(0L, now())); + placeholders.registerStatic("network_sessions_unique_players_total", networkUniquePlayers); + placeholders.registerStatic("network_sessions_new_players_total", networkUniquePlayers); + + placeholders.registerStatic("network_sessions_unique_players_day", + parameters -> database.query(PlayerCountQueries.uniquePlayerCount(dayAgo(), now()))); + placeholders.registerStatic("network_sessions_unique_players_today", + parameters -> { + NavigableMap playerCounts = database.query(PlayerCountQueries.uniquePlayerCounts(dayAgo(), now(), config.getTimeZone().getOffset(now()))); + return playerCounts.isEmpty() ? 0 : playerCounts.lastEntry().getValue(); + }); + placeholders.registerStatic("network_sessions_unique_players_week", + parameters -> database.query(PlayerCountQueries.uniquePlayerCount(weekAgo(), now()))); + placeholders.registerStatic("network_sessions_unique_players_month", + parameters -> database.query(PlayerCountQueries.uniquePlayerCount(monthAgo(), now()))); + } + + private void registerServerUniquePlayers(PlanPlaceholders placeholders) { PlanPlaceholders.StaticPlaceholderLoader uniquePlayers = parameters -> database.query(PlayerCountQueries.newPlayerCount(0L, now(), getServerUUID(parameters))); placeholders.registerStatic("sessions_unique_players_total", uniquePlayers); placeholders.registerStatic("sessions_new_players_total", uniquePlayers); @@ -147,7 +234,9 @@ public class SessionPlaceHolders implements Placeholders { parameters -> database.query(PlayerCountQueries.uniquePlayerCount(weekAgo(), now(), getServerUUID(parameters)))); placeholders.registerStatic("sessions_unique_players_month", parameters -> database.query(PlayerCountQueries.uniquePlayerCount(monthAgo(), now(), getServerUUID(parameters)))); + } + private void registerServerPve(PlanPlaceholders placeholders) { placeholders.registerStatic("sessions_players_death_total", parameters -> database.query(KillQueries.deathCount(0L, now(), getServerUUID(parameters)))); placeholders.registerStatic("sessions_players_death_day", @@ -174,50 +263,120 @@ public class SessionPlaceHolders implements Placeholders { parameters -> database.query(KillQueries.mobKillCount(weekAgo(), now(), getServerUUID(parameters)))); placeholders.registerStatic("sessions_mob_kill_month", parameters -> database.query(KillQueries.mobKillCount(monthAgo(), now(), getServerUUID(parameters)))); + } - placeholders.registerStatic("sessions_average_session_length_total", - parameters -> getPlaytime(database, 0L, now(), getServerUUID(parameters), timeAmount)); - placeholders.registerStatic("sessions_average_session_length_day", - parameters -> getPlaytime(database, dayAgo(), now(), getServerUUID(parameters), timeAmount)); - placeholders.registerStatic("sessions_average_session_length_week", - parameters -> getPlaytime(database, weekAgo(), now(), getServerUUID(parameters), timeAmount)); - placeholders.registerStatic("sessions_average_session_length_month", - parameters -> getPlaytime(database, monthAgo(), now(), getServerUUID(parameters), timeAmount)); + private void registerNetworkAfkTime(PlanPlaceholders placeholders) { + placeholders.registerStatic("network_sessions_afk_time_total", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(0L, now())))); + placeholders.registerStatic("network_sessions_afk_time_total_raw", + parameters -> database.query(SessionQueries.afkTime(0L, now()))); + placeholders.registerStatic("network_sessions_afk_time_day", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(dayAgo(), now())))); + placeholders.registerStatic("network_sessions_afk_time_day_raw", + parameters -> database.query(SessionQueries.afkTime(dayAgo(), now()))); + placeholders.registerStatic("network_sessions_afk_time_week", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(weekAgo(), now())))); + placeholders.registerStatic("network_sessions_afk_time_week_raw", + parameters -> database.query(SessionQueries.afkTime(weekAgo(), now()))); + placeholders.registerStatic("network_sessions_afk_time_month", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(monthAgo(), now())))); + placeholders.registerStatic("network_sessions_afk_time_month_raw", + parameters -> database.query(SessionQueries.afkTime(monthAgo(), now()))); + } - placeholders.registerStatic("sessions_average_unique_players_total", - parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(0L, now(), tzOffsetMs, getServerUUID(parameters)))); - placeholders.registerStatic("sessions_average_unique_players_day", - parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(dayAgo(), now(), tzOffsetMs, getServerUUID(parameters)))); - placeholders.registerStatic("sessions_average_unique_players_week", - parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(weekAgo(), now(), tzOffsetMs, getServerUUID(parameters)))); - placeholders.registerStatic("sessions_average_unique_players_month", - parameters -> database.query(PlayerCountQueries.averageUniquePlayerCount(monthAgo(), now(), tzOffsetMs, getServerUUID(parameters)))); + private void registerServerAfkTime(PlanPlaceholders placeholders) { + placeholders.registerStatic("sessions_afk_time_total", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(0L, now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_afk_time_total_raw", + parameters -> database.query(SessionQueries.afkTime(0L, now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_afk_time_day", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(dayAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_afk_time_day_raw", + parameters -> database.query(SessionQueries.afkTime(dayAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_afk_time_week", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(weekAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_afk_time_week_raw", + parameters -> database.query(SessionQueries.afkTime(weekAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_afk_time_month", + parameters -> timeAmount.apply(database.query(SessionQueries.afkTime(monthAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_afk_time_month_raw", + parameters -> database.query(SessionQueries.afkTime(monthAgo(), now(), getServerUUID(parameters)))); + } - placeholders.registerStatic("sessions_new_players_day", - parameters -> database.query(PlayerCountQueries.newPlayerCount(dayAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_new_players_week", - parameters -> database.query(PlayerCountQueries.newPlayerCount(weekAgo(), now(), getServerUUID(parameters)))); - placeholders.registerStatic("sessions_new_players_month", - parameters -> database.query(PlayerCountQueries.newPlayerCount(monthAgo(), now(), getServerUUID(parameters)))); + private void registerNetworkActivePlaytime(PlanPlaceholders placeholders) { + placeholders.registerStatic("network_sessions_active_time_total", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(0L, now())))); + placeholders.registerStatic("network_sessions_active_time_total_raw", + parameters -> database.query(SessionQueries.activePlaytime(0L, now()))); + placeholders.registerStatic("network_sessions_active_time_day", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(dayAgo(), now())))); + placeholders.registerStatic("network_sessions_active_time_day_raw", + parameters -> database.query(SessionQueries.activePlaytime(dayAgo(), now()))); + placeholders.registerStatic("network_sessions_active_time_week", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(weekAgo(), now())))); + placeholders.registerStatic("network_sessions_active_time_week_raw", + parameters -> database.query(SessionQueries.activePlaytime(weekAgo(), now()))); + placeholders.registerStatic("network_sessions_active_time_month", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(monthAgo(), now())))); + placeholders.registerStatic("network_sessions_active_time_month_raw", + parameters -> database.query(SessionQueries.activePlaytime(monthAgo(), now()))); + } - placeholders.registerStatic("ping_total", - parameters -> decimals.apply(database.query(PingQueries.averagePing(0L, now(), getServerUUID(parameters)))) + " ms"); - placeholders.registerStatic("ping_day", - parameters -> decimals.apply(database.query(PingQueries.averagePing(dayAgo(), now(), getServerUUID(parameters)))) + " ms"); - placeholders.registerStatic("ping_week", - parameters -> decimals.apply(database.query(PingQueries.averagePing(weekAgo(), now(), getServerUUID(parameters)))) + " ms"); - placeholders.registerStatic("ping_month", - parameters -> decimals.apply(database.query(PingQueries.averagePing(monthAgo(), now(), getServerUUID(parameters)))) + " ms"); + private void registerServerActivePlaytime(PlanPlaceholders placeholders) { + placeholders.registerStatic("sessions_active_time_total", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(0L, now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_active_time_total_raw", + parameters -> database.query(SessionQueries.activePlaytime(0L, now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_active_time_day", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(dayAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_active_time_day_raw", + parameters -> database.query(SessionQueries.activePlaytime(dayAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_active_time_week", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(weekAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_active_time_week_raw", + parameters -> database.query(SessionQueries.activePlaytime(weekAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_active_time_month", + parameters -> timeAmount.apply(database.query(SessionQueries.activePlaytime(monthAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_active_time_month_raw", + parameters -> database.query(SessionQueries.activePlaytime(monthAgo(), now(), getServerUUID(parameters)))); + } - placeholders.registerStatic("sessions_peak_count", - parameters -> database.query(TPSQueries.fetchAllTimePeakPlayerCount(getServerUUID(parameters))).map(DateObj::getValue).orElse(0)); - placeholders.registerStatic("sessions_peak_date", - parameters -> database.query(TPSQueries.fetchAllTimePeakPlayerCount(getServerUUID(parameters))).map(year).orElse("-")); + private void registerNetworkPlaytime(PlanPlaceholders placeholders) { + placeholders.registerStatic("network_sessions_play_time_total", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(0L, now())))); + placeholders.registerStatic("network_sessions_play_time_total_raw", + parameters -> database.query(SessionQueries.playtime(0L, now()))); + placeholders.registerStatic("network_sessions_play_time_day", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(dayAgo(), now())))); + placeholders.registerStatic("network_sessions_play_time_day_raw", + parameters -> database.query(SessionQueries.playtime(dayAgo(), now()))); + placeholders.registerStatic("network_sessions_play_time_week", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(weekAgo(), now())))); + placeholders.registerStatic("network_sessions_play_time_week_raw", + parameters -> database.query(SessionQueries.playtime(weekAgo(), now()))); + placeholders.registerStatic("network_sessions_play_time_month", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(monthAgo(), now())))); + placeholders.registerStatic("network_sessions_play_time_month_raw", + parameters -> database.query(SessionQueries.playtime(monthAgo(), now()))); + } - placeholders.registerStatic("sessions_recent_peak_count", - parameters -> database.query(TPSQueries.fetchPeakPlayerCount(getServerUUID(parameters), now() - TimeUnit.DAYS.toMillis(2L))).map(DateObj::getValue).orElse(0)); - placeholders.registerStatic("sessions_recent_peak_date", - parameters -> database.query(TPSQueries.fetchPeakPlayerCount(getServerUUID(parameters), now() - TimeUnit.DAYS.toMillis(2L))).map(year).orElse("-")); + private void registerServerPlaytime(PlanPlaceholders placeholders) { + placeholders.registerStatic("sessions_play_time_total", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(0L, now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_play_time_total_raw", + parameters -> database.query(SessionQueries.playtime(0L, now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_play_time_day", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(dayAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_play_time_day_raw", + parameters -> database.query(SessionQueries.playtime(dayAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_play_time_week", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(weekAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_play_time_week_raw", + parameters -> database.query(SessionQueries.playtime(weekAgo(), now(), getServerUUID(parameters)))); + placeholders.registerStatic("sessions_play_time_month", + parameters -> timeAmount.apply(database.query(SessionQueries.playtime(monthAgo(), now(), getServerUUID(parameters))))); + placeholders.registerStatic("sessions_play_time_month_raw", + parameters -> database.query(SessionQueries.playtime(monthAgo(), now(), getServerUUID(parameters)))); } private ServerUUID getServerUUID(@Untrusted Arguments parameters) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/PlayerCountQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/PlayerCountQueries.java index bcf6ef8e8..a47789683 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/PlayerCountQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/PlayerCountQueries.java @@ -225,6 +225,26 @@ public class PlayerCountQueries { }; } + public static Query averageUniquePlayerCount(long after, long before, long timeZoneOffset) { + return database -> { + Sql sql = database.getSql(); + String selectUniquePlayersPerDay = SELECT + + sql.dateToEpochSecond(sql.dateToDayStamp(sql.epochSecondToDate('(' + SessionsTable.SESSION_START + "+?)/1000"))) + + "*1000 as date," + + "COUNT(DISTINCT " + SessionsTable.USER_ID + ") as " + PLAYER_COUNT + + FROM + SessionsTable.TABLE_NAME + + WHERE + SessionsTable.SESSION_END + "<=?" + + AND + SessionsTable.SESSION_START + ">=?" + + GROUP_BY + "date"; + String selectAverage = SELECT + "AVG(" + PLAYER_COUNT + ") as average" + FROM + '(' + selectUniquePlayersPerDay + ") q1"; + + return database.queryOptional(selectAverage, + set -> (int) set.getDouble("average"), + timeZoneOffset, before, after) + .orElse(0); + }; + } + public static Query newPlayerCount(long after, long before, ServerUUID serverUUID) { String sql = SELECT + "COUNT(1) as " + PLAYER_COUNT + FROM + UserInfoTable.TABLE_NAME + diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/TopListQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/TopListQueries.java index 0125302df..5aff9d62b 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/TopListQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/analysis/TopListQueries.java @@ -40,7 +40,7 @@ public class TopListQueries { "SUM(" + SessionsTable.SESSION_END + '-' + SessionsTable.SESSION_START + ") as playtime" + FROM + SessionsTable.TABLE_NAME + " s" + INNER_JOIN + UsersTable.TABLE_NAME + " u on u." + UsersTable.ID + "=s." + SessionsTable.USER_ID + - WHERE + SessionsTable.SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID + + WHERE + "(? IS NULL OR " + SessionsTable.SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID + ')' + AND + SessionsTable.SESSION_START + ">?" + AND + SessionsTable.SESSION_END + " db.queryOptional(sql, set -> new TopListEntry<>(set.getString(UsersTable.USER_NAME), set.getLong("playtime")), - serverUUID, after, before, n); + serverUUID, serverUUID, after, before, n); } public static Query>> fetchNthTop10ActivePlaytimePlayerOn(ServerUUID serverUUID, int n, long after, long before) { @@ -58,7 +58,7 @@ public class TopListQueries { "SUM(" + SessionsTable.SESSION_END + '-' + SessionsTable.SESSION_START + '-' + SessionsTable.AFK_TIME + ") as active_playtime" + FROM + SessionsTable.TABLE_NAME + " s" + INNER_JOIN + UsersTable.TABLE_NAME + " u on u." + UsersTable.ID + "=s." + SessionsTable.USER_ID + - WHERE + SessionsTable.SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID + + WHERE + "(? IS NULL OR " + SessionsTable.SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID + ')' + AND + SessionsTable.SESSION_START + ">?" + AND + SessionsTable.SESSION_END + " db.queryOptional(sql, set -> new TopListEntry<>(set.getString(UsersTable.USER_NAME), set.getLong("active_playtime")), - serverUUID, after, before, n); + serverUUID, serverUUID, after, before, n); } public static Query>> fetchNthTop10PlayerKillCountOn(ServerUUID serverUUID, int n, long after, long before) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/PingQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/PingQueries.java index 304596e0f..573c48802 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/PingQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/PingQueries.java @@ -260,4 +260,12 @@ public class PingQueries { } }; } + + public static Query averagePing(long after, long before) { + String sql = SELECT + "AVG(" + PingTable.AVG_PING + ") as average" + FROM + PingTable.TABLE_NAME + + WHERE + PingTable.SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID + + AND + PingTable.DATE + ">=?" + + AND + PingTable.DATE + "<=?"; + return db -> db.queryOptional(sql, set -> set.getDouble("average"), after, before).orElse(-1.0); + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java index fcc57b395..f3be93eb2 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/SessionQueries.java @@ -917,6 +917,16 @@ public class SessionQueries { }; } + public static Query activePlaytime(long after, long before) { + String sql = SELECT + "SUM(" + SessionsTable.SESSION_END + '-' + SessionsTable.SESSION_START + '-' + SessionsTable.AFK_TIME + + ") as playtime" + + FROM + SessionsTable.TABLE_NAME + + WHERE + SessionsTable.SESSION_END + ">=?" + + AND + SessionsTable.SESSION_START + "<=?"; + return db -> db.queryOptional(sql, set -> set.getLong("playtime"), after, before) + .orElse(0L); + } + public static Query> userIdsOfPlayedBetween(long after, long before, List serverUUIDs) { String selectServerIds = SELECT + ServerTable.ID + FROM + ServerTable.TABLE_NAME +