]> git.cworth.org Git - lmno-server/commitdiff
Broadcast "answering-idle" as soon as the waiting list becomes empty
authorCarl Worth <cworth@cworth.org>
Thu, 18 Jun 2020 14:49:16 +0000 (07:49 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 26 Jun 2020 14:37:59 +0000 (07:37 -0700)
That is, as long as the answering phase has been going on for a "while".

This avoids an awkward pause when all active players are done
answering, everybody wants to move on, but the "Move On" button hasn't
appeared yet, (because clients haven't been told yet that the
answering phase is idle).

empathy.js

index 1cd120ee5e098870112f91c13025464fea079a40..e03f247f9e207a1cc612ea2ad25c3f78d17982ac 100644 (file)
@@ -21,6 +21,7 @@ class Empathy extends Game {
     };
     this.answers = [];
     this.answering_idle_timer = 0;
+    this.answering_start_time_ms = 0;
     this.next_prompt_id = 1;
     this.equivalencies = {};
   }
@@ -62,6 +63,11 @@ class Empathy extends Game {
     this.state.scores = null;
 
     this.answers = [];
+    if (this.answering_idle_timer) {
+      clearTimeout(this.answering_idle_timer);
+    }
+    this.answering_idle_timer = 0;
+    this.answering_start_time_ms = 0;
     this.equivalencies = {};
 
     this.broadcast_event_object('game-state', this.state);
@@ -145,6 +151,20 @@ class Empathy extends Game {
     /* And notify all players that this player has answered. */
     this.broadcast_event_object('player-answered', player.name);
 
+    /* If no players are left in the answering list then we don't need
+     * to wait for the answering_idle_timer to fire, because a person
+     * who isn't there obviously can't be typing. So we can broadcast
+     * the idle event right away. Note that we do this only if the
+     * answering phase has been going for a while to avoid the case of
+     * the first player being super fast and emptying the
+     * players_answering list before anyone else even got in.
+     */
+    if (this.state.players_answering.size === 0 &&
+        ((Date.now() - this.answering_start_time_ms) / 1000) > 30)
+    {
+      this.broadcast_event_object('answering-idle', true);
+    }
+
     return { valid: true };
   }
 
@@ -170,6 +190,9 @@ class Empathy extends Game {
       }, 10 * 1000);
     }
 
+    if (this.answering_start_time_ms === 0)
+      this.answering_start_time_ms = Date.now();
+
     /* Notify all players that this player is actively answering. */
     this.state.players_answering.add(player.name);
     this.broadcast_event_object('player-answering', player.name);