From: Carl Worth Date: Thu, 18 Jun 2020 14:49:16 +0000 (-0700) Subject: Broadcast "answering-idle" as soon as the waiting list becomes empty X-Git-Url: https://git.cworth.org/git?p=lmno-server;a=commitdiff_plain;h=77199f730679f4e36b8a4b62282df14c962d61d4 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). --- 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);