Skip to content

Commit 5eeee50

Browse files
committed
Deprecate /v1/network/servers
Fixes
1 parent 24adbad commit 5eeee50

16 files changed

Lines changed: 258 additions & 118 deletions

File tree

Plan/common/src/main/java/com/djrapitops/plan/delivery/export/NetworkPageExporter.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import javax.inject.Inject;
3535
import javax.inject.Singleton;
3636
import java.io.IOException;
37+
import java.nio.file.Files;
3738
import java.nio.file.Path;
3839
import java.util.Collections;
3940
import java.util.Optional;
@@ -115,7 +116,6 @@ public void exportJSON(Path toDirectory, ServerUUID serverUUID) throws IOExcepti
115116
String afterMillis = "&afterMillisAgo=";
116117
String beforeMillis = "&beforeMillisAgo=";
117118
exportJSON(toDirectory,
118-
"network/servers",
119119
"network/playerbaseOverview",
120120
"graph?type=playersOnline&server=" + serverUUID,
121121
"graph?type=playersOnlineProxies",
@@ -187,19 +187,22 @@ private void exportJSON(Path toDirectory, String... resources) throws IOExceptio
187187
}
188188

189189
private void exportJSON(Path toDirectory, String resource) throws IOException {
190-
Response response = getJSONResponse(resource)
191-
.orElseThrow(() -> new NotFoundException(resource + " was not properly exported: not found"));
190+
Optional<Response> response = getJSONResponse(resource);
192191

193192
String jsonResourceName = toFileName(toJSONResourceName(resource), "json");
194193

195194
String relativePlayerLink = toRelativePathFromRoot("player");
196-
export(toDirectory.resolve("data").resolve(jsonResourceName),
197-
// Replace ../player in urls to fix player page links
198-
StringUtils.replaceEach(response.getAsString(),
199-
new String[]{StringEscapeUtils.escapeJson("../player"), StringEscapeUtils.escapeJson("./player")},
200-
new String[]{StringEscapeUtils.escapeJson(relativePlayerLink), StringEscapeUtils.escapeJson(relativePlayerLink)}
201-
)
202-
);
195+
if (response.isPresent()) {
196+
export(toDirectory.resolve("data").resolve(jsonResourceName),
197+
// Replace ../player in urls to fix player page links
198+
StringUtils.replaceEach(response.get().getAsString(),
199+
new String[]{StringEscapeUtils.escapeJson("../player"), StringEscapeUtils.escapeJson("./player")},
200+
new String[]{StringEscapeUtils.escapeJson(relativePlayerLink), StringEscapeUtils.escapeJson(relativePlayerLink)}
201+
)
202+
);
203+
} else {
204+
Files.deleteIfExists(toDirectory.resolve("data").resolve(jsonResourceName));
205+
}
203206
}
204207

205208
private Optional<Response> getJSONResponse(String resource) {

Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ServerPageExporter.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import javax.inject.Inject;
3636
import javax.inject.Singleton;
3737
import java.io.IOException;
38+
import java.nio.file.Files;
3839
import java.nio.file.Path;
3940
import java.util.Collections;
4041
import java.util.Optional;
@@ -167,7 +168,9 @@ public void exportJSON(Path toDirectory, ServerUUID serverUUID) throws IOExcepti
167168
datapointType + DatapointType.MOB_KILLS + server,
168169
datapointType + DatapointType.DEATHS + server,
169170
datapointType + DatapointType.UPTIME_CURRENT + server,
171+
datapointType + DatapointType.TPS_AVERAGE + afterMillis + TimeUnit.DAYS.toMillis(1) + server,
170172
datapointType + DatapointType.TPS_AVERAGE + afterMillis + TimeUnit.DAYS.toMillis(7) + server,
173+
datapointType + DatapointType.TPS_AVERAGE + afterMillis + TimeUnit.DAYS.toMillis(30) + server,
171174
datapointType + DatapointType.TPS_LOW_SPIKES + afterMillis + TimeUnit.DAYS.toMillis(7) + server,
172175
datapointType + DatapointType.UNIQUE_PLAYERS_AVERAGE + afterMillis + TimeUnit.DAYS.toMillis(7) + server,
173176
datapointType + DatapointType.NEW_PLAYER_RETENTION + afterMillis + TimeUnit.DAYS.toMillis(7) + server,
@@ -201,19 +204,22 @@ private void exportJSON(Path toDirectory, String... resources) throws IOExceptio
201204
}
202205

203206
private void exportJSON(Path toDirectory, String resource) throws IOException {
204-
Response response = getJSONResponse(resource)
205-
.orElseThrow(() -> new NotFoundException(resource + " was not properly exported: not found"));
207+
Optional<Response> response = getJSONResponse(resource);
206208

207209
String jsonResourceName = toFileName(toJSONResourceName(resource), "json");
208210

209-
export(toDirectory.resolve("data").resolve(jsonResourceName),
210-
// Replace ../player in urls to fix player page links
211-
Strings.CI.replace(
212-
response.getAsString(),
213-
StringEscapeUtils.escapeJson("../player"),
214-
StringEscapeUtils.escapeJson(toRelativePathFromRoot("player"))
215-
)
216-
);
211+
if (response.isPresent()) {
212+
export(toDirectory.resolve("data").resolve(jsonResourceName),
213+
// Replace ../player in urls to fix player page links
214+
Strings.CI.replace(
215+
response.get().getAsString(),
216+
StringEscapeUtils.escapeJson("../player"),
217+
StringEscapeUtils.escapeJson(toRelativePathFromRoot("player"))
218+
)
219+
);
220+
} else {
221+
Files.deleteIfExists(toDirectory.resolve("data").resolve(jsonResourceName));
222+
}
217223
}
218224

219225
private Optional<Response> getJSONResponse(String resource) {

Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/json/JSONFactory.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.djrapitops.plan.settings.locale.Locale;
4646
import com.djrapitops.plan.settings.locale.lang.GenericLang;
4747
import com.djrapitops.plan.settings.locale.lang.HtmlLang;
48+
import com.djrapitops.plan.settings.locale.lang.PluginLang;
4849
import com.djrapitops.plan.storage.database.DBSystem;
4950
import com.djrapitops.plan.storage.database.Database;
5051
import com.djrapitops.plan.storage.database.queries.analysis.PlayerCountQueries;
@@ -57,6 +58,7 @@
5758
import com.djrapitops.plan.utilities.dev.Untrusted;
5859
import com.djrapitops.plan.utilities.java.Lists;
5960
import com.djrapitops.plan.utilities.java.Maps;
61+
import net.playeranalytics.plugin.server.PluginLogger;
6062

6163
import javax.inject.Inject;
6264
import javax.inject.Singleton;
@@ -74,6 +76,7 @@
7476
public class JSONFactory {
7577

7678
private final PlanConfig config;
79+
private final PluginLogger logger;
7780
private final Locale locale;
7881
private final DBSystem dbSystem;
7982
private final ServerInfo serverInfo;
@@ -83,7 +86,7 @@ public class JSONFactory {
8386

8487
@Inject
8588
public JSONFactory(
86-
PlanConfig config,
89+
PlanConfig config, PluginLogger logger,
8790
Locale locale,
8891
DBSystem dbSystem,
8992
ServerInfo serverInfo,
@@ -92,6 +95,7 @@ public JSONFactory(
9295
Formatters formatters
9396
) {
9497
this.config = config;
98+
this.logger = logger;
9599
this.locale = locale;
96100
this.dbSystem = dbSystem;
97101
this.serverInfo = serverInfo;
@@ -246,7 +250,10 @@ public Optional<ServerDto> serverForIdentifier(@Untrusted String identifier) {
246250
.map(ServerDto::fromServer);
247251
}
248252

253+
@Deprecated(since = "2026-04-29 / 5.7 build 3401")
249254
public Map<String, Object> serversAsJSONMaps() {
255+
logger.warn(locale.getString(PluginLang.DEPRECATED_ENDPOINT_CALL, "/v1/network/servers", "/v1/datapoint"));
256+
250257
Database db = dbSystem.getDatabase();
251258
long now = System.currentTimeMillis();
252259
long weekAgo = now - TimeUnit.DAYS.toMillis(7L);

Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/json/datapoint/types/PlayersOnlineCurrent.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.djrapitops.plan.identification.ServerInfo;
2727
import com.djrapitops.plan.identification.ServerUUID;
2828
import com.djrapitops.plan.storage.database.DBSystem;
29+
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
2930
import com.djrapitops.plan.storage.database.queries.objects.TPSQueries;
3031

3132
import javax.inject.Inject;
@@ -61,33 +62,39 @@ public Optional<Integer> getValue(GenericFilter filter) {
6162

6263
List<ServerUUID> serverUUIDs = filter.getServerUUIDs();
6364
if (serverUUIDs.isEmpty()) {
64-
return Optional.of(serverSensor.getOnlinePlayerCount());
65+
if (serverSensor.usingRedisBungee()) {
66+
return Optional.of(serverSensor.getOnlinePlayerCount());
67+
} else {
68+
serverUUIDs = dbSystem.getDatabase().query(ServerQueries.fetchProxyServerUUIDs());
69+
}
6570
}
6671

6772
if (serverUUIDs.size() == 1) {
6873
ServerUUID serverUUID = serverUUIDs.get(0);
6974
if (serverUUID.equals(serverInfo.getServerUUID())) {
7075
return Optional.of(serverSensor.getOnlinePlayerCount());
7176
}
72-
return Optional.of(dbSystem.getDatabase().query(TPSQueries.fetchLatestTPSEntryForServer(serverUUID))
77+
return dbSystem.getDatabase().query(TPSQueries.fetchLatestTPSEntryForServer(serverUUID))
7378
.filter(tps -> tps.getDate() > System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2))
74-
.map(TPS::getPlayers)
75-
.orElse(0)
76-
);
79+
.map(TPS::getPlayers);
7780
}
7881

7982
// Multiple servers: sum of latest online counts
8083
int total = 0;
84+
boolean addedValues = false;
8185
for (ServerUUID serverUUID : serverUUIDs) {
8286
if (serverUUID.equals(serverInfo.getServerUUID())) {
8387
total += serverSensor.getOnlinePlayerCount();
88+
addedValues = true;
8489
} else {
85-
total += dbSystem.getDatabase().query(TPSQueries.fetchLatestTPSEntryForServer(serverUUID))
90+
Optional<Integer> found = dbSystem.getDatabase().query(TPSQueries.fetchLatestTPSEntryForServer(serverUUID))
8691
.filter(tps -> tps.getDate() > System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2))
87-
.map(TPS::getPlayers).orElse(0);
92+
.map(TPS::getPlayers);
93+
total += found.orElse(0);
94+
if (!addedValues) addedValues = found.isPresent();
8895
}
8996
}
90-
return Optional.of(total);
97+
return addedValues ? Optional.of(total) : Optional.empty();
9198
}
9299

93100
@Override

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public static Query<Map<ServerUUID, List<TPS>>> fetchAllTPSData() {
6464
TPSTable.FREE_DISK + ',' +
6565
serverUUIDColumn +
6666
FROM + TPSTable.TABLE_NAME +
67-
INNER_JOIN + ServerTable.TABLE_NAME + " on " + serverIDColumn + "=" + TPSTable.SERVER_ID;
67+
INNER_JOIN + ServerTable.TABLE_NAME + " on " + serverIDColumn + "=" + TPSTable.SERVER_ID +
68+
ORDER_BY + serverIDColumn + ',' + TPSTable.DATE + " ASC";
6869

6970
return new QueryAllStatement<>(sql, 50000) {
7071
@Override

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,8 @@ public static Query<Long> occupiedTime(long after, long before, List<ServerUUID>
164164
" segmented AS (\n" +
165165
"SELECT\n" +
166166
" date," +
167-
" SUM (new_segment) OVER (\n" +
168-
" ORDER BY date\n" +
169-
(db.getType() == DBType.SQLITE ? " ROWS UNBOUNDED PRECEDING" : "") +
167+
" SUM(new_segment) OVER (ORDER BY date" +
168+
(db.getType() == DBType.SQLITE ? " ROWS UNBOUNDED PRECEDING" : "") +
170169
") AS segment_id\n" +
171170
"FROM marked" +
172171
")\n" +
@@ -521,7 +520,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
521520

522521
@Override
523522
public Double processResults(ResultSet set) throws SQLException {
524-
return set.next() ? set.getDouble("average") : -1.0;
523+
double value = set.next() ? set.getDouble("average") : -1.0;
524+
return set.wasNull() ? -1.0 : value;
525525
}
526526
};
527527
}
@@ -550,7 +550,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
550550

551551
@Override
552552
public Double processResults(ResultSet set) throws SQLException {
553-
return set.next() ? set.getDouble("average") : -1.0;
553+
double value = set.next() ? set.getDouble("average") : -1.0;
554+
return set.wasNull() ? -1.0 : value;
554555
}
555556
};
556557
}
@@ -579,7 +580,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
579580

580581
@Override
581582
public Double processResults(ResultSet set) throws SQLException {
582-
return set.next() ? set.getDouble("average") : -1.0;
583+
double value = set.next() ? set.getDouble("average") : -1.0;
584+
return set.wasNull() ? -1.0 : value;
583585
}
584586
};
585587
}
@@ -608,7 +610,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
608610

609611
@Override
610612
public Long processResults(ResultSet set) throws SQLException {
611-
return set.next() ? (long) set.getDouble("average") : -1L;
613+
double value = set.next() ? set.getDouble("average") : -1.0;
614+
return set.wasNull() ? -1L : (long) value;
612615
}
613616
};
614617
}
@@ -637,7 +640,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
637640

638641
@Override
639642
public Long processResults(ResultSet set) throws SQLException {
640-
return set.next() ? (long) set.getDouble("average") : -1L;
643+
double value = set.next() ? set.getDouble("average") : -1.0;
644+
return set.wasNull() ? -1L : (long) value;
641645
}
642646
};
643647
}
@@ -666,7 +670,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
666670

667671
@Override
668672
public Long processResults(ResultSet set) throws SQLException {
669-
return set.next() ? (long) set.getDouble("average") : -1L;
673+
double value = set.next() ? set.getDouble("average") : -1.0;
674+
return set.wasNull() ? -1L : (long) value;
670675
}
671676
};
672677
}
@@ -695,7 +700,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
695700

696701
@Override
697702
public Double processResults(ResultSet set) throws SQLException {
698-
return set.next() ? set.getDouble("average") : -1.0;
703+
double value = set.next() ? set.getDouble("average") : -1.0;
704+
return set.wasNull() ? -1.0 : value;
699705
}
700706
};
701707
}
@@ -717,7 +723,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
717723

718724
@Override
719725
public Long processResults(ResultSet set) throws SQLException {
720-
return set.next() ? set.getLong("free") : -1L;
726+
long value = set.next() ? set.getLong("free") : -1L;
727+
return set.wasNull() ? -1L : value;
721728
}
722729
};
723730
}
@@ -739,7 +746,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
739746

740747
@Override
741748
public Long processResults(ResultSet set) throws SQLException {
742-
return set.next() ? set.getLong("free") : -1L;
749+
long value = set.next() ? set.getLong("free") : -1L;
750+
return set.wasNull() ? -1L : value;
743751
}
744752
};
745753
}
@@ -761,7 +769,8 @@ public void prepare(PreparedStatement statement) throws SQLException {
761769

762770
@Override
763771
public Long processResults(ResultSet set) throws SQLException {
764-
return set.next() ? (long) set.getDouble("average") : -1L;
772+
double value = set.next() ? set.getDouble("average") : -1.0;
773+
return set.wasNull() ? -1L : (long) value;
765774
}
766775
};
767776
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ static void setUp(PlanFiles files, PlanConfig config, PlanSystem system) throws
8181
system.enable();
8282
serverUUID = system.getServerInfo().getServerUUID();
8383
savePlayerData(system.getDatabaseSystem().getDatabase(), serverUUID);
84+
saveServerData(system.getDatabaseSystem().getDatabase(), serverUUID);
8485
export(system.getExportSystem().getExporter(), system.getDatabaseSystem().getDatabase(), serverUUID);
8586
}
8687

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.djrapitops.plan.storage.database.transactions.events.PlayerRegisterTransaction;
2525
import com.djrapitops.plan.storage.database.transactions.events.StoreSessionTransaction;
2626
import com.djrapitops.plan.storage.database.transactions.events.StoreWorldNameTransaction;
27+
import com.djrapitops.plan.storage.database.transactions.events.TPSStoreTransaction;
2728
import com.djrapitops.plan.utilities.java.Lists;
2829
import org.apache.commons.lang3.Strings;
2930
import org.awaitility.Awaitility;
@@ -86,15 +87,15 @@ public static void assertNoLogsExceptFaviconError(List<LogEntry> logs) {
8687
public static Optional<WebElement> getMainPageElement(ChromeDriver driver) {
8788
try {
8889
return Optional.of(driver.findElement(By.className("load-in")));
89-
} catch (NoSuchElementException e) {
90+
} catch (NoSuchElementException _) {
9091
return Optional.empty();
9192
}
9293
}
9394

9495
public static Optional<WebElement> getElementById(ChromeDriver driver, String id) {
9596
try {
9697
return Optional.of(driver.findElement(By.id(id)));
97-
} catch (NoSuchElementException e) {
98+
} catch (NoSuchElementException _) {
9899
return Optional.empty();
99100
}
100101
}
@@ -131,6 +132,10 @@ static void savePlayerData(Database database, ServerUUID serverUUID) {
131132
database.executeTransaction(new StoreSessionTransaction(session));
132133
}
133134

135+
static void saveServerData(Database database, ServerUUID serverUUID) {
136+
RandomData.randomDateOrderedTPS(5).forEach(tps -> database.executeTransaction(new TPSStoreTransaction(serverUUID, tps)).join());
137+
}
138+
134139
public static List<String> getEndpointsToTest(ServerUUID serverUUID) {
135140
return Lists.builder(String.class)
136141
.add("/")

Plan/common/src/testFixtures/java/utilities/RandomData.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,12 @@ public static List<TPS> randomTPS() {
9191
}
9292

9393
public static List<TPS> randomDateOrderedTPS() {
94+
return randomDateOrderedTPS(50);
95+
}
96+
97+
public static List<TPS> randomDateOrderedTPS(long minimumDay) {
9498
List<TPS> test = new ArrayList<>();
95-
long previousTimestamp = randomLong(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(50), System.currentTimeMillis());
99+
long previousTimestamp = randomLong(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(minimumDay), System.currentTimeMillis());
96100
int previousPlayers = randomInt(0, 100);
97101
for (int i = 0; i < randomInt(50, 100); i++) {
98102
int randInt = r.nextInt();

0 commit comments

Comments
 (0)