src/Controller/MainController.php line 48

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use App\Repository\RoleRepository;
  11. use App\Repository\JinxRepository;
  12. use App\Repository\TeamRepository;
  13. use App\Repository\HomebrewRepository;
  14. use App\Entity\Homebrew;
  15. use App\Entity\Jinx;
  16. use App\Model\HomebrewModel;
  17. use App\Model\GameModel;
  18. class MainController extends AbstractController
  19. {
  20.     private $roleRepo;
  21.     private $jinxRepo;
  22.     private $teamRepo;
  23.     private $homebrewRepo;
  24.     private $homebrewModel;
  25.     public function __construct(
  26.         RoleRepository $roleRepo,
  27.         JinxRepository $jinxRepo,
  28.         TeamRepository $teamRepo,
  29.         HomebrewRepository $homebrewRepo,
  30.         HomebrewModel $homebrewModel
  31.     ) {
  32.         $this->roleRepo $roleRepo;
  33.         $this->jinxRepo $jinxRepo;
  34.         $this->teamRepo $teamRepo;
  35.         $this->homebrewRepo $homebrewRepo;
  36.         $this->homebrewModel $homebrewModel;
  37.     }
  38.     /**
  39.      * @Route("/", name="index_stub")
  40.      */
  41.     public function indexStubAction(Request $request): Response
  42.     {
  43.         return $this->redirectToRoute('index'$request->query->all(), 301);
  44.     }
  45.     /**
  46.      * @Route("/sheet", name="sheet_stub")
  47.      */
  48.     public function sheetStubAction(Request $request): Response
  49.     {
  50.         return $this->redirectToRoute('sheet'$request->query->all(), 301);
  51.     }
  52.     /**
  53.      * @Route("/{_locale}/", name="index")
  54.      */
  55.     public function indexAction(): Response
  56.     {
  57.         return $this->render('pages/index.html.twig');
  58.     }
  59.     /**
  60.      * @Route("/{_locale}/sheet", name="sheet")
  61.      */
  62.     public function sheetAction(
  63.         Request $request,
  64.         GameModel $gameModel,
  65.         EntityManagerInterface $em
  66.     ): Response {
  67.         $groups = [];
  68.         $jinxes = [];
  69.         $name '';
  70.         $nights = array("first"=>[], "other"=>[]);
  71.         if ($characters $request->query->get('characters')) {
  72.             $ids explode(','$characters);
  73.             foreach ($ids as $id) {
  74.                 $character $this->roleRepo->findOneBy(['identifier' => $id]);
  75.                 $team $character->getTeam();
  76.                 $teamId $team->getIdentifier();
  77.                 if (!array_key_exists($teamId$groups)) {
  78.                     $groups[$teamId] = [
  79.                         'team' => $team,
  80.                         'characters' => []
  81.                     ];
  82.                 }
  83.                 $groups[$teamId]['characters'][] = $character;
  84.                 foreach ($character->getJinxes() as $jinx) {
  85.                     if (
  86.                         in_array($jinx->getTarget()->getIdentifier(), $ids)
  87.                         && in_array($jinx->getTrick()->getIdentifier(), $ids)
  88.                     ) {
  89.                         $jinx->setActive(true);
  90.                         $jinxes[] = $jinx;
  91.                     }
  92.                 }
  93.                 $characterFirstNight $character->getFirstNight();
  94.                 $characterOtherNight $character->getOtherNight();
  95.                 if ($characterFirstNight != 0) {
  96.                     $nights['first'][] = [$characterFirstNight$character];
  97.                 }
  98.                 if ($characterOtherNight != 0) {
  99.                     $nights['other'][] = [$characterOtherNight$character];
  100.                 }
  101.             }
  102.             $name $request->query->get('name');
  103.         } else if (
  104.             ($game $request->query->get('game'))
  105.             && ($homebrew $this->homebrewRepo->findOneBy(['uuid' => $game]))
  106.         ) {
  107.             // Cache the teams so that we're not constantly looking them up.
  108.             // Might save a little processing power.
  109.             $teamMap = [];
  110.             // Work out the IDs that we're using.
  111.             $ids array_reduce($homebrew->getJson(), function (array $carry, array $character): array {
  112.                 if (
  113.                     array_key_exists('id'$character)
  114.                     && !in_array($character['id'], $carry)
  115.                     && !$this->homebrewModel->isMetaEntry($character)
  116.                 ) {
  117.                     $carry[] = $character['id'];
  118.                 }
  119.                 return $carry;
  120.             }, []);
  121.             $tempJinxes = [];
  122.             foreach ($homebrew->getJson() as $character) {
  123.                 if ($this->homebrewModel->isMetaEntry($character)) {
  124.                     $name $character['name'];
  125.                     continue;
  126.                 }
  127.                 if (array_key_exists('team'$character)) {
  128.                     $teamId $character['team'];
  129.                     if (!array_key_exists($teamId$teamMap)) {
  130.                         $teamMap[$teamId] = $this->teamRepo->findOneBy(['identifier' => $teamId]);
  131.                     }
  132.                     $team $teamMap[$teamId];
  133.                     $characterFirstNight array_key_exists('firstNight'$character) ? $character['firstNight'] : 0;
  134.                     $characterOtherNight array_key_exists('otherNight'$character) ? $character['otherNight'] : 0;
  135.                 } else {
  136.                     $characterId $this->homebrewModel->normaliseId($character['id']);
  137.                     $character $this->roleRepo->findOneBy(['identifier' => $characterId]);
  138.                     $team $character->getTeam();
  139.                     $teamId $team->getIdentifier();
  140.                     if (!in_array($characterId$ids)) {
  141.                         $ids[] = $characterId;
  142.                     }
  143.                     foreach ($character->getJinxes() as $jinx) {
  144.                         $tempJinxes[] = $jinx;
  145.                     }
  146.                     $characterFirstNight $character->getFirstNight();
  147.                     $characterOtherNight $character->getOtherNight();
  148.                 }
  149.                 // Convert any homebrew jinxes into Jinx entities. We need to
  150.                 // ensure that the character data has an ID to prevent an error
  151.                 // appearing if an older upload URL is checked.
  152.                 if (is_array($character) && array_key_exists('jinxes'$character) && array_key_exists('id'$character)) {
  153.                     $characterJinxes = [];
  154.                     foreach ($character['jinxes'] as $maybeJinx) {
  155.                         if (is_array($maybeJinx)) {
  156.                             $target = (
  157.                                 $this->roleRepo->findOneBy(['identifier' => $character['id']])
  158.                                 ?? $this->roleRepo->createTemp($character)
  159.                             );
  160.                             $trick = (
  161.                                 $this->roleRepo->findOneBy(['identifier' => $maybeJinx['id']])
  162.                                 ?? $this->roleRepo->createTemp($maybeJinx)
  163.                             );
  164.                             $jinx = (new Jinx())
  165.                                 ->setTarget($target)
  166.                                 ->setTrick($trick)
  167.                                 ->setReason($maybeJinx['reason']);
  168.                             $tempJinxes[] = $jinx;
  169.                             $characterJinxes[] = $jinx;
  170.                         } else {
  171.                             $characterJinxes[] = $maybeJinx;
  172.                         }
  173.                     }
  174.                     $character['jinxes'] = $characterJinxes;
  175.                 }
  176.                 if (!array_key_exists($teamId$groups)) {
  177.                     $groups[$teamId] = [
  178.                         'team' => $team,
  179.                         'characters' => []
  180.                     ];
  181.                 }
  182.                 $groups[$teamId]['characters'][] = $character;
  183.                 if ($characterFirstNight != 0) {
  184.                     $nights['first'][] = [$characterFirstNight$character];
  185.                 }
  186.                 if ($characterOtherNight != 0) {
  187.                     $nights['other'][] = [$characterOtherNight$character];
  188.                 }
  189.             }
  190.             foreach ($tempJinxes as $jinx) {
  191.                 if (
  192.                     in_array($jinx->getTarget()->getIdentifier(), $ids)
  193.                     && in_array($jinx->getTrick()->getIdentifier(), $ids)
  194.                 ) {
  195.                     $jinx->setActive(true);
  196.                     $jinxes[] = $jinx;
  197.                 }
  198.             }
  199.             if ((int) $request->query->get('traveller'0) !== 1) {
  200.                 unset($groups['traveller']);
  201.             }
  202.             if ((int) $request->query->get('fabled'0) !== 1) {
  203.                 unset($groups['fabled']);
  204.             }
  205.             $homebrew->setAccessed(new \DateTime());
  206.             $em->persist($homebrew);
  207.             $em->flush();
  208.         }
  209.         foreach($nights as $key => $value) {
  210.             sort($nights[$key]);
  211.             $nights[$key] = array_map(function ($elem) {
  212.                 return $elem[1];
  213.             }, $nights[$key]);
  214.         }
  215.         return $this->render('pages/sheet.html.twig', [
  216.             'name' => $name,
  217.             'groups' => $groups,
  218.             'jinxes' => $jinxes,
  219.             'nights' => $nights,
  220.             'breakdown' => $gameModel->getTransposedFeed(),
  221.         ]);
  222.     }
  223.     /**
  224.      * @Route("/{_locale}/homebrew", name="homebrew")
  225.      */
  226.     public function homebrewAction(
  227.         Request $request,
  228.         EntityManagerInterface $em,
  229.         TranslatorInterface $translator
  230.     ): Response {
  231.         if ($data json_decode($request->getContent(), true)) {
  232.             $invalidReasons = [];
  233.             if (
  234.                 !is_array($data)
  235.                 || !$this->homebrewModel->validateAllEntries($data$invalidReasons)
  236.             ) {
  237.                 return new JsonResponse([
  238.                     'success' => false,
  239.                     'message' => $translator->trans('messages.invalid_data'),
  240.                     'reasons' => $invalidReasons
  241.                 ]);
  242.             }
  243.             $homebrew = new Homebrew();
  244.             $homebrew
  245.                 ->setUuid(bin2hex(random_bytes(32)))
  246.                 ->setCreated(new \DateTime())
  247.                 ->setAccessed(new \DateTime())
  248.                 ->setJson($this->homebrewModel->filterAllEntries($data));
  249.             $em->persist($homebrew);
  250.             $em->flush();
  251.             return new JsonResponse([
  252.                 'success' => true,
  253.                 'game' => $homebrew->getUuid()
  254.             ]);
  255.         }
  256.         return new JsonResponse([
  257.             'success' => false,
  258.             'message' => $translator->trans('messages.no_data')
  259.         ]);
  260.     }
  261.     /**
  262.      * @Route("/", name="tokens_stub")
  263.      */
  264.     public function tokensStubAction(Request $request): Response
  265.     {
  266.         return $this->redirectToRoute('tokens'$request->query->all(), 301);
  267.     }
  268.     /**
  269.      * @Route("/{_locale}/tokens", name="tokens")
  270.      */
  271.     public function tokensAction(
  272.         Request $request,
  273.         RoleRepository $roleRepo,
  274.         TeamRepository $teamRepo,
  275.         TranslatorInterface $translator
  276.     ) {
  277.         $feed $roleRepo->getFeed();
  278.         $roles = [];
  279.         foreach ($teamRepo->getTeamIds(true) as $id) {
  280.             $roles[$id] = [
  281.                 'name' => $translator->trans('groups.' $id),
  282.                 'tokens' => []
  283.             ];
  284.         }
  285.         foreach ($roleRepo->getFeed() as $token) {
  286.             $team $token['team'];
  287.             if (!array_key_exists($team$roles)) {
  288.                 continue;
  289.             }
  290.             $roles[$team]['tokens'][] = $token;
  291.         }
  292.         foreach ($roles as $team => $data) {
  293.             usort($data['tokens'], function ($a$b) {
  294.                 return $a['name'] <=> $b['name'];
  295.             });
  296.         }
  297.         return $this->render('pages/tokens.html.twig', [
  298.             'roles' => $roles
  299.         ]);
  300.     }
  301. }