From 77199f730679f4e36b8a4b62282df14c962d61d4 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 18 Jun 2020 07:49:16 -0700 Subject: [PATCH] Broadcast "answering-idle" as soon as the waiting list becomes empty 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 | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/empathy.js b/empathy.js index 1cd120e..e03f247 100644 --- a/empathy.js +++ b/empathy.js @@ -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); -- 2.43.0