Remove player entries on leave/death prior to session start.

While we do want to keep track of join and ready times, we really don't
care about those stats for players who join the lobby _and leave_ prior
to the arena actually starting.

Coincidentally, _not_ storing stats for players that don't actually pick
a class means we don't end up trying to insert a `null` value into the
class name column, which should solve the error thrown when trying to do
just that as a result of the auto-start timer kicking players or players
themselves leaving prior to starting.

Fixes #16
This commit is contained in:
Andreas Troelsen
2022-07-03 20:58:42 +02:00
parent ffc6c89eac
commit 85df0066f1
2 changed files with 43 additions and 0 deletions
@@ -47,6 +47,11 @@ public class Session {
public void playerLeave(Arena arena, Player player) { public void playerLeave(Arena arena, Player player) {
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
if (sessionStats.startTime == null) {
playerStats.remove(playerId);
return;
}
PlayerSessionStats stats = playerStats.get(playerId); PlayerSessionStats stats = playerStats.get(playerId);
if (stats == null) { if (stats == null) {
return; return;
@@ -63,6 +68,11 @@ public class Session {
public void playerDeath(Arena arena, Player player) { public void playerDeath(Arena arena, Player player) {
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
if (sessionStats.startTime == null) {
playerStats.remove(playerId);
return;
}
PlayerSessionStats stats = playerStats.get(playerId); PlayerSessionStats stats = playerStats.get(playerId);
if (stats == null) { if (stats == null) {
return; return;
@@ -95,6 +95,19 @@ class SessionTest {
assertThat(actual.className, equalTo(className)); assertThat(actual.className, equalTo(className));
} }
@Test
void removeFromSessionOnLeaveBeforeStart() {
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
Player player = Mocks.player(playerId, "garbagemule");
Arena arena = mock(Arena.class);
subject.playerJoin(player);
subject.playerLeave(arena, player);
PlayerSessionStats actual = subject.getPlayerStats(playerId);
assertThat(actual, nullValue());
}
@Test @Test
void setLeaveTimeOnLeave() { void setLeaveTimeOnLeave() {
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe"); UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
@@ -103,6 +116,7 @@ class SessionTest {
ArenaPlayer ap = mock(ArenaPlayer.class); ArenaPlayer ap = mock(ArenaPlayer.class);
when(arena.getArenaPlayer(player)).thenReturn(ap); when(arena.getArenaPlayer(player)).thenReturn(ap);
subject.playerJoin(player); subject.playerJoin(player);
subject.start();
subject.playerLeave(arena, player); subject.playerLeave(arena, player);
@@ -118,6 +132,7 @@ class SessionTest {
ArenaPlayer ap = mock(ArenaPlayer.class); ArenaPlayer ap = mock(ArenaPlayer.class);
when(arena.getArenaPlayer(player)).thenReturn(ap); when(arena.getArenaPlayer(player)).thenReturn(ap);
subject.playerJoin(player); subject.playerJoin(player);
subject.start();
subject.playerLeave(arena, player); subject.playerLeave(arena, player);
@@ -133,6 +148,7 @@ class SessionTest {
ArenaPlayer ap = mock(ArenaPlayer.class); ArenaPlayer ap = mock(ArenaPlayer.class);
when(arena.getArenaPlayer(player)).thenReturn(ap); when(arena.getArenaPlayer(player)).thenReturn(ap);
subject.playerJoin(player); subject.playerJoin(player);
subject.start();
subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY; subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY;
subject.playerLeave(arena, player); subject.playerLeave(arena, player);
@@ -141,6 +157,19 @@ class SessionTest {
assertThat(actual.conclusion, not(equalTo(PlayerConclusion.RETREAT))); assertThat(actual.conclusion, not(equalTo(PlayerConclusion.RETREAT)));
} }
@Test
void removeFromSessionOnDeathBeforeStart() {
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
Player player = Mocks.player(playerId, "garbagemule");
Arena arena = mock(Arena.class);
subject.playerJoin(player);
subject.playerDeath(arena, player);
PlayerSessionStats actual = subject.getPlayerStats(playerId);
assertThat(actual, nullValue());
}
@Test @Test
void setDeathTimeOnDeath() { void setDeathTimeOnDeath() {
UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe"); UUID playerId = UUID.fromString("cafebabe-ea75-dead-beef-deadcafebabe");
@@ -149,6 +178,7 @@ class SessionTest {
ArenaPlayer ap = mock(ArenaPlayer.class); ArenaPlayer ap = mock(ArenaPlayer.class);
when(arena.getArenaPlayer(player)).thenReturn(ap); when(arena.getArenaPlayer(player)).thenReturn(ap);
subject.playerJoin(player); subject.playerJoin(player);
subject.start();
subject.playerDeath(arena, player); subject.playerDeath(arena, player);
@@ -164,6 +194,7 @@ class SessionTest {
ArenaPlayer ap = mock(ArenaPlayer.class); ArenaPlayer ap = mock(ArenaPlayer.class);
when(arena.getArenaPlayer(player)).thenReturn(ap); when(arena.getArenaPlayer(player)).thenReturn(ap);
subject.playerJoin(player); subject.playerJoin(player);
subject.start();
subject.playerDeath(arena, player); subject.playerDeath(arena, player);
@@ -179,6 +210,7 @@ class SessionTest {
ArenaPlayer ap = mock(ArenaPlayer.class); ArenaPlayer ap = mock(ArenaPlayer.class);
when(arena.getArenaPlayer(player)).thenReturn(ap); when(arena.getArenaPlayer(player)).thenReturn(ap);
subject.playerJoin(player); subject.playerJoin(player);
subject.start();
subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY; subject.getPlayerStats(playerId).conclusion = PlayerConclusion.VICTORY;
subject.playerDeath(arena, player); subject.playerDeath(arena, player);
@@ -246,6 +278,7 @@ class SessionTest {
when(arena.getArenaPlayer(corpse)).thenReturn(ap); when(arena.getArenaPlayer(corpse)).thenReturn(ap);
subject.playerJoin(corpse); subject.playerJoin(corpse);
subject.playerJoin(survivor); subject.playerJoin(survivor);
subject.start();
subject.playerDeath(arena, corpse); subject.playerDeath(arena, corpse);
subject.complete(); subject.complete();