<?php
namespace App\EventSubscriber\Contest;
use App\Entity\Notification;
use App\Entity\Transaction;
use App\Event\Contest\ContestDeclinedEvent;
use App\Factory\TransactionFactory;
use App\Helper\PlayerHelper;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ContestDeclinedEventSubscriber implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $entityManager, private PlayerHelper $playerHelper,
private TransactionFactory $transactionFactory
) {
}
public function onContestDeclined(ContestDeclinedEvent $contestDeclinedEvent): void
{
$contest = $contestDeclinedEvent->getContest();
$player = $contestDeclinedEvent->getPlayer();
$notification = (new Notification())
->setType(Notification::CONTEST_DECLINED_TYPE)
->setContest($contest)
->setPlayer($contest->getCreatedBy())
->setMessage(sprintf(
'Le joueur %s a décliné votre défi sur %s et vous avez été remboursé.',
/* @phpstan-ignore-next-line */
$player->getUser()->getUsername(),
$contest->getGame()->getName()
))
;
$this->entityManager->persist($notification);
$this->playerHelper->updateActivity($player, ContestDeclinedEvent::class);
// the creator gets refunded
$this->transactionFactory
->forPlayer($contest->getCreatedBy())
->givePs($contest->getBet())
->because(Transaction::CONTEST_DECLINED_TYPE)
->save()
;
$this->entityManager->flush();
}
public static function getSubscribedEvents(): array
{
return [
ContestDeclinedEvent::class => 'onContestDeclined',
];
}
}