fix(stealth): suppress concealed disconnect messages
Release / release (push) Successful in 2m8s
CI / build (push) Successful in 1m1s

This commit is contained in:
dmg
2026-09-04 23:54:23 -04:00
parent b0da1508b6
commit 66ba2aa3b1
4 changed files with 53 additions and 4 deletions
@@ -38,10 +38,14 @@ public final class StealthSessionListener implements Listener {
presentation.refreshForObserver(player);
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.HIGHEST)
public void onQuit(PlayerQuitEvent event) {
presentation.reveal(event.getPlayer());
sessions.disconnect(event.getPlayer().getUniqueId());
Player player = event.getPlayer();
if (sessions.isConcealed(player.getUniqueId())) {
event.setQuitMessage(null);
}
presentation.reveal(player);
sessions.disconnect(player.getUniqueId());
}
@EventHandler(priority = EventPriority.MONITOR)
@@ -10,9 +10,50 @@ import java.util.Map;
import java.util.UUID;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.junit.jupiter.api.Test;
class StealthSessionListenerTest {
@Test
void concealedDisconnectSuppressesPublicAnnouncementBeforeCleanup() {
UUID playerId = UUID.randomUUID();
try (StealthStateManager manager = manager()) {
manager.update(state -> state.withPlayer(unlocked(playerId).withSession(false, true))).join();
QualifyingInvisibilityService progression = new QualifyingInvisibilityService(
manager, Duration.ofHours(8), System::nanoTime, ignored -> { });
StealthSessionService sessions = new StealthSessionService(manager, progression);
StealthSessionListener listener = new StealthSessionListener(
sessions, mock(IdentityPresentation.class), "Stealth active");
PlayerQuitEvent event = mock(PlayerQuitEvent.class);
Player player = player(playerId);
when(event.getPlayer()).thenReturn(player);
listener.onQuit(event);
verify(event).setQuitMessage(null);
}
}
@Test
void ordinaryDisconnectRetainsPublicAnnouncement() {
UUID playerId = UUID.randomUUID();
try (StealthStateManager manager = manager()) {
QualifyingInvisibilityService progression = new QualifyingInvisibilityService(
manager, Duration.ofHours(8), System::nanoTime, ignored -> { });
StealthSessionListener listener = new StealthSessionListener(
new StealthSessionService(manager, progression),
mock(IdentityPresentation.class),
"Stealth active");
PlayerQuitEvent event = mock(PlayerQuitEvent.class);
Player player = player(playerId);
when(event.getPlayer()).thenReturn(player);
listener.onQuit(event);
verify(event, never()).setQuitMessage(null);
}
}
@Test
void preparedLoginSuppressesAnnouncementAndConcealsIdentityForSession() {
UUID playerId = UUID.randomUUID();