X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=empathy.js;h=29d31bf7d46fbd0595e2ad8e6b3506057da387db;hb=1010e7bfe722481b7036934b6b859b8bb7916d52;hp=f2a6859ad3998cfa0d310c1e8c7e68f3818ef151;hpb=7671bd12ebaa902c287b0730eeda39dae9f418c8;p=empires-server diff --git a/empathy.js b/empathy.js index f2a6859..29d31bf 100644 --- a/empathy.js +++ b/empathy.js @@ -5,10 +5,55 @@ class Empathy extends Game { constructor(id) { super(id); this.state = { - prompts: [] + prompts: [], + active_prompt: null }; this.next_prompt_id = 1; } + + add_prompt(items, prompt_string) { + const prompt = new Prompt(this.next_prompt_id, items, prompt_string); + this.next_prompt_id++; + + this.state.prompts.push(prompt); + + this.broadcast_event_object('prompt', prompt); + + return prompt; + } + + /* Returns true if vote toggled, false for player or prompt not found */ + toggle_vote(prompt_id, session_id) { + const player = this.players_by_session[session_id]; + + const prompt = this.state.prompts.find(p => p.id === prompt_id); + if (! prompt || ! player) + return false; + + prompt.toggle_vote(player.name); + + this.broadcast_event_object('prompt', prompt); + + return true; + } + + /* Returns true on success, false for prompt not found. */ + start(prompt_id) { + const prompt = this.state.prompts.find(p => p.id === prompt_id); + if (! prompt) + return false; + + /* Ignore any start request that comes in while a prompt is + * already being played. */ + if (this.state.active_prompt) + return false; + + this.state.active_prompt = prompt; + + this.broadcast_event_object('start', prompt); + + return true; + } } Empathy.router = express.Router(); @@ -22,43 +67,38 @@ class Prompt { this.votes = []; } - add_vote(player_name) { + toggle_vote(player_name) { if (this.votes.find(v => v === player_name)) - return; - - this.votes.push(player_name); + this.votes = this.votes.filter(v => v !== player_name); + else + this.votes.push(player_name); } } router.post('/prompts', (request, response) => { const game = request.game; - const prompt = new Prompt(game.next_prompt_id, - request.body.items, - request.body.prompt); - game.next_prompt_id++; - - game.state.prompts.push(prompt); - - game.broadcast_event_object('prompt', prompt); + game.add_prompt(request.body.items, request.body.prompt); }); router.post('/vote/:prompt_id([0-9]+)', (request, response) => { - const prompt_id = parseInt(request.params.prompt_id, 10); const game = request.game; - const player = game.players_by_session[request.session.id]; + const prompt_id = parseInt(request.params.prompt_id, 10); - prompt = game.state.prompts.find(p => p.id === prompt_id); - if (! prompt || ! player) { + if (game.toggle_vote(prompt_id, request.session.id)) + response.sendStatus(200); + else response.sendStatus(404); - return; - } - - prompt.add_vote(player.name); +}); - game.broadcast_event_object('prompt', prompt); +router.post('/start/:prompt_id([[0-9]+)', (request, response) => { + const game = request.game; + const prompt_id = parseInt(request.params.prompt_id, 10); - response.sendStatus(200); + if (game.start(prompt_id)) + response.sendStatus(200); + else + response.sendStatus(404); }); Empathy.meta = {