From 1de503e0016d62fb692500d4d6dbc2ccb3cd623f Mon Sep 17 00:00:00 2001 From: Dean Blackborough Date: Fri, 22 Jul 2022 15:25:10 +0100 Subject: [PATCH 1/5] Limit Yahtzee bonus - Only score a Yahtzee bonus when a Yahtzee has been scored --- CHANGELOG.md | 4 +++ public/js/public-score-sheet.js | 46 ++++++++++++++++-------------- public/js/score-sheet.js | 50 ++++++++++++++++++--------------- 3 files changed, 56 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 187b6f3..1bbb575 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ The complete changelog for the Costs to Expect REST API, our changelog follows the format defined at https://keepachangelog.com/en/1.0.0/ +## [0.7.0] - [DATE] +### Fixed +- You can only score a Yahtzee bonus when a Yahtzee has been scored. + ## [0.6.0] - 2022-07-22 ### Added - Added toast messages for scoreboard actions, toasts are selected from a random list for each action. diff --git a/public/js/public-score-sheet.js b/public/js/public-score-sheet.js index 0968c41..2c7288b 100644 --- a/public/js/public-score-sheet.js +++ b/public/js/public-score-sheet.js @@ -270,30 +270,34 @@ } let score_yahtzee_bonus = function(element, show_toast = 'none') { - clearTimeout(timeout); - timeout = setTimeout(() => { - axios.post( - '/score-sheet/' + token.value + '/score-lower', - { - combo: element.id, - score: 100 - } - ) - .then(response => { - element.classList.remove('active'); - element.classList.add('disabled'); - element.disabled = true; + let yahtzee = document.querySelector('input[type="checkbox"]#yahtzee.disabled'); + if (yahtzee !== null && yahtzee.checked === true) { + clearTimeout(timeout); + + timeout = setTimeout(() => { + axios.post( + '/score-sheet/' + token.value + '/score-lower', + { + combo: element.id, + score: 100 + } + ) + .then(response => { + element.classList.remove('active'); + element.classList.add('disabled'); + element.disabled = true; - score_lower.innerText = response.data.score.lower; - total_score.innerText = response.data.score.upper + response.data.score.bonus + response.data.score.lower; + score_lower.innerText = response.data.score.lower; + total_score.innerText = response.data.score.upper + response.data.score.bonus + response.data.score.lower; - display_toast(show_toast); - }) - .catch(error => { - console.log(error); - }); - }, delay); + display_toast(show_toast); + }) + .catch(error => { + console.log(error); + }); + }, delay); + } } let scratch_lower_combo = function(element, show_toast = 'none') { diff --git a/public/js/score-sheet.js b/public/js/score-sheet.js index 3aca1f4..ffb007d 100644 --- a/public/js/score-sheet.js +++ b/public/js/score-sheet.js @@ -277,32 +277,36 @@ } let score_yahtzee_bonus = function(element, show_toast = 'none') { - clearTimeout(timeout); - timeout = setTimeout(() => { - axios.post( - '/game/score-lower', - { - game_id: game_id.value, - player_id: player_id.value, - combo: element.id, - score: 100 - } - ) - .then(response => { - element.classList.remove('active'); - element.classList.add('disabled'); - element.disabled = true; + let yahtzee = document.querySelector('input[type="checkbox"]#yahtzee.disabled'); + if (yahtzee !== null && yahtzee.checked === true) { + clearTimeout(timeout); + + timeout = setTimeout(() => { + axios.post( + '/game/score-lower', + { + game_id: game_id.value, + player_id: player_id.value, + combo: element.id, + score: 100 + } + ) + .then(response => { + element.classList.remove('active'); + element.classList.add('disabled'); + element.disabled = true; - score_lower.innerText = response.data.score.lower; - total_score.innerText = response.data.score.upper + response.data.score.bonus + response.data.score.lower; + score_lower.innerText = response.data.score.lower; + total_score.innerText = response.data.score.upper + response.data.score.bonus + response.data.score.lower; - display_toast(show_toast); - }) - .catch(error => { - console.log(error); - }); - }, delay); + display_toast(show_toast); + }) + .catch(error => { + console.log(error); + }); + }, delay); + } } let scratch_lower_combo = function(element, show_toast = 'none') { From 1c10e6e134e05a9e9524a0a46c7ec009e681e851 Mon Sep 17 00:00:00 2001 From: Dean Blackborough Date: Fri, 22 Jul 2022 15:36:33 +0100 Subject: [PATCH 2/5] *** Interim commit *** - Working on shows the scores for all players --- app/Http/Controllers/Game.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/Http/Controllers/Game.php b/app/Http/Controllers/Game.php index 296ddad..81547e7 100644 --- a/app/Http/Controllers/Game.php +++ b/app/Http/Controllers/Game.php @@ -155,6 +155,28 @@ public function complete(Request $request, string $game_id) abort(500, 'Unable to complete the game, returned status code: ' . $result['status']); } + public function playerScores(Request $request, string $game_id) + { + $this->boostrap($request); + + $players_response = $this->api->getGamePlayers($this->resource_type_id, $this->resource_id, $game_id); + if ($players_response['status'] !== 200) { + abort(404, 'Unable to find the game players'); + } + + $game_score_sheets_response = $this->api->getGameScoreSheets( + $this->resource_type_id, + $this->resource_id, + $game_id + ); + + if ($game_score_sheets_response['status'] !== 200) { + abort(404, 'Unable to fetch the game scores'); + } + + $scores = []; + } + public function scoreSheet(Request $request, string $game_id, string $player_id) { $this->boostrap($request); From e72fddfc60c9795fa7f93c6e8f518b68d0dda642 Mon Sep 17 00:00:00 2001 From: Dean Blackborough Date: Fri, 22 Jul 2022 20:26:41 +0100 Subject: [PATCH 3/5] Version js - Version the Javascript --- config/app/config.php | 2 +- resources/views/public-score-sheet.blade.php | 2 +- resources/views/score-sheet.blade.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/app/config.php b/config/app/config.php index 515adc3..d734148 100644 --- a/config/app/config.php +++ b/config/app/config.php @@ -10,6 +10,6 @@ 'item_subtype_id' => env('ITEM_SUBTYPE_ID'), 'cookie_user' => env('SESSION_NAME_USER'), 'cookie_bearer' => env('SESSION_NAME_BEARER'), - 'version' => '0.6.0', + 'version' => '0.7.0', 'release_date' => '22nd July 2022' ]; diff --git a/resources/views/public-score-sheet.blade.php b/resources/views/public-score-sheet.blade.php index 38b4d89..8422922 100644 --- a/resources/views/public-score-sheet.blade.php +++ b/resources/views/public-score-sheet.blade.php @@ -534,6 +534,6 @@ - + diff --git a/resources/views/score-sheet.blade.php b/resources/views/score-sheet.blade.php index 2024de6..b542bde 100644 --- a/resources/views/score-sheet.blade.php +++ b/resources/views/score-sheet.blade.php @@ -545,7 +545,7 @@ - + @endif From 4d2d98004d6dcf8e5a6dcf9d3ee8c910676c77e7 Mon Sep 17 00:00:00 2001 From: Dean Blackborough Date: Fri, 22 Jul 2022 23:56:22 +0100 Subject: [PATCH 4/5] Show scores - Updated URIs for public share pages - Added a players scores section at the bottom of the score sheets --- app/Http/Controllers/Game.php | 21 +++++++++- app/Http/Controllers/Share.php | 44 ++++++++++++++++++++ public/js/player-scores.js | 22 ++++++++++ public/js/public-player-scores.js | 22 ++++++++++ public/js/public-score-sheet.js | 12 +++--- resources/views/player-scores.blade.php | 24 +++++++++++ resources/views/public-score-sheet.blade.php | 2 + resources/views/score-sheet.blade.php | 4 +- routes/web.php | 16 +++++-- 9 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 public/js/player-scores.js create mode 100644 public/js/public-player-scores.js create mode 100644 resources/views/player-scores.blade.php diff --git a/app/Http/Controllers/Game.php b/app/Http/Controllers/Game.php index 81547e7..47fac07 100644 --- a/app/Http/Controllers/Game.php +++ b/app/Http/Controllers/Game.php @@ -159,7 +159,11 @@ public function playerScores(Request $request, string $game_id) { $this->boostrap($request); - $players_response = $this->api->getGamePlayers($this->resource_type_id, $this->resource_id, $game_id); + $players_response = $this->api->getGamePlayers( + $this->resource_type_id, + $this->resource_id, + $game_id + ); if ($players_response['status'] !== 200) { abort(404, 'Unable to find the game players'); } @@ -175,6 +179,21 @@ public function playerScores(Request $request, string $game_id) } $scores = []; + foreach ($players_response['content'] as $player) { + $scores[$player['category']['id']] = [ + 'name' => $player['category']['name'], + 'score' => 0 + ]; + } + + foreach ($game_score_sheets_response['content'] as $score_sheet) { + $scores[$score_sheet['key']]['score'] = $score_sheet['value']['score']['total']; + } + + return view( + 'player-scores', + ['scores' => $scores] + ); } public function scoreSheet(Request $request, string $game_id, string $player_id) diff --git a/app/Http/Controllers/Share.php b/app/Http/Controllers/Share.php index ef01d68..f992e50 100644 --- a/app/Http/Controllers/Share.php +++ b/app/Http/Controllers/Share.php @@ -16,6 +16,50 @@ */ class Share extends Controller { + public function playerScores(Request $request, string $token) + { + $parameters = $this->getParameters($token); + + $api = new Service($parameters['owner_bearer']); + + $players_response = $api->getGamePlayers( + $parameters['resource_type_id'], + $parameters['resource_id'], + $parameters['game_id'] + ); + + if ($players_response['status'] !== 200) { + abort(404, 'Unable to find the game players'); + } + + $game_score_sheets_response = $api->getGameScoreSheets( + $parameters['resource_type_id'], + $parameters['resource_id'], + $parameters['game_id'], + ); + + if ($game_score_sheets_response['status'] !== 200) { + abort(404, 'Unable to fetch the game scores'); + } + + $scores = []; + foreach ($players_response['content'] as $player) { + $scores[$player['category']['id']] = [ + 'name' => $player['category']['name'], + 'score' => 0 + ]; + } + + foreach ($game_score_sheets_response['content'] as $score_sheet) { + $scores[$score_sheet['key']]['score'] = $score_sheet['value']['score']['total']; + } + + return view( + 'player-scores', + ['scores' => $scores] + ); + } + public function scoreSheet(Request $request, string $token) { $parameters = $this->getParameters($token); diff --git a/public/js/player-scores.js b/public/js/player-scores.js new file mode 100644 index 0000000..fdb8d4b --- /dev/null +++ b/public/js/player-scores.js @@ -0,0 +1,22 @@ +(function (axios) { + 'use strict' + + let game_id = document.getElementById('game_id'); + + let sleep = time => new Promise(resolve => setTimeout(resolve, time)) + let poll = (promiseFn, time) => promiseFn().then( + sleep(time).then(() => poll(promiseFn, time))) + + let fetchPlayerScores = function() { + let player_scores = document.querySelector('div.player-scores'); + + axios.get('/game/' + game_id.value + '/player-scores') + .then(response => { + if (response.data.length > 0) { + player_scores.innerHTML = response.data; + } + }); + } + + poll(() => new Promise(() => fetchPlayerScores()), 1000 * 30) +})(axios); \ No newline at end of file diff --git a/public/js/public-player-scores.js b/public/js/public-player-scores.js new file mode 100644 index 0000000..3266fff --- /dev/null +++ b/public/js/public-player-scores.js @@ -0,0 +1,22 @@ +(function (axios) { + 'use strict' + + let token = document.getElementById('token'); + + let sleep = time => new Promise(resolve => setTimeout(resolve, time)) + let poll = (promiseFn, time) => promiseFn().then( + sleep(time).then(() => poll(promiseFn, time))) + + let fetchPlayerScores = function() { + let player_scores = document.querySelector('div.player-scores'); + + axios.get('/public/game/' + token.value + '/player-scores') + .then(response => { + if (response.data.length > 0) { + player_scores.innerHTML = response.data; + } + }); + } + + poll(() => new Promise(() => fetchPlayerScores()), 1000 * 30) +})(axios); \ No newline at end of file diff --git a/public/js/public-score-sheet.js b/public/js/public-score-sheet.js index 2c7288b..cd94431 100644 --- a/public/js/public-score-sheet.js +++ b/public/js/public-score-sheet.js @@ -22,7 +22,7 @@ clearTimeout(timeout); timeout = setTimeout(() => { axios.post( - '/score-sheet/' + token.value + '/score-upper', + '/public/score-sheet/' + token.value + '/score-upper', { dice: this.value, score: 0 @@ -69,7 +69,7 @@ clearTimeout(timeout); timeout = setTimeout(() => { axios.post( - '/score-sheet/' + token.value + '/score-upper', + '/public/score-sheet/' + token.value + '/score-upper', { dice: this.id, score: score @@ -242,7 +242,7 @@ timeout = setTimeout(() => { axios.post( - '/score-sheet/' + token.value + '/score-lower', + '/public/score-sheet/' + token.value + '/score-lower', { combo: element.id, score: score @@ -277,7 +277,7 @@ timeout = setTimeout(() => { axios.post( - '/score-sheet/' + token.value + '/score-lower', + '/public/score-sheet/' + token.value + '/score-lower', { combo: element.id, score: 100 @@ -305,7 +305,7 @@ timeout = setTimeout(() => { axios.post( - '/score-sheet/' + token.value + '/score-lower', + '/public/score-sheet/' + token.value + '/score-lower', { combo: element.id.toString().replace('scratch_', ''), score: 0 @@ -335,7 +335,7 @@ timeout = setTimeout(() => { axios.post( - '/score-sheet/' + token.value + '/score-lower', + '/public/score-sheet/' + token.value + '/score-lower', { combo: element.id.toString().replace('scratch_', ''), score: 0 diff --git a/resources/views/player-scores.blade.php b/resources/views/player-scores.blade.php new file mode 100644 index 0000000..65ba021 --- /dev/null +++ b/resources/views/player-scores.blade.php @@ -0,0 +1,24 @@ +
+ +
+ +

Player Scores

+ + + + + + + + + + + @foreach($scores as $__score) + + + + + @endforeach + +
Player scores, delayed by thirty seconds.
NameScore
{{ $__score['name'] }}{{ $__score['score'] }}
+
\ No newline at end of file diff --git a/resources/views/public-score-sheet.blade.php b/resources/views/public-score-sheet.blade.php index 8422922..0707cd9 100644 --- a/resources/views/public-score-sheet.blade.php +++ b/resources/views/public-score-sheet.blade.php @@ -521,6 +521,7 @@ +