]> git.cworth.org Git - lmno-server/commitdiff
Start the judging_idle timer whenever a judgment is received
authorCarl Worth <cworth@cworth.org>
Fri, 26 Jun 2020 14:45:10 +0000 (07:45 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 26 Jun 2020 14:45:31 +0000 (07:45 -0700)
Previously, we were starting the judging_idle timer only when a user
reported they were in the process of judging. This caused a bug in the
following scenario:

  * No players group any words

  * Majority of players submit the word groups unchanged

  * Minority of players drop from the game

  * The PHASE_IDLE_TIMEOUT passes

At this point, the game is supposed to consider the judging phase as
idle, but it wasn't doing this because the idle timer never got
started, (because no players actually grouped any words).

This bug came up in some (admittedly artificial) manual
testing. There's no chane to the test suite here because the current
test suite isn't yet exercising the timing related aspects of the
game, (the phase idle timeouts, etc.).

empathy.js

index 428627ce863d6913311aee67bd9caccdc0ee20c0..5e59dd20ef4fb710e242850fd1dc34fa1f06d218 100644 (file)
@@ -268,6 +268,19 @@ class Empathy extends Game {
     this.broadcast_event_object('ambiguities', this.state.ambiguities);
   }
 
+  reset_judging_timeout() {
+    if (this.judging_idle_timer) {
+      clearTimeout(this.judging_idle_timer);
+      this.judging_idle_timer = 0;
+    }
+    if (! this.state.judging_idle) {
+      this.judging_idle_timer = setTimeout(() => {
+        this.state.judging_idle = true;
+        this.broadcast_event_object('judging-idle', true);
+      }, PHASE_IDLE_TIMEOUT * 1000);
+    }
+  }
+
   receive_judged(prompt_id, session_id, word_groups) {
     const player = this.players_by_session[session_id];
     if (! player)
@@ -280,6 +293,8 @@ class Empathy extends Game {
     if (prompt !== this.state.active_prompt)
       return { valid: false, message: "Prompt no longer active" };
 
+    this.reset_judging_timeout();
+
     /* Each player submits some number of groups of answers that
      * should be considered equivalent. The server expands that into
      * the set of pair-wise equivalencies that are expressed. The
@@ -352,16 +367,7 @@ class Empathy extends Game {
     if (prompt !== this.state.active_prompt)
       return { valid: false, message: "Prompt no longer active" };
 
-    if (this.judging_idle_timer) {
-      clearTimeout(this.judging_idle_timer);
-      this.judging_idle_timer = 0;
-    }
-    if (! this.state.judging_idle) {
-      this.judging_idle_timer = setTimeout(() => {
-        this.state.judging_idle = true;
-        this.broadcast_event_object('judging-idle', true);
-      }, PHASE_IDLE_TIMEOUT * 1000);
-    }
+    this.reset_judging_timeout();
 
     /* Notify all players that this player is actively judging. */
     this.state.players_judging.add(player.name);