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

namespace XF\Service\Post;

use
XF\Entity\Post;
use
XF\Service\AbstractNotifier;

class
Notifier extends AbstractNotifier
{
   
/**
     * @var Post
     */
   
protected $post;

    protected
$actionType;

    public function
__construct(\XF\App $app, Post $post, $actionType)
    {
       
parent::__construct($app);

        switch (
$actionType)
        {
            case
'reply':
            case
'thread':
                break;

            default:
                throw new \
InvalidArgumentException("Unknown action type '$actionType'");
        }

       
$this->actionType = $actionType;
       
$this->post = $post;
    }

    public static function
createForJob(array $extraData)
    {
       
$post = \XF::app()->find('XF:Post', $extraData['postId'], ['Thread', 'Thread.Forum']);
        if (!
$post)
        {
            return
null;
        }

        return \
XF::service('XF:Post\Notifier', $post, $extraData['actionType']);
    }

    protected function
getExtraJobData()
    {
        return [
           
'postId' => $this->post->post_id,
           
'actionType' => $this->actionType
       
];
    }

    protected function
loadNotifiers()
    {
       
$notifiers = [
           
'quote' => $this->app->notifier('XF:Post\Quote', $this->post),
           
'mention' => $this->app->notifier('XF:Post\Mention', $this->post),
           
'forumWatch' => $this->app->notifier('XF:Post\ForumWatch', $this->post, $this->actionType),
        ];

       
// if this is not the last post, then another notification would have been triggered already
       
if ($this->post->isLastPost())
        {
           
$notifiers['threadWatch'] = $this->app->notifier('XF:Post\ThreadWatch', $this->post, $this->actionType);
        }

        return
$notifiers;
    }

    protected function
loadExtraUserData(array $users)
    {
       
$permCombinationIds = [];
        foreach (
$users AS $user)
        {
           
$id = $user->permission_combination_id;
           
$permCombinationIds[$id] = $id;
        }

       
$this->app->permissionCache()->cacheMultipleContentPermsForContent(
           
$permCombinationIds,
           
'node', $this->post->Thread->node_id
       
);
    }

    protected function
canUserViewContent(\XF\Entity\User $user)
    {
        return \
XF::asVisitor(
           
$user,
            function() { return
$this->post->canView(); }
        );
    }

    public function
skipUsersWatchingForum(\XF\Entity\Forum $forum)
    {
       
$watchers = $this->db()->fetchAll("
            SELECT user_id, send_alert, send_email
            FROM xf_forum_watch
            WHERE node_id = ?
                AND (send_alert = 1 OR send_email = 1)
        "
, $forum->node_id);

        foreach (
$watchers AS $watcher)
        {
            if (
$watcher['send_alert'])
            {
               
$this->setUserAsAlerted($watcher['user_id']);
            }
            if (
$watcher['send_email'])
            {
               
$this->setUserAsEmailed($watcher['user_id']);
            }
        }
    }
}