MAPG-235 challengeInitialData implemented and first round is loaded

This commit is contained in:
Balázs Vigh 2021-05-12 15:34:15 +02:00
parent d7147b30d6
commit 5daed10036
5 changed files with 77 additions and 2 deletions

View File

@ -13,7 +13,7 @@ CREATE TABLE `user_in_challenge` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL, `user_id` int(10) unsigned NOT NULL,
`challenge_id` int(10) unsigned NOT NULL, `challenge_id` int(10) unsigned NOT NULL,
`round` smallint(5) signed NOT NULL DEFAULT -1, `round` smallint(5) signed NOT NULL DEFAULT 0,
`score` int(10) unsigned NOT NULL DEFAULT 0, `score` int(10) unsigned NOT NULL DEFAULT 0,
`time_left` int(10) unsigned, `time_left` int(10) unsigned,
`is_owner` tinyint(1) NOT NULL DEFAULT 0, `is_owner` tinyint(1) NOT NULL DEFAULT 0,

View File

@ -6,10 +6,13 @@ use MapGuesser\Util\Geo\Position;
use MapGuesser\Response\JsonContent; use MapGuesser\Response\JsonContent;
use MapGuesser\Interfaces\Response\IContent; use MapGuesser\Interfaces\Response\IContent;
use MapGuesser\Multi\MultiConnector; use MapGuesser\Multi\MultiConnector;
use MapGuesser\PersistentData\Model\UserInChallenge;
use MapGuesser\PersistentData\PersistentDataManager; use MapGuesser\PersistentData\PersistentDataManager;
use MapGuesser\PersistentData\Model\UserPlayedPlace; use MapGuesser\PersistentData\Model\UserPlayedPlace;
use MapGuesser\Repository\ChallengeRepository;
use MapGuesser\Repository\MultiRoomRepository; use MapGuesser\Repository\MultiRoomRepository;
use MapGuesser\Repository\PlaceRepository; use MapGuesser\Repository\PlaceRepository;
use MapGuesser\Repository\UserInChallengeRepository;
use MapGuesser\Repository\UserPlayedPlaceRepository; use MapGuesser\Repository\UserPlayedPlaceRepository;
class GameFlowController class GameFlowController
@ -29,6 +32,10 @@ class GameFlowController
private UserPlayedPlaceRepository $userPlayedPlaceRepository; private UserPlayedPlaceRepository $userPlayedPlaceRepository;
private ChallengeRepository $challengeRepository;
private UserInChallengeRepository $userInChallengeRepository;
public function __construct(IRequest $request) public function __construct(IRequest $request)
{ {
$this->request = $request; $this->request = $request;
@ -37,6 +44,8 @@ class GameFlowController
$this->multiRoomRepository = new MultiRoomRepository(); $this->multiRoomRepository = new MultiRoomRepository();
$this->placeRepository = new PlaceRepository(); $this->placeRepository = new PlaceRepository();
$this->userPlayedPlaceRepository = new UserPlayedPlaceRepository(); $this->userPlayedPlaceRepository = new UserPlayedPlaceRepository();
$this->challengeRepository = new ChallengeRepository();
$this->userInChallengeRepository = new UserInChallengeRepository();
} }
public function initialData(): IContent public function initialData(): IContent
@ -115,6 +124,52 @@ class GameFlowController
return new JsonContent(['ok' => true]); return new JsonContent(['ok' => true]);
} }
public function challengeInitialData(): IContent
{
// TODO
$session = $this->request->session();
$userId = $session->get('userId');
$challengeToken_str = $this->request->query('challengeToken');
$challenge = $this->challengeRepository->getByTokenStr($challengeToken_str);
if (!isset($challenge)) {
return new JsonContent(['error' => 'game_not_found']);
}
$userInChallenge = $this->userInChallengeRepository->getByUserIdAndChallenge($userId, $challenge);
$currentRound = $userInChallenge->getRound();
$currentPlace = $this->placeRepository->getCurrentInChallenge($challenge, $currentRound);
$response = [];
// $last = $state['rounds'][$state['currentRound']];
// $response['place'] = [
// 'panoId' => $last['panoId'],
// 'pov' => $last['pov']->toArray()
// ];
$response['place'] = [
'panoId' => $currentPlace->getPanoIdCached(),
'pov' => [$currentPlace->getPov()->toArray()]
];
$response['history'] = [];
// for ($i = 0; $i < $state['currentRound']; ++$i) {
// $round = $state['rounds'][$i];
// $response['history'][] = [
// 'position' => $round['position']->toArray(),
// 'result' => [
// 'guessPosition' => $round['guessPosition']->toArray(),
// 'distance' => $round['distance'],
// 'score' => $round['score']
// ]
// ];
// }
return new JsonContent($response);
}
public function guess(): IContent public function guess(): IContent
{ {
$mapId = (int) $this->request->query('mapId'); $mapId = (int) $this->request->query('mapId');

View File

@ -16,7 +16,7 @@ class UserInChallenge extends Model
private ?int $challengeId = null; private ?int $challengeId = null;
private int $round = -1; private int $round = 0;
private int $score = 0; private int $score = 0;

View File

@ -2,6 +2,7 @@
use Generator; use Generator;
use MapGuesser\Database\Query\Select; use MapGuesser\Database\Query\Select;
use MapGuesser\PersistentData\Model\Challenge;
use MapGuesser\PersistentData\Model\Map; use MapGuesser\PersistentData\Model\Map;
use MapGuesser\PersistentData\Model\Place; use MapGuesser\PersistentData\Model\Place;
use MapGuesser\PersistentData\PersistentDataManager; use MapGuesser\PersistentData\PersistentDataManager;
@ -177,4 +178,14 @@ class PlaceRepository
return $places; return $places;
} }
public function getCurrentInChallenge(Challenge $challenge, int $round): ?Place
{
$select = new Select(\Container::$dbConnection);
$select->innerJoin('place_in_challenge', ['places', 'id'], '=', ['place_in_challenge', 'place_id']);
$select->orderBy('order');
$select->limit(1, $round);
return $this->pdm->selectFromDb($select, Place::class);
}
} }

View File

@ -32,6 +32,15 @@ class UserInChallengeRepository
yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class); yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class);
} }
public function getByUserIdAndChallenge(int $userId, Challenge $challenge): ?UserInChallenge
{
$select = new Select(\Container::$dbConnection);
$select->where('user_id', '=', $userId);
$select->where('challenge_id', '=', $challenge->getId());
return $this->pdm->selectFromDb($select, UserInChallenge::class);
}
public function isUserParticipatingInChallenge(int $userId, Challenge $challenge): bool public function isUserParticipatingInChallenge(int $userId, Challenge $challenge): bool
{ {
$select = new Select(\Container::$dbConnection, 'user_in_challenge'); $select = new Select(\Container::$dbConnection, 'user_in_challenge');