src/EventSubscriber/Tournament/TournamentEndedEventSubscriber.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Tournament;
  3. use App\Entity\ContestPlayer;
  4. use App\Entity\Phase;
  5. use App\Entity\Transaction;
  6. use App\Event\Tournament\TournamentEndedEvent;
  7. use App\Factory\TransactionFactory;
  8. use App\Helper\ContestHelper;
  9. use App\Helper\TournamentHelper;
  10. use App\Service\TournamentService;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use LogicException;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Throwable;
  15. class TournamentEndedEventSubscriber implements EventSubscriberInterface
  16. {
  17.     public function __construct(
  18.         private EntityManagerInterface $entityManager, private TransactionFactory $transactionFactory,
  19.         private TournamentService $tournamentService
  20.     ) {
  21.     }
  22.     public function onTournamentEndedEvent(TournamentEndedEvent $tournamentEndedEvent): void
  23.     {
  24.         $tournament $tournamentEndedEvent->getTournament();
  25.         $jackpot $this->tournamentService->calculateJackpot($tournament);
  26.         /** @var Phase $penultimatePhase the before last phase */
  27.         $penultimatePhase array_reverse($tournament->getPhases()->toArray())[1];
  28.         /** @var Phase|null $beforePenultimatePhase */
  29.         $beforePenultimatePhase array_reverse($tournament->getPhases()->toArray())[2] ?? null;
  30.         $finalContest TournamentHelper::getFinalContest($tournament);
  31.         foreach ($tournament->getPrizes() as $prize) {
  32.             $rewardedPs $jackpot 100 $prize->getValue();
  33.             if ($prize->getRank() === 1) {
  34.                 $player $finalContest->getWinner();
  35.                 $this->transactionFactory
  36.                     ->forPlayer($player)
  37.                     ->givePs($rewardedPs)
  38.                     ->because(Transaction::TOURNAMENT_WINNER_TYPE)
  39.                     ->save()
  40.                 ;
  41.                 $prize->addPlayer($player);
  42.                 continue;
  43.             }
  44.             if ($prize->getRank() === 2) {
  45.                 $contestPlayers $finalContest->getContestPlayers()->filter(function (ContestPlayer $contestPlayer) use ($finalContest) {
  46.                     return $contestPlayer->getPlayer() !== $finalContest->getWinner();
  47.                 });
  48.                 if ($contestPlayers->isEmpty()) {
  49.                     continue;
  50.                 }
  51.                 /** @var ContestPlayer $contestPlayer */
  52.                 $contestPlayer $contestPlayers->first();
  53.                 $player $contestPlayer->getPlayer();
  54.                 $this->transactionFactory
  55.                     ->forPlayer($player)
  56.                     ->givePs($rewardedPs)
  57.                     ->because(Transaction::TOURNAMENT_WINNER_TYPE)
  58.                     ->save()
  59.                 ;
  60.                 $prize->addPlayer($player);
  61.                 continue;
  62.             }
  63.             if ($prize->getRank() === 3) {
  64.                 $players null;
  65.                 foreach ($penultimatePhase->getContests() as $contest) {
  66.                     try {
  67.                         $players[] = ContestHelper::getLoser($contest);
  68.                     } catch (Throwable) {
  69.                         continue;
  70.                     }
  71.                 }
  72.                 if (empty($players)) {
  73.                     continue;
  74.                 }
  75.                 foreach ($players as $player) {
  76.                     $this->transactionFactory
  77.                         ->forPlayer($player)
  78.                         ->givePs($rewardedPs)
  79.                         ->because(Transaction::TOURNAMENT_WINNER_TYPE)
  80.                         ->save()
  81.                     ;
  82.                     $prize->addPlayer($player);
  83.                 }
  84.                 continue;
  85.             }
  86.             if ($prize->getRank() === 4) {
  87.                 // handle tournament that does not have before penultimate phase
  88.                 if (!$beforePenultimatePhase) {
  89.                     continue;
  90.                 }
  91.                 $players null;
  92.                 // loops through all contests of the tournament
  93.                 foreach ($beforePenultimatePhase->getContests() as $contest) {
  94.                     try {
  95.                         $players[] = ContestHelper::getLoser($contest);
  96.                     } catch (Throwable) {
  97.                         continue;
  98.                     }
  99.                 }
  100.                 if (empty($players)) {
  101.                     continue;
  102.                 }
  103.                 foreach ($players as $player) {
  104.                     $this->transactionFactory
  105.                         ->forPlayer($player)
  106.                         ->givePs($rewardedPs)
  107.                         ->because(Transaction::TOURNAMENT_WINNER_TYPE)
  108.                         ->save()
  109.                     ;
  110.                     $prize->addPlayer($player);
  111.                 }
  112.                 continue;
  113.             }
  114.             throw new LogicException('Unsupported prize ranking passed: ' $prize->getRank());
  115.         }
  116.         $this->entityManager->flush();
  117.     }
  118.     public static function getSubscribedEvents(): array
  119.     {
  120.         return [
  121.             TournamentEndedEvent::class => 'onTournamentEndedEvent',
  122.         ];
  123.     }
  124. }