src/Subscriber/User/ActivityFeedSubscriber.php line 215

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber\User;
  3. use App\Dictionary\PaymentType;
  4. use App\Entity\ActivityFeed;
  5. use App\Entity\BalanceMember;
  6. use App\Event\Content\CommentCreatedEvent;
  7. use App\Event\Content\ContentPublishedEvent;
  8. use App\Event\Guestbook\GuestbookCommentChangedEvent;
  9. use App\Event\Guestbook\GuestbookEntryAcceptedEvent;
  10. use App\Event\Guestbook\GuestbookEntryCreatedEvent;
  11. use App\Event\Guestbook\GuestbookEntryHideEvent;
  12. use App\Event\Guestbook\GuestbookEntrySpamEvent;
  13. use App\Event\Messenger\NewMessageEvent;
  14. use App\Event\Payment\PaymentCreatedEvent;
  15. use App\Event\Payment\PurchaseCreatedEvent;
  16. use App\Event\User\FriendshipRequestedEvent;
  17. use App\Event\User\LivecamOnlineEvent;
  18. use App\Event\User\LoginCreatedEvent;
  19. use App\Event\User\MemberCreatedEvent;
  20. use App\Event\User\ProfileVisitEvent;
  21. use App\Service\ActivityFeedService;
  22. use App\Service\Content\ContentService;
  23. use App\Service\MembersIgnoredService;
  24. use App\Service\User\BalanceMemberService;
  25. use App\Service\User\FriendshipService;
  26. use Frivol\Common\Dict\ActivityFeedType;
  27. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  28. class ActivityFeedSubscriber implements EventSubscriberInterface
  29. {
  30.     protected ActivityFeedService $service;
  31.     protected MembersIgnoredService $ignoreService;
  32.     protected FriendshipService $friendshipService;
  33.     protected ContentService $contentService;
  34.     protected BalanceMemberService $balanceMemberService;
  35.     public function __construct(
  36.         ActivityFeedService $activityFeedMembersIgnoredService $ignoreServiceFriendshipService $friendshipService,
  37.         ContentService $contentServiceBalanceMemberService $balanceMemberService)
  38.     {
  39.         $this->service $activityFeed;
  40.         $this->ignoreService $ignoreService;
  41.         $this->friendshipService $friendshipService;
  42.         $this->contentService $contentService;
  43.         $this->balanceMemberService $balanceMemberService;
  44.     }
  45.     public static function getSubscribedEvents(): array
  46.     {
  47.         return [
  48.             LoginCreatedEvent::class => [
  49.                 ['onLoginCreateActivityFeed'0],
  50.             ],
  51.             PaymentCreatedEvent::class => [
  52.                 ['onPaymentCreateActivityFeed'0],
  53.             ],
  54.             ProfileVisitEvent::class => [
  55.                 ['onProfileVisitCreateActivityFeed'0],
  56.             ],
  57.             GuestbookEntryAcceptedEvent::class => [
  58.                 ['addActivityOnGuestbookEntryAccept'0],
  59.             ],
  60.             GuestbookEntryCreatedEvent::class => [
  61.                 ['addActivityOnNewGuestbookEntry'0],
  62.             ],
  63.             GuestbookEntryHideEvent::class => [
  64.                 ['deleteActivityOnGuestbookHide'0],
  65.             ],
  66.             GuestbookEntrySpamEvent::class => [
  67.                 ['deleteActivityOnGuestbookSpam'0],
  68.             ],
  69.             GuestbookCommentChangedEvent::class => [
  70.                 ['handleActivityOnGuestbookCommentChange'0],
  71.             ],
  72.             CommentCreatedEvent::class => [
  73.                 ['addActivityOnContentComment'0],
  74.             ],
  75.             FriendshipRequestedEvent::class => [
  76.                 ['onFriendshipRequestCreateActivityFeed'0],
  77.             ],
  78.             ContentPublishedEvent::class => [
  79.                 ['onContentPublishedCreateActivityFeed'0],
  80.             ],
  81.             LivecamOnlineEvent::class => [
  82.                 ['onWebcamOnlineCreateActivityFeed'2],
  83.             ],
  84.             MemberCreatedEvent::class => [
  85.                 ['onMemberCreatedCreateActivityFeed'0],
  86.             ],
  87.             NewMessageEvent::class => [
  88.                 ['onNewMessageCreateActivity'0],
  89.             ],
  90.             PurchaseCreatedEvent::class => [
  91.                 ['onBalanceMemberCreateContentPurchaseActivity'0],
  92.             ],
  93.         ];
  94.     }
  95.     public function onMemberCreatedCreateActivityFeed(MemberCreatedEvent $event): void
  96.     {
  97.         $member $event->getMember();
  98.         if ($member->getAccount()->hasWebmaster() || $member->getIsAmateur()) {
  99.             return;
  100.         }
  101.         $activity $this->service->createRegistrationCompletedActivity($member);
  102.         $this->service->storeEntity($activity);
  103.     }
  104.     public function onWebcamOnlineCreateActivityFeed(LivecamOnlineEvent $event): void
  105.     {
  106.         $member $event->getMember();
  107.         $activity $this->service->createWebcamOnlineActivity($member);
  108.         $this->service->storeActivity($activity);
  109.     }
  110.     public function onLoginCreateActivityFeed(LoginCreatedEvent $event): void
  111.     {
  112.         $member $event->getLogin()->getAccount()->getMember();
  113.         if (!$member || $this->ignoreService->isIgnored($member)) {
  114.             return;
  115.         }
  116.         if (!$this->service->canStoreNewActivity($member->getId(), ActivityFeedType::LOGIN)) {
  117.             return;
  118.         }
  119.         $activity $this->service->createLoginActivity($member);
  120.         $this->service->storeEntity($activity);
  121.         // $friends = $this->friendshipService->getOnlineFriendsIndex($member, 1, 50)->getQuery()->getResult();
  122.         // $newActivities = $this->service->createFriendLoginActivities($member, $friends);
  123.         // foreach ($newActivities as $activity) {
  124.         //    $this->service->storeEntity($activity, false);
  125.         // }
  126.         // $this->service->delayedFlush();
  127.     }
  128.     public function onPaymentCreateActivityFeed(PaymentCreatedEvent $event): void
  129.     {
  130.         $payment $event->getPayment();
  131.         if (PaymentType::BOOKING !== $payment->getType()) {
  132.             return;
  133.         }
  134.         $member $payment->getAccount()->getMember();
  135.         $entity $this->service->createEntityByMember($memberActivityFeedType::CONTENT_PURCHASE);
  136.         $entity->setCreatedAt($event->getPayment()->getCreatedAt());
  137.         $entity->setSpecs([
  138.             'paymentId' => $payment->getId(),
  139.             'method' => $payment->getMethod(),
  140.             'amount' => $payment->getAmount(),
  141.         ]);
  142.         $this->service->storeEntity($entity);
  143.     }
  144.     public function onBalanceMemberCreateContentPurchaseActivity(PurchaseCreatedEvent $event): void
  145.     {
  146.         /** @var BalanceMember $balanceMember */
  147.         $balanceMemberIds $event->getPurchase()->getBalanceMember();
  148.         if (null === $balanceMember $this->balanceMemberService->findById(array_pop($balanceMemberIds))) {
  149.             return;
  150.         }
  151.         if (!$balanceMember->isTypeOutput()) {
  152.             return;
  153.         }
  154.         if (null === $content $this->contentService->getContentById($event->getPurchasable()->getReferenceId())) {
  155.             return;
  156.         }
  157.         $activity null;
  158.         if ($content->isImageset()) {
  159.             $activity $this->service->createContentImagesetPurchaseActivity($balanceMember->getMember(), $content);
  160.         }
  161.         if ($content->isVideo()) {
  162.             $activity $this->service->createContentVideoPurchaseActivity($balanceMember->getMember(), $content);
  163.         }
  164.         $amateurActivity $this->service->createMemberActivityActivity($balanceMember->getMember());
  165.         if (null === $activity) {
  166.             return;
  167.         }
  168.         $this->service->storeEntity($activityfalse);
  169.         $this->service->storeEntity($amateurActivity);
  170.     }
  171.     public function addActivityOnNewGuestbookEntry(GuestbookEntryCreatedEvent $event): void
  172.     {
  173.         $activity $this->service->createGuestbookEntryActivity($event->getEntry());
  174.         $this->service->storeEntity($activity);
  175.     }
  176.     public function addActivityOnGuestbookEntryAccept(GuestbookEntryAcceptedEvent $event): void
  177.     {
  178.         $activity $this->service->createGuestbookEntryActivity($event->getEntry());
  179.         $this->service->storeEntity($activity);
  180.     }
  181.     public function deleteActivityOnGuestbookHide(GuestbookEntryHideEvent $event): void
  182.     {
  183.         if (false === $event->getNewHiddenState()) {
  184.             $this->service->removeActivitiesForGuestbookEntry($event->getEntry());
  185.         }
  186.     }
  187.     public function deleteActivityOnGuestbookSpam(GuestbookEntrySpamEvent $event): void
  188.     {
  189.         if (true === $event->getNewSpamState()) {
  190.             $this->service->removeActivitiesForGuestbookEntry($event->getEntry());
  191.         }
  192.     }
  193.     public function handleActivityOnGuestbookCommentChange(GuestbookCommentChangedEvent $event): void
  194.     {
  195.         $comment $event->getEntry()->getComment();
  196.         $presentActivity $this->service->getRepository()->findActivityByGuestbookEntryComment($event->getEntry());
  197.         if (('' === $comment || null === $comment) && $presentActivity instanceof ActivityFeed) {
  198.             $this->service->removeEntity($presentActivity);
  199.             return;
  200.         }
  201.         if (null === $presentActivity && strlen($comment) > 5) {
  202.             $activity $this->service->createGuestbookCommentActivity($event->getEntry());
  203.             $this->service->storeActivity($activity);
  204.         }
  205.     }
  206.     public function addActivityOnContentComment(CommentCreatedEvent $event): void
  207.     {
  208.         $presentActivity $this->service
  209.             ->getRepository()
  210.             ->findContentCommentActivitiesByContentComment($event->getComment());
  211.         if (null !== $presentActivity) {
  212.             return;
  213.         }
  214.         $af $this->service->createContentCommentActivity($event->getComment());
  215.         if ($af) {
  216.             $this->service->storeActivity($af);
  217.         }
  218.     }
  219.     public function onProfileVisitCreateActivityFeed(ProfileVisitEvent $event): void
  220.     {
  221.         if ($event->getVisitor() === $event->getProfileOwner()) {
  222.             // ignore self visits
  223.             return;
  224.         }
  225.         $activity $this->service->createEntityByMember($event->getVisitor(), ActivityFeedType::PROFILE_VISIT);
  226.         $activity->setVisibleTo($event->getProfileOwner());
  227.         $this->service->storeEntity($activity);
  228.     }
  229.     public function onFriendshipRequestCreateActivityFeed(FriendshipRequestedEvent $event): void
  230.     {
  231.         $sender $event->getFriendship()->getOwnerMember();
  232.         $recipient $event->getFriendship()->getTargetMember();
  233.         $entity $this->service->createFriendshipAskActivity($sender$recipient);
  234.         $this->service->storeActivity($entity);
  235.     }
  236.     public function onContentPublishedCreateActivityFeed(ContentPublishedEvent $event): void
  237.     {
  238.         $content $event->getContent();
  239.         if (!$content->isPublished()) {
  240.             throw new \DomainException('Content not published.');
  241.         }
  242.         $author $event->getAuthor();
  243.         if (!$author) {
  244.             throw new \DomainException('Missing author on published content.');
  245.         }
  246.         $activity $this->service->createContentPublishedActivity($author$content);
  247.         $this->service->storeActivity($activity);
  248.         if (null !== $activity $this->service->createContentVideoPublishedActivity($author$content)) {
  249.             $this->service->storeActivity($activity);
  250.         }
  251.         if (null !== $activity $this->service->createContentImagesetPublishedActivity($author$content)) {
  252.             $this->service->storeActivity($activity);
  253.         }
  254.     }
  255.     public function onNewMessageCreateActivity(NewMessageEvent $event): void
  256.     {
  257.         if ((null === $sender $event->getSender()) || (null === $conversationMessage $event->getEntity())) {
  258.             return;
  259.         }
  260.         if (null === $recipient $conversationMessage->getConversation()?->getPartner($sender)) {
  261.             return;
  262.         }
  263.         $activity $this->service->createNewMessageActivity($sender$recipient);
  264.         $this->service->storeActivity($activity);
  265.     }
  266. }