<?php
namespace App\Subscriber\UserGroups;
use App\Event\UserGroups\GroupScoreUpdateEvent;
use App\Event\UserGroups\UserGroupInviteEvent;
use App\Service\Messenger\MessengerService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class UserGroupInviteSubscriber implements EventSubscriberInterface
{
/**
* @var EventDispatcherInterface
*/
protected $dispatcher;
/**
* @var MessengerService
*/
protected $messenger;
/**
* UserGroupInviteSubscriber constructor.
*/
public function __construct(EventDispatcherInterface $dispatcher, MessengerService $messenger)
{
$this->dispatcher = $dispatcher;
$this->messenger = $messenger;
}
protected function getDispatcher(): EventDispatcherInterface
{
return $this->dispatcher;
}
protected function getMessenger(): MessengerService
{
return $this->messenger;
}
public static function getSubscribedEvents(): array
{
return [
UserGroupInviteEvent::class => [
['onGroupInviteSendDirectMessage', 0],
],
];
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onGroupInviteSendDirectMessage(UserGroupInviteEvent $event): bool
{
$invite = $event->getEntity();
$group = $invite->getUserGroup();
$target = $invite->getMember();
$creator = $invite->getCreatedMember();
$message = sprintf($this->getMessageFormat(), $target->getUsername(), $group->getName());
$this->getMessenger()->sendDirectMessage($creator, $target, $message);
$event = new GroupScoreUpdateEvent($group, $event->getScore());
$this->getDispatcher()->dispatch($event);
return true;
}
protected function getMessageFormat(): string
{
return 'Hallo %s! Ich lade dich ein, der Gruppe %s beizutreten. Um die Einladung anzunehmen, '.
'klicke bitte oben auf "Gruppen" und beachte den Hinweis.';
}
}