From 59d1fdb085131f6a28e7998ac0f9e923a9ace5c0 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Mon, 26 Aug 2019 11:10:11 +0300 Subject: [PATCH] Online sessions to Most recent sessions + fix sorting --- .../data/store/mutators/SessionsMutator.java | 5 ++ .../queries/objects/SessionQueries.java | 2 + .../events/PlayerRegisterTransaction.java | 5 +- .../plan/system/json/JSONFactory.java | 46 +++++++++++++++---- .../pages/json/SessionsJSONHandler.java | 4 +- 5 files changed, 50 insertions(+), 12 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/data/store/mutators/SessionsMutator.java b/Plan/common/src/main/java/com/djrapitops/plan/data/store/mutators/SessionsMutator.java index 281a565e7..09a56aece 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/data/store/mutators/SessionsMutator.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/data/store/mutators/SessionsMutator.java @@ -57,6 +57,11 @@ public class SessionsMutator { return sessions; } + public SessionsMutator sort(Comparator sessionComparator) { + sessions.sort(sessionComparator); + return this; + } + public SessionsMutator filterBy(Predicate predicate) { return new SessionsMutator(sessions.stream() .filter(predicate) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/objects/SessionQueries.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/objects/SessionQueries.java index 4619f5556..fd65d0836 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/objects/SessionQueries.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/queries/objects/SessionQueries.java @@ -29,6 +29,7 @@ import com.djrapitops.plan.db.access.QueryStatement; import com.djrapitops.plan.db.sql.parsing.Sql; import com.djrapitops.plan.db.sql.tables.*; import com.djrapitops.plan.utilities.comparators.DateHolderRecentComparator; +import com.djrapitops.plan.utilities.comparators.SessionStartComparator; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -262,6 +263,7 @@ public class SessionQueries { .flatMap(Collection::stream) .map(SortedMap::values) .flatMap(Collection::stream) + .sorted(new SessionStartComparator()) // Disorder arises .collect(Collectors.toList()); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/PlayerRegisterTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/PlayerRegisterTransaction.java index 320e7da61..a50e9d85a 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/PlayerRegisterTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/PlayerRegisterTransaction.java @@ -19,6 +19,7 @@ package com.djrapitops.plan.db.access.transactions.events; import com.djrapitops.plan.db.access.queries.DataStoreQueries; import com.djrapitops.plan.db.access.queries.PlayerFetchQueries; import com.djrapitops.plan.db.access.transactions.Transaction; +import com.djrapitops.plan.system.cache.SessionCache; import java.util.UUID; import java.util.function.LongSupplier; @@ -48,7 +49,9 @@ public class PlayerRegisterTransaction extends Transaction { @Override protected void performOperations() { if (!query(PlayerFetchQueries.isPlayerRegistered(playerUUID))) { - execute(DataStoreQueries.registerBaseUser(playerUUID, registered.getAsLong(), playerName)); + long registerDate = registered.getAsLong(); + execute(DataStoreQueries.registerBaseUser(playerUUID, registerDate, playerName)); + SessionCache.getCachedSession(playerUUID).ifPresent(session -> session.setAsFirstSessionIfMatches(registerDate)); } execute(DataStoreQueries.updatePlayerName(playerUUID, playerName)); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/json/JSONFactory.java b/Plan/common/src/main/java/com/djrapitops/plan/system/json/JSONFactory.java index d8b52f3c6..df93f5de8 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/json/JSONFactory.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/json/JSONFactory.java @@ -30,11 +30,14 @@ import com.djrapitops.plan.db.access.queries.containers.AllPlayerContainersQuery import com.djrapitops.plan.db.access.queries.containers.ServerPlayersTableContainersQuery; import com.djrapitops.plan.db.access.queries.objects.*; import com.djrapitops.plan.extension.implementation.storage.queries.ExtensionServerPlayerDataTableQuery; +import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.database.DBSystem; import com.djrapitops.plan.system.info.server.Server; +import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.paths.DisplaySettings; import com.djrapitops.plan.system.settings.paths.TimeSettings; +import com.djrapitops.plan.utilities.comparators.SessionStartComparator; import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.utilities.html.graphs.Graphs; @@ -54,6 +57,7 @@ public class JSONFactory { private final PlanConfig config; private final DBSystem dbSystem; + private final ServerInfo serverInfo; private final Graphs graphs; private final Formatters formatters; @@ -61,11 +65,13 @@ public class JSONFactory { public JSONFactory( PlanConfig config, DBSystem dbSystem, + ServerInfo serverInfo, Graphs graphs, Formatters formatters ) { this.config = config; this.dbSystem = dbSystem; + this.serverInfo = serverInfo; this.graphs = graphs; this.formatters = formatters; } @@ -100,21 +106,43 @@ public class JSONFactory { ).toJSONString(); } - public List> serverSessionsAsJSONMap(UUID serverUUID) { + public List> networkSessionsAsJSONMap(UUID serverUUID) { Database db = dbSystem.getDatabase(); - List sessions = db.query(SessionQueries.fetchLatestSessionsOfServer( - serverUUID, config.get(DisplaySettings.SESSIONS_PER_PAGE) - )); + + Integer perPageLimit = config.get(DisplaySettings.SESSIONS_PER_PAGE); + List sessions = db.query(SessionQueries.fetchLatestSessionsOfServer(serverUUID, perPageLimit)); + // Add online sessions + if (serverUUID.equals(serverInfo.getServerUUID())) { + sessions.addAll(SessionCache.getActiveSessions().values()); + sessions.sort(new SessionStartComparator()); + while (true) { + int size = sessions.size(); + if (size <= perPageLimit) break; + sessions.remove(size - 1); // Remove last until it fits. + } + } + return new SessionsMutator(sessions).toPlayerNameJSONMaps(graphs, config.getWorldAliasSettings(), formatters); } - public List> serverSessionsAsJSONMap() { + public List> networkSessionsAsJSONMap() { Database db = dbSystem.getDatabase(); - List sessions = db.query(SessionQueries.fetchLatestSessions( - config.get(DisplaySettings.SESSIONS_PER_PAGE) - )); + Integer perPageLimit = config.get(DisplaySettings.SESSIONS_PER_PAGE); + + List sessions = db.query(SessionQueries.fetchLatestSessions(perPageLimit)); + // Add online sessions + if (serverInfo.getServer().isProxy()) { + sessions.addAll(SessionCache.getActiveSessions().values()); + sessions.sort(new SessionStartComparator()); + while (true) { + int size = sessions.size(); + if (size <= perPageLimit) break; + sessions.remove(size - 1); // Remove last until it fits. + } + } + List> sessionMaps = new SessionsMutator(sessions).toPlayerNameJSONMaps(graphs, config.getWorldAliasSettings(), formatters); - // + // Add network_server property so that sessions have a server page link sessionMaps.forEach(map -> map.put("network_server", map.get("server_name"))); return sessionMaps; } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/SessionsJSONHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/SessionsJSONHandler.java index 059154cac..cc15f860d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/SessionsJSONHandler.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/webserver/pages/json/SessionsJSONHandler.java @@ -56,10 +56,10 @@ public class SessionsJSONHandler implements PageHandler { public Response getResponse(Request request, RequestTarget target) throws WebException { if (target.getParameter("server").isPresent()) { UUID serverUUID = identifiers.getServerUUID(target); - return new JSONResponse(Collections.singletonMap("sessions", jsonFactory.serverSessionsAsJSONMap(serverUUID))); + return new JSONResponse(Collections.singletonMap("sessions", jsonFactory.networkSessionsAsJSONMap(serverUUID))); } // Assume network - return new JSONResponse(Collections.singletonMap("sessions", jsonFactory.serverSessionsAsJSONMap())); + return new JSONResponse(Collections.singletonMap("sessions", jsonFactory.networkSessionsAsJSONMap())); } @Override