fix(stealth): hide concealed players from server ping
Release / release (push) Successful in 2m13s
CI / build (push) Successful in 58s

This commit is contained in:
dmg
2026-09-05 08:11:58 -04:00
parent 66ba2aa3b1
commit ba6573943b
8 changed files with 172 additions and 2 deletions
@@ -0,0 +1,43 @@
package games.dmg.spigotstealth;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.junit.jupiter.api.Test;
class ServerListPingVisibilityTest {
@Test
void publicPlayerCountNeverBecomesNegative() {
ServerListPingVisibility.Snapshot adjusted = ServerListPingVisibility.adjust(
0, 100, List.of(), Set.of(UUID.randomUUID()));
assertEquals(0, adjusted.playersOnline());
}
@Test
void ordinaryPlayersRemainCountedAndSampled() {
UUID firstId = UUID.randomUUID();
UUID secondId = UUID.randomUUID();
ServerListPingVisibility.Snapshot adjusted = ServerListPingVisibility.adjust(
2, 100, List.of(firstId, secondId), Set.of());
assertEquals(2, adjusted.playersOnline());
assertEquals(List.of(firstId, secondId), adjusted.samplePlayerIds());
}
@Test
void excludesConcealedPlayersFromPublicCountAndSampleWithoutChangingMaximum() {
UUID visibleId = UUID.randomUUID();
UUID concealedId = UUID.randomUUID();
ServerListPingVisibility.Snapshot adjusted = ServerListPingVisibility.adjust(
2, 100, List.of(visibleId, concealedId), Set.of(concealedId));
assertEquals(1, adjusted.playersOnline());
assertEquals(100, adjusted.playersMaximum());
assertEquals(List.of(visibleId), adjusted.samplePlayerIds());
}
}
@@ -1,15 +1,35 @@
package games.dmg.spigotstealth;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.Duration;
import java.time.Instant;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.junit.jupiter.api.Test;
class StealthSessionServiceTest {
@Test
void reportsOnlyCurrentlyConcealedPlayerIdsForPublicPresentation() {
UUID concealedId = UUID.randomUUID();
UUID staleId = UUID.randomUUID();
try (StealthStateManager manager = manager()) {
manager.update(state -> state
.withPlayer(unlocked(concealedId).withSession(true, false))
.withPlayer(unlocked(staleId).withSession(false, true)))
.join();
QualifyingInvisibilityService progression = new QualifyingInvisibilityService(
manager, Duration.ofHours(8), System::nanoTime, ignored -> { });
StealthSessionService sessions = new StealthSessionService(manager, progression);
sessions.login(concealedId, "Hidden");
assertEquals(Set.of(concealedId), sessions.concealedPlayerIds());
}
}
@Test
void unlockedQualifyingDisconnectPreparesAndConsumesOneConcealedLogin() {
UUID playerId = UUID.randomUUID();