diff --git a/src/main/java/org/mobarena/stats/session/SessionListener.java b/src/main/java/org/mobarena/stats/session/SessionListener.java index 9e3a366..f76698d 100644 --- a/src/main/java/org/mobarena/stats/session/SessionListener.java +++ b/src/main/java/org/mobarena/stats/session/SessionListener.java @@ -88,6 +88,10 @@ public class SessionListener implements Listener { Arena arena = event.getArena(); Player player = event.getPlayer(); + if (arena.inSpec(player)) { + return; + } + Session session = sessionStore.getByArena(arena); if (session == null) { log.warning("Unexpected leave event for non-existent session of arena " + arena.getSlug()); diff --git a/src/test/java/org/mobarena/stats/session/SessionListenerTest.java b/src/test/java/org/mobarena/stats/session/SessionListenerTest.java index c87f013..78ed6ef 100644 --- a/src/test/java/org/mobarena/stats/session/SessionListenerTest.java +++ b/src/test/java/org/mobarena/stats/session/SessionListenerTest.java @@ -110,10 +110,23 @@ class SessionListenerTest { verify(session).playerReady(player, className); } + @Test + void ignoresPlayerLeaveForSpectators() { + Player player = mock(Player.class); + Arena arena = mock(Arena.class); + when(arena.inSpec(player)).thenReturn(true); + ArenaPlayerLeaveEvent event = new ArenaPlayerLeaveEvent(player, arena); + + subject.on(event); + + verifyNoInteractions(sessionStore); + } + @Test void logsWarningIfPlayerLeavesInNonExistentSession() { Player player = mock(Player.class); Arena arena = mock(Arena.class); + when(arena.inSpec(player)).thenReturn(false); when(sessionStore.getByArena(arena)).thenReturn(null); ArenaPlayerLeaveEvent event = new ArenaPlayerLeaveEvent(player, arena); @@ -127,6 +140,7 @@ class SessionListenerTest { Player player = mock(Player.class); Arena arena = mock(Arena.class); Session session = mock(Session.class); + when(arena.inSpec(player)).thenReturn(false); when(arena.isRunning()).thenReturn(false); when(arena.getPlayersInLobby()).thenReturn(Collections.singleton(player)); when(sessionStore.getByArena(arena)).thenReturn(session); @@ -142,6 +156,7 @@ class SessionListenerTest { Player player = mock(Player.class); Arena arena = mock(Arena.class); Session session = mock(Session.class); + when(arena.inSpec(player)).thenReturn(false); when(arena.isRunning()).thenReturn(false); when(arena.getPlayersInLobby()).thenReturn(Collections.singleton(player)); when(sessionStore.getByArena(arena)).thenReturn(session); @@ -158,6 +173,7 @@ class SessionListenerTest { Player other = mock(Player.class); Arena arena = mock(Arena.class); Session session = mock(Session.class); + when(arena.inSpec(player)).thenReturn(false); when(arena.isRunning()).thenReturn(false); when(arena.getPlayersInLobby()).thenReturn(new HashSet<>(Arrays.asList(player, other))); when(sessionStore.getByArena(arena)).thenReturn(session); @@ -173,6 +189,7 @@ class SessionListenerTest { Player player = mock(Player.class); Arena arena = mock(Arena.class); Session session = mock(Session.class); + when(arena.inSpec(player)).thenReturn(false); when(arena.isRunning()).thenReturn(true); when(sessionStore.getByArena(arena)).thenReturn(session); ArenaPlayerLeaveEvent event = new ArenaPlayerLeaveEvent(player, arena);