Private
Public Access
1
0
Files
MineSeeker/src/Rpc/MineseekerRpc.php

181 lines
4.5 KiB
PHP
Raw Normal View History

<?php
namespace App\Rpc;
use App\Entity\Grid;
use App\Entity\GridRow;
use App\Entity\PlayedGame;
use Doctrine\DBAL\Driver\PDOException;
use Doctrine\ORM\EntityManager;
use Psr\Log\LoggerInterface;
use Ratchet\ConnectionInterface;
use Gos\Bundle\WebSocketBundle\RPC\RpcInterface;
use Gos\Bundle\WebSocketBundle\Router\WampRequest;
class MineseekerRpc implements RpcInterface
{
/** @var EntityManager $em */
protected $em;
protected $grid;
private $logger;
/**
* MineseekerRpc constructor.
* @param EntityManager $entityManager
*/
public function __construct(EntityManager $entityManager, LoggerInterface $logger)
{
$this->em = $entityManager;
$this->logger = $logger;
}
/**
* Name of RPC, use for pubsub router (see step3)
*
* @return string
*/
public function getName()
{
return 'mineseeker.rpc';
}
/**
* @param ConnectionInterface $connection
* @param WampRequest $request
* @param array $params
* @return boolean
*/
public function startGame(ConnectionInterface $connection, WampRequest $request, array $params)
{
return $this->saveGrid($params);
}
/**
* @param ConnectionInterface $connection
* @param WampRequest $request
* @param array $params
* @return string Json string for frontend w/ numbering consideration. (=> a number is not string)
*/
public function connectGame(ConnectionInterface $connection, WampRequest $request, array $params)
{
$grid = $this->getGrid($params);
$users = null !== $grid ? $this->getUsers($params) : null;
return base64_encode(json_encode(
array(
'grid' => $grid,
'users' => $users
)
));
}
/**
* @param $gameAssoc
* @return array
*/
private function getGrid($gameAssoc)
{
$this->reConnect();
$getsee = array();
$this->em->clear();
$grid = $this->em
->getRepository(PlayedGame::class)
->findOneByGameAssoc($gameAssoc);
if (null !== $grid) {
foreach ($grid->getGrid()->getGridRow()->toArray() as $row) {
$getsee[] = $row->getGridCol();
}
return $getsee;
}
return null;
}
/**
* @param $gameAssoc
* @return array
*/
private function getUsers($gameAssoc)
{
$this->reConnect();
return $this->getUserCollection(
$this->em
->getRepository(PlayedGame::class)
->findOneByGameAssoc($gameAssoc)
);
}
/**
* Get user collection from PlayedGame entity
*
* @param $playedGame
* @return array
*/
private function getUserCollection($playedGame)
{
return array(
'red' => null !== $playedGame->getRed() ? $playedGame->getRed()->getUsername() : '',
'blue' => null !== $playedGame->getBlue() ? $playedGame->getBlue()->getUsername() : '',
'redAnon' => null !== $playedGame->getRedAnon() ? $playedGame->getRedAnon()->getUserName() : '',
'blueAnon' => null !== $playedGame->getBlueAnon() ? $playedGame->getBlueAnon()->getUserName() : ''
);
}
/**
* @param $data
* @return boolean
*/
private function saveGrid($data)
{
// $this->reConnect();
$playedGame = new PlayedGame();
$grid = new Grid();
foreach (json_decode(base64_decode($data[0])) as $row) {
$gridRow = new GridRow();
$gridRow->setGridCol($row);
/** Save Row */
$gridRow->setGrid($grid);
$this->em->persist($gridRow);
}
/** Save Grid */
$grid->setPlayedGame($playedGame);
$this->em->persist($grid);
/** Save PlayedGame */
$playedGame->setGameAssoc($data[1]);
$playedGame->setGrid($grid);
$playedGame->setCreated(new \DateTime());
$playedGame->setUpdated(new \DateTime());
$this->em->persist($playedGame);
$this->em->flush();
return true;
}
/** Handle prod MySQL timeout */
private function reConnect()
{
// try {
$connection = $this->em->getConnection();
if (false === $connection->ping()) {
$connection->close();
$connection->connect();
}
// } catch(PDOException $ex) {
// $this->logger->error($ex->getMessage());
// }
}
}