<?php
namespace App\Subscriber\Messenger;
use App\Dictionary\ConversationMessageType;
use App\Event\Messenger\NewMessageEvent;
use App\Event\User\MemberBlockedEvent;
use App\Service\Messenger\RouteService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class RouteSubscriber implements EventSubscriberInterface
{
protected RouteService $routeService;
/**
* RouteSubscriber constructor.
*/
public function __construct(RouteService $routeService)
{
$this->routeService = $routeService;
}
protected function getRouteService(): RouteService
{
return $this->routeService;
}
public static function getSubscribedEvents(): array
{
return [
NewMessageEvent::class => [
['onNewMessageUpdateRoute', 100],
['onNewMessageUnhideRoutes', 101],
['onNewMessageUpdateCoinValue', 102],
],
MemberBlockedEvent::class => [
['onMemberBlockedHideRoute', 100],
],
];
}
/**
* @throws \Exception
*/
public function onMemberBlockedHideRoute(MemberBlockedEvent $event)
{
$entity = $event->getMemberBlocked();
$service = $this->getRouteService();
$route = $service->getRouteBySenderAndRecipient($entity->getTarget(), $entity->getOwner(), false);
if ($route) {
$service->hideRoute($route);
}
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onNewMessageUpdateRoute(NewMessageEvent $event)
{
$message = $event->getEntity();
$conversation = $message->getConversation();
$routes = $conversation->getRoutes();
$routesToUpdate = $routes;
if (ConversationMessageType::CONTENT_PURCHASE == $message->getType()) {
$routesToUpdate = [];
foreach ($routes as $route) {
if ($route->getFromMember()->getId() == $event->getSender()->getId()) {
$routesToUpdate[] = $route;
}
}
}
foreach ($routesToUpdate as $route) {
$this->getRouteService()->updateLastMessage($route, $message, false);
}
$this->getRouteService()->delayedFlush();
}
public function onNewMessageUnhideRoutes(NewMessageEvent $event)
{
$sender = $event->getSender();
$conversation = $event->getEntity()->getConversation();
$manager = $this->getRouteService();
$recipientRoute = $manager->getRouteByRecipient($conversation, $sender);
if ($recipientRoute) {
if ($recipientRoute->getHidden()) {
// additionally to unhide the route, we have to reset the hidden_at date, which will lead
// to -all- messages in that conversation being visible again.
// came up with the trash filter.
$recipientRoute->setHiddenAt(null);
}
$manager->unhideRoute($recipientRoute);
}
$senderRoute = $manager->getRouteBySender($conversation, $sender);
if ($senderRoute) {
$manager->unhideRoute($senderRoute);
}
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onNewMessageUpdateCoinValue(NewMessageEvent $event)
{
$msg = $event->getEntity();
if (!$msg->getCoins()) {
return;
}
$conversation = $msg->getConversation();
$sender = $event->getSender();
$routeService = $this->getRouteService();
$route = $routeService->getRouteBySender($conversation, $sender);
if ($route) {
$route->increaseCoinValue($msg->getCoins());
$routeService->storeEntity($route);
}
}
}