feature/MAPG-235-basic-challenge-mode #48

Merged
balazs merged 43 commits from feature/MAPG-235-basic-challenge-mode into develop 2021-05-28 20:41:09 +02:00
8 changed files with 36 additions and 38 deletions
Showing only changes of commit 7792f1c3ff - Show all commits

View File

@ -1,7 +1,7 @@
CREATE TABLE `challenges` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`token` int(10) unsigned NOT NULL,
`timer_sec` int(10) unsigned,
`time_limit` int(10) unsigned,
`no_move` tinyint(1) NOT NULL DEFAULT 0,
`no_pan` tinyint(1) NOT NULL DEFAULT 0,
`no_zoom` tinyint(1) NOT NULL DEFAULT 0,
@ -13,7 +13,7 @@ CREATE TABLE `user_in_challenge` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`challenge_id` int(10) unsigned NOT NULL,
`round` smallint(5) signed NOT NULL DEFAULT 0,
`current_round` smallint(5) signed NOT NULL DEFAULT 0,
`time_left` int(10) unsigned,
`is_owner` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
@ -27,13 +27,13 @@ CREATE TABLE `place_in_challenge` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`place_id` int(10) unsigned NOT NULL,
`challenge_id` int(10) unsigned NOT NULL,
`order` smallint(5) unsigned NOT NULL,
`round` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `place_id` (`place_id`),
KEY `challenge_id` (`challenge_id`),
CONSTRAINT `place_in_challenge_place_id` FOREIGN KEY (`place_id`) REFERENCES `places` (`id`),
CONSTRAINT `place_in_challenge_challenge_id` FOREIGN KEY (`challenge_id`) REFERENCES `challenges` (`id`),
CONSTRAINT `unique_order_in_challenge` UNIQUE (`order`, `challenge_id`)
CONSTRAINT `unique_order_in_challenge` UNIQUE (`round`, `challenge_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
CREATE TABLE `guesses` (

View File

@ -113,7 +113,7 @@ class GameController
$challenge->setCreatedDate(new DateTime());
if($this->request->post('timerEnabled') !== null && $this->request->post('timeLimit') !== null) {
balazs marked this conversation as resolved Outdated
Outdated
Review

Maybe a do..while would be better here because the token calculation should not be repeated.

        do {
            // if a challenge with the same token already exists
            $challengeToken = rand();
        } while ($this->challengeRepository->getByToken($challengeToken));
Maybe a do..while would be better here because the token calculation should not be repeated. ```php do { // if a challenge with the same token already exists $challengeToken = rand(); } while ($this->challengeRepository->getByToken($challengeToken)); ```

My eye is twitching when variables are used outside of the scope of {}, but it's different in PHP, so it can be refactored.

My eye is twitching when variables are used outside of the scope of {}, but it's different in PHP, so it can be refactored.
$challenge->setTimerSec($this->request->post('timeLimit'));
$challenge->setTimeLimit($this->request->post('timeLimit'));
}
if($this->request->post('noMove') !== null) {
Outdated
Review

I think rand() should be called with explicit arguments, otherwise a number is returned between 0 and getrandmax() and getrandmax() is platform-dependent.

On the other hand maybe the token could be generated as the room ID for multiplayer. Then a fixed length string would be generated - I used bin2hex(random_bytes(3)) for room ID. I guess it was intentional to use integer indexes in the DB, it could be be more efficient but I already used string indexes for other purpose.

I think rand() should be called with explicit arguments, otherwise a number is returned between 0 and getrandmax() and getrandmax() is platform-dependent. On the other hand maybe the token could be generated as the room ID for multiplayer. Then a fixed length string would be generated - I used bin2hex(random_bytes(3)) for room ID. I guess it was intentional to use integer indexes in the DB, it could be be more efficient but I already used string indexes for other purpose.

Good point. However I don't think it would cause any problems. I thought it would be better to use 4 byte length integers instead of 3 bytes for more possible ids, because challenges are normally not getting deleted.

Good point. However I don't think it would cause any problems. I thought it would be better to use 4 byte length integers instead of 3 bytes for more possible ids, because challenges are normally not getting deleted.

I've read your comment again, and I see that bin2hex returns a string. Yes I thought it would perform better just to use an integer instead.
I can also see now, that on Windows the getrandmax() is only 32767, which is far too small. I am going to replace it with mt_rand() if that's fine for you.

I've read your comment again, and I see that bin2hex returns a string. Yes I thought it would perform better just to use an integer instead. I can also see now, that on Windows the getrandmax() is only 32767, which is far too small. I am going to replace it with mt_rand() if that's fine for you.
$challenge->setNoMove(true);
@ -135,7 +135,7 @@ class GameController
$userInChallenge = new UserInChallenge();
$userInChallenge->setUserId($userId);
$userInChallenge->setChallenge($challenge);
$userInChallenge->setTimeLeft($challenge->getTimerSec());
$userInChallenge->setTimeLeft($challenge->getTimeLimit());
$userInChallenge->setIsOwner(true);
$this->pdm->saveToDb($userInChallenge);
@ -147,12 +147,12 @@ class GameController
$places = $this->placeRepository->getRandomNPlaces($mapId, static::NUMBER_OF_ROUNDS, $userId);
$order = 1;
$round = 0;
foreach ($places as $place) {
$placeInChallenge = new PlaceInChallenge();
$placeInChallenge->setPlace($place);
$placeInChallenge->setChallenge($challenge);
$placeInChallenge->setOrder($order++);
$placeInChallenge->setRound($round++);
$this->pdm->saveToDb($placeInChallenge);
}
@ -246,7 +246,7 @@ class GameController
$userInChallenge = new UserInChallenge();
$userInChallenge->setUserId($userId);
$userInChallenge->setChallenge($challenge);
$userInChallenge->setTimeLeft($challenge->getTimerSec());
$userInChallenge->setTimeLeft($challenge->getTimeLimit());
$this->pdm->saveToDb($userInChallenge);
}

View File

@ -153,7 +153,7 @@ class GameFlowController
}
$challenge = $userInChallenge->getChallenge();
$currentRound = $userInChallenge->getRound();
$currentRound = $userInChallenge->getCurrentRound();
$currentPlace = $this->placeRepository->getByRoundInChallenge($challenge, $currentRound);
$response = [];
@ -316,7 +316,7 @@ class GameFlowController
}
$challenge = $userInChallenge->getChallenge();
$currentRound = $userInChallenge->getRound();
$currentRound = $userInChallenge->getCurrentRound();
$currentPlace = $this->placeRepository->getByRoundInChallenge($challenge, $currentRound);
$map = $this->mapRepository->getByPlace($currentPlace);
$placeInChallenge = $this->placeInChallengeRepository->getByPlaceAndChallenge($currentPlace, $challenge);
@ -355,7 +355,7 @@ class GameFlowController
// update round
$nextRound = $currentRound + 1;
$userInChallenge->setRound($nextRound);
$userInChallenge->setCurrentRound($nextRound);
$this->pdm->saveToDb($userInChallenge);
if ($nextRound < static::NUMBER_OF_ROUNDS) {

View File

@ -6,13 +6,13 @@ class Challenge extends Model
{
protected static string $table = 'challenges';
protected static array $fields = ['token', 'timer_sec', 'no_move', 'no_pan', 'no_zoom', 'created'];
protected static array $fields = ['token', 'time_limit', 'no_move', 'no_pan', 'no_zoom', 'created'];
protected static array $relations = [];
private int $token;
private ?int $timerSec = null;
private ?int $timeLimit = null;
private bool $noMove = false;
@ -27,10 +27,10 @@ class Challenge extends Model
$this->token = $token;
}
public function setTimerSec(?int $timerSec): void
public function setTimeLimit(?int $timeLimit): void
{
if(isset($timerSec)) {
$this->timerSec = $timerSec;
if(isset($timeLimit)) {
$this->timeLimit = $timeLimit;
}
}
@ -64,9 +64,9 @@ class Challenge extends Model
return $this->token;
}
public function getTimerSec(): ?int
public function getTimeLimit(): ?int
{
return $this->timerSec;
return $this->timeLimit;
}
public function getNoMove(): bool

View File

@ -4,7 +4,7 @@ class PlaceInChallenge extends Model
{
protected static string $table = 'place_in_challenge';
protected static array $fields = ['place_id', 'challenge_id', 'order'];
protected static array $fields = ['place_id', 'challenge_id', 'round'];
protected static array $relations = ['place' => Place::class, 'challenge' => Challenge::class];
@ -16,7 +16,7 @@ class PlaceInChallenge extends Model
private ?int $challengeId = null;
private int $order;
private int $round;
public function setPlace(Place $place): void
{
@ -38,9 +38,9 @@ class PlaceInChallenge extends Model
$this->challengeId = $challengeId;
}
public function setOrder(int $order): void
public function setRound(int $round): void
{
$this->order = $order;
$this->round = $round;
}
public function getPlace(): ?Place
@ -63,8 +63,8 @@ class PlaceInChallenge extends Model
return $this->challengeId;
}
public function getOrder(): int
public function getRound(): int
{
return $this->order;
return $this->round;
}
}

View File

@ -4,7 +4,7 @@ class UserInChallenge extends Model
{
protected static string $table = 'user_in_challenge';
protected static array $fields = ['user_id', 'challenge_id', 'round', 'time_left', 'is_owner'];
protected static array $fields = ['user_id', 'challenge_id', 'current_round', 'time_left', 'is_owner'];
protected static array $relations = ['user' => User::class, 'challenge' => Challenge::class];
@ -16,7 +16,7 @@ class UserInChallenge extends Model
private ?int $challengeId = null;
private int $round = 0;
private int $currentRound = 0;
private ?int $timeLeft = null;
@ -42,9 +42,9 @@ class UserInChallenge extends Model
$this->challengeId = $challengeId;
}
public function setRound(int $round): void
public function setCurrentRound(int $currentRound): void
{
$this->round = $round;
$this->currentRound = $currentRound;
}
public function setTimeLeft(?int $timeLeft): void
@ -79,9 +79,9 @@ class UserInChallenge extends Model
return $this->challengeId;
}
public function getRound(): int
public function getCurrentRound(): int
{
return $this->round;
return $this->currentRound;
}
public function getTimeLeft(): ?int

View File

@ -45,7 +45,7 @@ class GuessRepository
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guesses', 'place_in_challenge_id']);
$select->where('user_id', '=', $userId);
$select->where('challenge_id', '=', $challenge->getId());
$select->orderBy('order');
$select->orderBy('round');
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
}
@ -55,19 +55,17 @@ class GuessRepository
$select = new Select(\Container::$dbConnection);
// $select->innerJoin('place_in_challenge', ['guesses', 'place_in_challenge_id'], '=', ['place_in_challenge', 'id']);
$select->where('challenge_id', '=', $challenge->getId());
$select->orderBy('order');
$select->orderBy('round');
yield from $this->pdm->selectMultipleFromDb($select, Guess::class, true);
}
public function getAllInChallengeByRound(int $round, Challenge $challenge): Generator
{
$order = $round + 1;
$select = new Select(\Container::$dbConnection);
$select->innerJoin('place_in_challenge', ['guesses', 'place_in_challenge_id'], '=', ['place_in_challenge', 'id']);
$select->where('challenge_id', '=', $challenge->getId());
$select->where('order', '=', $order);
$select->where('round', '=', $round);
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
}

View File

@ -183,7 +183,7 @@ class PlaceRepository
$select = new Select(\Container::$dbConnection);
$select->innerJoin('place_in_challenge', ['places', 'id'], '=', ['place_in_challenge', 'place_id']);
$select->where('challenge_id', '=', $challenge->getId());
$select->orderBy('order');
$select->orderBy('round');
$select->limit(1, $round);
return $this->pdm->selectFromDb($select, Place::class);
@ -194,7 +194,7 @@ class PlaceRepository
$select = new Select(\Container::$dbConnection);
$select->innerJoin('place_in_challenge', ['places', 'id'], '=', ['place_in_challenge', 'place_id']);
$select->where('challenge_id', '=', $challenge->getId());
$select->orderBy('order');
$select->orderBy('round');
yield from $this->pdm->selectMultipleFromDb($select, Place::class);
}