Skip to content

Commit 965669e

Browse files
committed
Fix flipped date recency check in network_players_online placeholder
Affects issues: - Fixed #4163
1 parent 64ac860 commit 965669e

11 files changed

Lines changed: 118 additions & 52 deletions

File tree

Plan/common/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ dependencies {
105105
testImplementation "org.testcontainers:testcontainers:$testContainersVersion"
106106
testImplementation "org.testcontainers:junit-jupiter:$testContainersVersion"
107107
testImplementation "org.testcontainers:nginx:$testContainersVersion"
108-
testImplementation "org.awaitility:awaitility:$awaitilityVersion"
108+
testFixturesApi "org.awaitility:awaitility:$awaitilityVersion"
109109
testFixturesApi "com.google.guava:guava:$guavaVersion"
110110

111111
testFixturesApi "org.xerial:sqlite-jdbc:$sqliteVersion" // SQLite

Plan/common/src/main/java/com/djrapitops/plan/placeholder/ServerPlaceHolders.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@
4040

4141
import javax.inject.Inject;
4242
import javax.inject.Singleton;
43-
import java.util.ArrayList;
44-
import java.util.Arrays;
45-
import java.util.List;
46-
import java.util.Optional;
43+
import java.util.*;
4744
import java.util.concurrent.TimeUnit;
4845
import java.util.function.Function;
4946

@@ -89,12 +86,14 @@ public void register(
8986
placeholders.registerStatic("network_players_online",
9087
parameters -> {
9188
DateObj<Long> count = new DateObj<>(System.currentTimeMillis(), 0L);
92-
for (Server proxy : database.query(ServerQueries.fetchProxyServers())) {
93-
ServerUUID proxyUUID = proxy.getUuid();
94-
new DateObjMutator<>(database.query(TPSQueries.fetchPlayersOnlineOfServer(fiveMinAgo(), now(), proxyUUID)))
89+
Collection<ServerUUID> servers = database.query(ServerQueries.fetchProxyServerUUIDs());
90+
if (servers.isEmpty()) servers = database.query(ServerQueries.fetchServerNamesToUUIDs()).values();
91+
for (ServerUUID serverUUID : servers) {
92+
List<DateObj<Integer>> data = database.query(TPSQueries.fetchPlayersOnlineOfServer(fiveMinAgo(), now(), serverUUID));
93+
new DateObjMutator<>(data)
9594
.mostRecent()
9695
.ifPresent(playersOnline -> {
97-
if (Math.abs(count.getDate() - playersOnline.getDate()) > TimeUnit.MINUTES.toMillis(2L)) {
96+
if (Math.abs(count.getDate() - playersOnline.getDate()) < TimeUnit.MINUTES.toMillis(2L)) {
9897
count.setValue(count.getValue() + playersOnline.getValue());
9998
}
10099
});

Plan/common/src/main/java/com/djrapitops/plan/storage/database/Database.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ default Sql getSql() {
141141

142142
State getState();
143143

144+
int getTransactionQueueSize();
145+
144146
/**
145147
* Possible State changes:
146148
* CLOSED to PATCHING (Database init),

Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLDB.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ public boolean shouldDropUnimportantTransactions() {
473473
return dropUnimportantTransactions.get();
474474
}
475475

476+
@Override
476477
public int getTransactionQueueSize() {
477478
return transactionQueueSize.get();
478479
}

Plan/common/src/main/java/com/djrapitops/plan/storage/database/queries/objects/ServerQueries.java

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.djrapitops.plan.utilities.dev.Untrusted;
2727
import com.djrapitops.plan.utilities.java.Maps;
2828
import org.apache.commons.lang3.math.NumberUtils;
29+
import org.jetbrains.annotations.NotNull;
2930

3031
import java.sql.PreparedStatement;
3132
import java.sql.ResultSet;
@@ -58,13 +59,7 @@ public void prepare(PreparedStatement statement) throws SQLException {
5859
public Collection<Server> processResults(ResultSet set) throws SQLException {
5960
Collection<Server> servers = new HashSet<>();
6061
while (set.next()) {
61-
servers.add(new Server(
62-
set.getInt(ServerTable.ID),
63-
ServerUUID.fromString(set.getString(ServerTable.SERVER_UUID)),
64-
set.getString(ServerTable.NAME),
65-
set.getString(ServerTable.WEB_ADDRESS),
66-
set.getBoolean(ServerTable.PROXY),
67-
set.getString(ServerTable.PLAN_VERSION)));
62+
servers.add(extractServer(set));
6863
}
6964
return servers;
7065
}
@@ -133,13 +128,7 @@ public void prepare(PreparedStatement statement) throws SQLException {
133128
@Override
134129
public Optional<Server> processResults(ResultSet set) throws SQLException {
135130
if (set.next()) {
136-
return Optional.of(new Server(
137-
set.getInt(ServerTable.ID),
138-
ServerUUID.fromString(set.getString(ServerTable.SERVER_UUID)),
139-
set.getString(ServerTable.NAME),
140-
set.getString(ServerTable.WEB_ADDRESS),
141-
set.getBoolean(ServerTable.PROXY),
142-
set.getString(ServerTable.PLAN_VERSION)));
131+
return Optional.of(extractServer(set));
143132
}
144133
return Optional.empty();
145134
}
@@ -150,15 +139,23 @@ public static Query<List<Server>> fetchProxyServers() {
150139
String sql = SELECT + '*' + FROM + ServerTable.TABLE_NAME +
151140
WHERE + ServerTable.INSTALLED + "=?" +
152141
AND + ServerTable.PROXY + "=?";
153-
return db -> db.queryList(sql, set ->
154-
new Server(
155-
set.getInt(ServerTable.ID),
156-
ServerUUID.fromString(set.getString(ServerTable.SERVER_UUID)),
157-
set.getString(ServerTable.NAME),
158-
set.getString(ServerTable.WEB_ADDRESS),
159-
set.getBoolean(ServerTable.PROXY),
160-
set.getString(ServerTable.PLAN_VERSION)
161-
), true, true
142+
return db -> db.queryList(sql, ServerQueries::extractServer, true, true);
143+
}
144+
145+
public static Query<List<Server>> fetchAllServers() {
146+
String sql = SELECT + '*' + FROM + ServerTable.TABLE_NAME +
147+
WHERE + ServerTable.INSTALLED + "=?";
148+
return db -> db.queryList(sql, ServerQueries::extractServer, true, true);
149+
}
150+
151+
private static @NotNull Server extractServer(ResultSet set) throws SQLException {
152+
return new Server(
153+
set.getInt(ServerTable.ID),
154+
ServerUUID.fromString(set.getString(ServerTable.SERVER_UUID)),
155+
set.getString(ServerTable.NAME),
156+
set.getString(ServerTable.WEB_ADDRESS),
157+
set.getBoolean(ServerTable.PROXY),
158+
set.getString(ServerTable.PLAN_VERSION)
162159
);
163160
}
164161

@@ -234,13 +231,7 @@ public void prepare(PreparedStatement statement) throws SQLException {
234231
public List<Server> processResults(ResultSet set) throws SQLException {
235232
List<Server> matches = new ArrayList<>();
236233
while (set.next()) {
237-
matches.add(new Server(
238-
set.getInt(ServerTable.ID),
239-
ServerUUID.fromString(set.getString(ServerTable.SERVER_UUID)),
240-
set.getString(ServerTable.NAME),
241-
set.getString(ServerTable.WEB_ADDRESS),
242-
set.getBoolean(ServerTable.PROXY),
243-
set.getString(ServerTable.PLAN_VERSION)));
234+
matches.add(extractServer(set));
244235
}
245236
return matches;
246237
}

Plan/common/src/test/java/com/djrapitops/plan/commands/PlanCommandTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.junit.jupiter.params.ParameterizedTest;
3737
import org.junit.jupiter.params.provider.CsvSource;
3838
import org.mockito.Mockito;
39+
import utilities.DBPreparer;
3940

4041
import java.io.File;
4142
import java.io.IOException;
@@ -159,7 +160,8 @@ void networkCommandSendsLink(Database database) throws ExecutionException, Inter
159160
try {
160161
Server server = new Server(ServerUUID.randomUUID(), "Serve", "", "");
161162
server.setProxy(true);
162-
database.executeTransaction(new StoreServerInformationTransaction(server)).get();
163+
database.executeTransaction(new StoreServerInformationTransaction(server));
164+
DBPreparer.awaitUntilTransactionsComplete(database);
163165

164166
CMDSender sender = runCommand("network", "plan.network");
165167

Plan/common/src/test/java/com/djrapitops/plan/commands/subcommands/RegistrationCommandsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.junit.jupiter.api.extension.ExtendWith;
4242
import org.junit.jupiter.api.io.TempDir;
4343
import org.openqa.selenium.json.TypeToken;
44+
import utilities.DBPreparer;
4445
import utilities.HTTPConnector;
4546
import utilities.TestConstants;
4647
import utilities.TestResources;
@@ -105,6 +106,7 @@ void normalRegistrationFlow(Addresses addresses, PlanCommand command, Database d
105106

106107
command.build().executeCommand(sender, new Arguments(List.of("register", "--code", code)));
107108

109+
DBPreparer.awaitUntilTransactionsComplete(database);
108110
User user = database.query(WebUserQueries.fetchUser(username)).orElseThrow(AssertionError::new);
109111
assertEquals("admin", user.getPermissionGroup());
110112
}
@@ -162,6 +164,7 @@ void setGroupCommandTest(PlanCommand command, Database database) throws Exceptio
162164

163165
command.build().executeCommand(sender, new Arguments(List.of("setgroup", username, "no_access")));
164166

167+
DBPreparer.awaitUntilTransactionsComplete(database);
165168
User modifiedUser = database.query(WebUserQueries.fetchUser(username)).orElseThrow(AssertionError::new);
166169
assertEquals("no_access", modifiedUser.getPermissionGroup());
167170
}

Plan/common/src/test/java/com/djrapitops/plan/delivery/export/ExportTestUtilities.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ public static void assertNoLogs(List<LogEntry> logs, String endpoint) {
7171
private static boolean ignoredLogLines(String log) {
7272
return !StringUtils.containsAny(log,
7373
"fonts.gstatic.com", "fonts.googleapis.com", "cdn.jsdelivr.net", "manifest.json",
74-
"React Router Future Flag Warning" // TODO remove after update to react-router-dom v7
74+
"React Router Future Flag Warning", // TODO remove after update to react-router-dom v7
75+
"Highcharts warning:" // TODO remove after fixing highcharts module loading issues
7576
);
7677
}
7778

Plan/common/src/test/java/com/djrapitops/plan/gathering/events/PlayerLeaveEventConsumerTest.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
3232
import com.djrapitops.plan.settings.config.paths.ExportSettings;
3333
import com.djrapitops.plan.storage.database.Database;
34-
import com.djrapitops.plan.storage.database.SQLDB;
3534
import com.djrapitops.plan.storage.database.queries.objects.JoinAddressQueries;
3635
import com.djrapitops.plan.storage.database.queries.objects.SessionQueries;
3736
import com.djrapitops.plan.storage.database.queries.objects.UserInfoQueries;
@@ -42,12 +41,13 @@
4241
import com.djrapitops.plan.storage.database.transactions.events.StoreServerPlayerTransaction;
4342
import com.djrapitops.plan.storage.database.transactions.events.StoreWorldNameTransaction;
4443
import extension.FullSystemExtension;
44+
import org.awaitility.Awaitility;
4545
import org.junit.jupiter.api.AfterAll;
4646
import org.junit.jupiter.api.BeforeAll;
4747
import org.junit.jupiter.api.BeforeEach;
4848
import org.junit.jupiter.api.Test;
4949
import org.junit.jupiter.api.extension.ExtendWith;
50-
import org.awaitility.Awaitility;
50+
import utilities.DBPreparer;
5151
import utilities.TestConstants;
5252
import utilities.dagger.PlanPluginComponent;
5353
import utilities.mocks.objects.TestPlayerData;
@@ -98,12 +98,6 @@ void resetSystem(PlanConfig config, Database database, ServerUUID serverUUID) {
9898
database.executeTransaction(new StoreServerInformationTransaction(new Server(serverUUID, TestConstants.SERVER_NAME, "", TestConstants.VERSION)));
9999
}
100100

101-
private void waitUntilDatabaseIsDone(Database database) {
102-
Awaitility.await()
103-
.atMost(2, TimeUnit.SECONDS)
104-
.until(() -> ((SQLDB) database).getTransactionQueueSize() < 1);
105-
}
106-
107101
PlayerLeave createPlayerLeave(PlatformPlayerData player) {
108102
return PlayerLeave.builder()
109103
.time(System.currentTimeMillis())
@@ -126,7 +120,7 @@ void leavingGameServerSavesSession(PlanSystem system, Database database, ServerU
126120
PlayerLeave leave = createPlayerLeave(createTestPlayer());
127121

128122
underTest.onLeaveGameServer(leave);
129-
waitUntilDatabaseIsDone(database);
123+
DBPreparer.awaitUntilTransactionsComplete(database);
130124

131125
DataMap extraData = new DataMap();
132126
GMTimes gmTimes = new GMTimes(Map.of(
@@ -163,7 +157,7 @@ void leavingGameServerSavesBanStatus(PlanSystem system, Database database, Serve
163157
.setBanned(true));
164158

165159
underTest.onLeaveGameServer(leave);
166-
waitUntilDatabaseIsDone(database);
160+
DBPreparer.awaitUntilTransactionsComplete(database);
167161

168162
Set<Integer> result = database.query(UserInfoQueries.userIdsOfBanned());
169163
assertEquals(1, result.size());
@@ -181,6 +175,7 @@ void leavingGameServerExportsPlayerPage(PlanConfig config, Database database, Se
181175
PlayerLeave leave = createPlayerLeave(createTestPlayer());
182176

183177
underTest.onLeaveGameServer(leave);
178+
DBPreparer.awaitUntilTransactionsComplete(database);
184179

185180
File playerExportDir = config.getPageExportPath().resolve("player/" + TestConstants.PLAYER_ONE_UUID).toFile();
186181
Awaitility.await()
@@ -201,6 +196,7 @@ void leavingProxyServerExportsPlayerPage(PlanConfig config, Database database, S
201196
PlayerLeave leave = createPlayerLeave(createTestPlayer());
202197

203198
underTest.onLeaveProxyServer(leave);
199+
DBPreparer.awaitUntilTransactionsComplete(database);
204200

205201
File playerExportDir = config.getPageExportPath().resolve("player/" + TestConstants.PLAYER_ONE_UUID).toFile();
206202
Awaitility.await()
@@ -259,7 +255,7 @@ void joinAddressCaseIsPreserved(PlanSystem system, PlanConfig config, Database d
259255
.setJoinAddress("PLAY.UPPERCASE.COM"));
260256

261257
underTest.onLeaveGameServer(leave);
262-
waitUntilDatabaseIsDone(database);
258+
DBPreparer.awaitUntilTransactionsComplete(database);
263259

264260
List<String> expected = List.of("PLAY.UPPERCASE.COM", "play.uppercase.com", JoinAddressTable.DEFAULT_VALUE_FOR_LOOKUP);
265261
List<String> result = database.query(JoinAddressQueries.allJoinAddresses());

Plan/common/src/test/java/com/djrapitops/plan/placeholder/PlanPlaceholdersTest.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,18 @@
1919
import com.djrapitops.plan.PlanSystem;
2020
import com.djrapitops.plan.delivery.domain.ServerIdentifier;
2121
import com.djrapitops.plan.gathering.domain.*;
22+
import com.djrapitops.plan.gathering.domain.builders.TPSBuilder;
23+
import com.djrapitops.plan.identification.Server;
2224
import com.djrapitops.plan.identification.ServerUUID;
2325
import com.djrapitops.plan.storage.database.Database;
26+
import com.djrapitops.plan.storage.database.transactions.StoreServerInformationTransaction;
2427
import com.djrapitops.plan.storage.database.transactions.events.StoreServerPlayerTransaction;
2528
import com.djrapitops.plan.storage.database.transactions.events.StoreSessionTransaction;
2629
import com.djrapitops.plan.storage.database.transactions.events.StoreWorldNameTransaction;
30+
import com.djrapitops.plan.storage.database.transactions.events.TPSStoreTransaction;
2731
import org.junit.jupiter.api.*;
2832
import org.junit.jupiter.api.io.TempDir;
33+
import utilities.DBPreparer;
2934
import utilities.RandomData;
3035
import utilities.TestConstants;
3136
import utilities.dagger.PlanPluginComponent;
@@ -235,4 +240,62 @@ private void storeKillers() throws ExecutionException, InterruptedException {
235240
.get();
236241
}
237242
}
243+
244+
@Test
245+
void networkPlayersOnlineGraphDisplaysDataSingleProxy() {
246+
Database database = component.system().getDatabaseSystem().getDatabase();
247+
database.executeTransaction(new StoreServerInformationTransaction(new Server(-1, TestConstants.SERVER_UUID, TestConstants.SERVER_NAME, "", false, TestConstants.VERSION)));
248+
database.executeTransaction(new StoreServerInformationTransaction(new Server(-1, TestConstants.SERVER_TWO_UUID, TestConstants.SERVER_TWO_NAME, "", true, TestConstants.VERSION)));
249+
database.executeTransaction(new TPSStoreTransaction(TestConstants.SERVER_UUID, TPSBuilder.get()
250+
.playersOnline(1)
251+
.date(System.currentTimeMillis())
252+
.toTPS()));
253+
database.executeTransaction(new TPSStoreTransaction(TestConstants.SERVER_TWO_UUID, TPSBuilder.get()
254+
.playersOnline(2)
255+
.date(System.currentTimeMillis())
256+
.toTPS()));
257+
258+
DBPreparer.awaitUntilTransactionsComplete(database);
259+
String value = underTest.onPlaceholderRequest(TestConstants.PLAYER_ONE_UUID, "network_players_online", List.of());
260+
assertEquals("2", value);
261+
}
262+
263+
@Test
264+
void networkPlayersOnlineGraphDisplaysDataTwoProxies() {
265+
Database database = component.system().getDatabaseSystem().getDatabase();
266+
database.executeTransaction(new StoreServerInformationTransaction(new Server(-1, TestConstants.SERVER_UUID, TestConstants.SERVER_NAME, "", true, TestConstants.VERSION)));
267+
database.executeTransaction(new StoreServerInformationTransaction(new Server(-1, TestConstants.SERVER_TWO_UUID, TestConstants.SERVER_TWO_NAME, "", true, TestConstants.VERSION)));
268+
database.executeTransaction(new TPSStoreTransaction(TestConstants.SERVER_UUID, TPSBuilder.get()
269+
.playersOnline(1)
270+
.date(System.currentTimeMillis())
271+
.toTPS()));
272+
database.executeTransaction(new TPSStoreTransaction(TestConstants.SERVER_TWO_UUID, TPSBuilder.get()
273+
.playersOnline(2)
274+
.date(System.currentTimeMillis())
275+
.toTPS()));
276+
277+
DBPreparer.awaitUntilTransactionsComplete(database);
278+
279+
String value = underTest.onPlaceholderRequest(TestConstants.PLAYER_ONE_UUID, "network_players_online", List.of());
280+
assertEquals("3", value);
281+
}
282+
283+
@Test
284+
void networkPlayersOnlineGraphDisplaysDataNoProxies() {
285+
Database database = component.system().getDatabaseSystem().getDatabase();
286+
database.executeTransaction(new StoreServerInformationTransaction(new Server(-1, TestConstants.SERVER_UUID, TestConstants.SERVER_NAME, "", false, TestConstants.VERSION)));
287+
database.executeTransaction(new StoreServerInformationTransaction(new Server(-1, TestConstants.SERVER_TWO_UUID, TestConstants.SERVER_TWO_NAME, "", false, TestConstants.VERSION)));
288+
database.executeTransaction(new TPSStoreTransaction(TestConstants.SERVER_UUID, TPSBuilder.get()
289+
.playersOnline(1)
290+
.date(System.currentTimeMillis())
291+
.toTPS()));
292+
database.executeTransaction(new TPSStoreTransaction(TestConstants.SERVER_TWO_UUID, TPSBuilder.get()
293+
.playersOnline(2)
294+
.date(System.currentTimeMillis())
295+
.toTPS()));
296+
DBPreparer.awaitUntilTransactionsComplete(database);
297+
298+
String value = underTest.onPlaceholderRequest(TestConstants.PLAYER_ONE_UUID, "network_players_online", List.of());
299+
assertEquals("3", value);
300+
}
238301
}

0 commit comments

Comments
 (0)