diff --git a/CHANGELOG.md b/CHANGELOG.md index 187b6f3..21133e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ 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] - [2022-07-23] +### Added +- Added a table to the bottom of each score sheet, shows all the player scores, delayed by thirty seconds. + +### Changed +- Changed the URIs for all the share pages. + +### 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/app/Http/Controllers/Game.php b/app/Http/Controllers/Game.php index 296ddad..47fac07 100644 --- a/app/Http/Controllers/Game.php +++ b/app/Http/Controllers/Game.php @@ -155,6 +155,47 @@ 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 = []; + 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) { $this->boostrap($request); 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/config/app/config.php b/config/app/config.php index 515adc3..010cb37 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', - 'release_date' => '22nd July 2022' + 'version' => '0.7.0', + 'release_date' => '23rd July 2022' ]; 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 0968c41..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 @@ -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( + '/public/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') { @@ -301,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 @@ -331,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/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') { 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 @@ +
Name | +Score | +
---|---|
{{ $__score['name'] }} | +{{ $__score['score'] }} | +