src/EventSubscriber/Tournament/Contest/ContestResultCreatedEventSubscriber.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Tournament\Contest;
  3. use App\Entity\Contest;
  4. use App\Entity\Phase;
  5. use App\Event\Tournament\Contest\ContestResultCreatedEvent;
  6. use App\Event\Tournament\PhaseEndedEvent;
  7. use App\Helper\ContestHelper;
  8. use App\Helper\PhaseHelper;
  9. use App\Helper\PlayerHelper;
  10. use DateTimeImmutable;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  14. class ContestResultCreatedEventSubscriber implements EventSubscriberInterface
  15. {
  16.     public function __construct(
  17.         private EntityManagerInterface $entityManager, private PlayerHelper $playerHelper,
  18.         private EventDispatcherInterface $eventDispatcher
  19.     ) {
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             ContestResultCreatedEvent::class => 'onContestResultCreated',
  25.         ];
  26.     }
  27.     public function onContestResultCreated(ContestResultCreatedEvent $contestResultCreatedEvent): void
  28.     {
  29.         $contest $contestResultCreatedEvent->getContest();
  30.         $result $contestResultCreatedEvent->getResult();
  31.         $player $result->getPlayer();
  32.         $this->playerHelper->updateActivity($playerContestResultCreatedEvent::class);
  33.         // updates the player's xp
  34.         $player->setXp($player->getXp() + $result->getXp());
  35.         if (ContestHelper::hasAllPlayersScored($contest)) {
  36.             $highestResult ContestHelper::findHighestResult($contest);
  37.             $winner $highestResult->getPlayer();
  38.             $contest->setWinner($winner);
  39.             $winner->setXp(
  40.                 $winner->getXp() + ContestHelper::getXpToEarn($contest$winner)
  41.             );
  42.             // all players have scored so we close the contest
  43.             $contest->setStatus(Contest::CLOSED_STATUS);
  44.         } else {
  45.             $contest->setStatus(Contest::WAITING_SCORES_STATUS);
  46.         }
  47.         $this->entityManager->flush();
  48.         $phase $contest->getPhase();
  49.         if (PhaseHelper::isPhaseComplete($phase)) {
  50.             $phase
  51.                 ->setStatus(Phase::ENDED_STATUS)
  52.                 ->setEndedAt(new DateTimeImmutable())
  53.             ;
  54.             $this->eventDispatcher->dispatch(new PhaseEndedEvent($phase));
  55.         }
  56.     }
  57. }