new: usr: a new feature came up - the abandoned plays can be restored, if both users are registered users #7
This commit is contained in:
@@ -13,8 +13,10 @@ namespace App\Util;
|
||||
use App\Entity\Grid;
|
||||
use App\Entity\GridRow;
|
||||
use App\Entity\PlayedGame;
|
||||
use App\Entity\Step;
|
||||
use App\Interfaces\RpcManagerInterface;
|
||||
use App\Repository\PlayedGameRepository;
|
||||
use App\Repository\StepRepository;
|
||||
use DateTime;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Exception;
|
||||
@@ -36,14 +38,15 @@ use Symfony\Component\Uid\Uuid;
|
||||
*/
|
||||
class RpcManager implements RpcManagerInterface
|
||||
{
|
||||
private const int ROWS = 16;
|
||||
private const int ROWS = 16;
|
||||
private const int COLS = 16;
|
||||
private const int MINES = 51;
|
||||
|
||||
public function __construct(
|
||||
private readonly EntityManagerInterface $entityManager,
|
||||
private readonly EntityManagerInterface $em,
|
||||
private readonly LoggerInterface $logger,
|
||||
private readonly PlayedGameRepository $playedGameRepository,
|
||||
private readonly StepRepository $stepRepository,
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -56,8 +59,17 @@ class RpcManager implements RpcManagerInterface
|
||||
if (null === $playedGame) {
|
||||
try {
|
||||
return base64_encode(json_encode([
|
||||
'users' => null,
|
||||
'revealedCells' => null,
|
||||
'users' => null,
|
||||
'revealedCells' => null,
|
||||
'lastStep' => ['red' => null, 'blue' => null],
|
||||
'mostRecentStep' => null,
|
||||
'redPoints' => 0,
|
||||
'bluePoints' => 0,
|
||||
'redBonusPoints' => 0,
|
||||
'blueBonusPoints' => 0,
|
||||
'redBonusStats' => [],
|
||||
'blueBonusStats' => [],
|
||||
'gameFinished' => false,
|
||||
], JSON_THROW_ON_ERROR));
|
||||
} catch (JsonException $e) {
|
||||
throw new RuntimeException($e->getMessage());
|
||||
@@ -68,15 +80,42 @@ class RpcManager implements RpcManagerInterface
|
||||
$revealedCells = $this->aggregateRevealedCells($playedGame);
|
||||
|
||||
try {
|
||||
$redPoints = $playedGame->getRedPoints() ?? 0;
|
||||
$bluePoints = $playedGame->getBluePoints() ?? 0;
|
||||
$gameFinished = $redPoints > 25 || $bluePoints > 25;
|
||||
|
||||
return base64_encode(json_encode([
|
||||
'users' => $users,
|
||||
'revealedCells' => $revealedCells,
|
||||
'users' => $users,
|
||||
'revealedCells' => $revealedCells,
|
||||
'lastStep' => $this->getLastStepPerPlayer($playedGame),
|
||||
'mostRecentStep' => $this->getMostRecentStep($playedGame),
|
||||
'redPoints' => $redPoints,
|
||||
'bluePoints' => $bluePoints,
|
||||
'redBonusPoints' => $playedGame->getRedBonusPoints() ?? 0,
|
||||
'blueBonusPoints' => $playedGame->getBlueBonusPoints() ?? 0,
|
||||
'redBonusStats' => $playedGame->getRedBonusStats() ?? [],
|
||||
'blueBonusStats' => $playedGame->getBlueBonusStats() ?? [],
|
||||
'gameFinished' => $gameFinished,
|
||||
], JSON_THROW_ON_ERROR));
|
||||
} catch (JsonException $e) {
|
||||
throw new RuntimeException($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most recent step of the game (if any).
|
||||
* Returns an array with player, row, col information or null if no steps exist.
|
||||
*/
|
||||
private function getMostRecentStep(PlayedGame $playedGame): ?array
|
||||
{
|
||||
try {
|
||||
return $this->stepToArray($this->stepRepository->findMostRecent($playedGame));
|
||||
} catch (Exception $e) {
|
||||
$this->logger->error('Error getting most recent step: ' . $e->getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public function saveGrid(string $gameAssoc): bool
|
||||
{
|
||||
$existingGame = $this->playedGameRepository->findOneByGameAssoc($gameAssoc);
|
||||
@@ -94,20 +133,20 @@ class RpcManager implements RpcManagerInterface
|
||||
$gridRow = new GridRow();
|
||||
$gridRow->setGridCol($row);
|
||||
$gridRow->setGrid($grid);
|
||||
$this->entityManager->persist($gridRow);
|
||||
$this->em->persist($gridRow);
|
||||
}
|
||||
|
||||
$grid->setPlayedGame($playedGame);
|
||||
$this->entityManager->persist($grid);
|
||||
$this->em->persist($grid);
|
||||
|
||||
$playedGame->setGameAssoc($gameAssoc);
|
||||
$playedGame->setUuid(Uuid::fromString($gameAssoc));
|
||||
$playedGame->setGrid($grid);
|
||||
$playedGame->setCreated(new DateTime());
|
||||
$playedGame->setUpdated(new DateTime());
|
||||
$this->entityManager->persist($playedGame);
|
||||
$this->em->persist($playedGame);
|
||||
|
||||
$this->entityManager->flush();
|
||||
$this->em->flush();
|
||||
} catch (Exception $e) {
|
||||
$this->logger->error($e->getMessage());
|
||||
}
|
||||
@@ -128,6 +167,7 @@ class RpcManager implements RpcManagerInterface
|
||||
|
||||
/**
|
||||
* Fisher-Yates shuffle
|
||||
*
|
||||
* @see https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
|
||||
*/
|
||||
for ($i = count($set) - 1; $i > 0; $i--) {
|
||||
@@ -185,6 +225,37 @@ class RpcManager implements RpcManagerInterface
|
||||
return $all;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last step for each player.
|
||||
* Returns an array with 'red' and 'blue' keys, each containing row, col information or null if no steps exist for
|
||||
* that player.
|
||||
*/
|
||||
private function getLastStepPerPlayer(PlayedGame $playedGame): array
|
||||
{
|
||||
try {
|
||||
return [
|
||||
'red' => $this->stepToArray($this->stepRepository->findMostRecentForPlayer($playedGame, 'red')),
|
||||
'blue' => $this->stepToArray($this->stepRepository->findMostRecentForPlayer($playedGame, 'blue')),
|
||||
];
|
||||
} catch (Exception $e) {
|
||||
$this->logger->error('Error getting last step per player: ' . $e->getMessage());
|
||||
return ['red' => null, 'blue' => null];
|
||||
}
|
||||
}
|
||||
|
||||
private function stepToArray(?Step $step): ?array
|
||||
{
|
||||
if (null === $step) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'player' => $step->getPlayer(),
|
||||
'row' => (int)$step->getRow(),
|
||||
'col' => (int)$step->getCol(),
|
||||
];
|
||||
}
|
||||
|
||||
private function getUserCollection(PlayedGame $playedGame): array
|
||||
{
|
||||
return [
|
||||
|
||||
Reference in New Issue
Block a user