Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/ProfilePost/Notifier.php
<?php

namespace XF\Service\ProfilePost;

use
XF\Entity\ProfilePost;
use
XF\Service\AbstractService;

class
Notifier extends AbstractService
{
    protected
$profilePost;

    protected
$notifyInsert;
    protected
$notifyMentioned = [];

    protected
$usersAlerted = [];

    public function
__construct(\XF\App $app, ProfilePost $profilePost)
    {
       
parent::__construct($app);

       
$this->profilePost = $profilePost;
    }

    public function
getNotifyInsert()
    {
        if (
$this->notifyInsert === null)
        {
           
$this->notifyInsert = [$this->profilePost->profile_user_id];
        }
        return
$this->notifyInsert;
    }

    public function
setNotifyMentioned(array $mentioned)
    {
       
$this->notifyMentioned = array_unique($mentioned);
    }

    public function
getNotifyMentioned()
    {
        return
$this->notifyMentioned;
    }

    public function
notify()
    {
       
$notifiableUsers = $this->getUsersForNotification();

       
$insertUsers = $this->getNotifyInsert();
        foreach (
$insertUsers AS $userId)
        {
            if (isset(
$notifiableUsers[$userId]))
            {
               
$this->sendNotification($notifiableUsers[$userId], 'insert');
            }
        }

       
$mentionUsers = $this->getNotifyMentioned();
        foreach (
$mentionUsers AS $userId)
        {
            if (isset(
$notifiableUsers[$userId]))
            {
               
$this->sendNotification($notifiableUsers[$userId], 'mention');
            }
        }
    }

    protected function
getUsersForNotification()
    {
       
$userIds = array_merge(
           
$this->getNotifyInsert(),
           
$this->getNotifyMentioned()
        );

       
$profilePost = $this->profilePost;
       
$users = $this->app->em()->findByIds('XF:User', $userIds, ['Profile', 'Option']);
        if (!
$users->count())
        {
            return [];
        }

       
$users = $users->toArray();
        foreach (
$users AS $id => $user)
        {
           
/** @var \XF\Entity\User $user */
           
$canView = \XF::asVisitor($user, function() use ($profilePost) { return $profilePost->canView(); });
            if (!
$canView)
            {
                unset(
$users[$id]);
            }
        }

        return
$users;
    }

    protected function
sendNotification(\XF\Entity\User $user, $action)
    {
       
$profilePost = $this->profilePost;
        if (
$user->user_id == $profilePost->user_id)
        {
            return
false;
        }

        if (empty(
$this->usersAlerted[$user->user_id]))
        {
           
/** @var \XF\Repository\UserAlert $alertRepo */
           
$alertRepo = $this->app->repository('XF:UserAlert');
           
$alerted = $alertRepo->alert(
               
$user,
               
$profilePost->user_id,
               
$profilePost->username,
               
'profile_post',
               
$profilePost->profile_post_id,
               
$action,
                [],
                [
'autoRead' => false]
            );
            if (
$alerted)
            {
               
$this->usersAlerted[$user->user_id] = true;
                return
true;
            }
        }

        return
false;
    }

}