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

namespace XF\Service\Report;

use
XF\Entity\Report;
use
XF\Entity\ReportComment;

class
Notifier extends \XF\Service\AbstractService
{
   
/**
     * @var Report
     */
   
protected $report;

   
/**
     * @var ReportComment
     */
   
protected $comment;

    protected
$notifyMentioned = [];

    protected
$usersAlerted = [];

    public function
__construct(\XF\App $app, Report $report, ReportComment $comment)
    {
       
parent::__construct($app);
       
$this->report = $report;
       
$this->comment = $comment;
    }

    public function
getReport()
    {
        return
$this->report;
    }

    public function
getComment()
    {
        return
$this->comment;
    }

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

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

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

       
$mentionUsers = $this->getNotifyMentioned();
        foreach (
$mentionUsers AS $k => $userId)
        {
            if (isset(
$notifiableUsers[$userId]))
            {
               
$user = $notifiableUsers[$userId];
                if (\
XF::asVisitor($user, function() { return $this->report->canView(); }))
                {
                   
$this->sendMentionNotification($user);
                }
            }
            unset(
$mentionUsers[$k]);
        }
       
$this->notifyMentioned = [];
    }

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

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

       
$users = $users->toArray();
        foreach (
$users AS $k => $user)
        {
            if (!\
XF::asVisitor($user, function() { return $this->report->canView(); }))
            {
                unset(
$users[$k]);
            }
        }

        return
$users;
    }

    protected function
sendMentionNotification(\XF\Entity\User $user)
    {
       
$comment = $this->comment;

        if (empty(
$this->usersAlerted[$user->user_id]) && ($user->user_id != $comment->user_id))
        {
           
/** @var \XF\Repository\UserAlert $alertRepo */
           
$alertRepo = $this->app->repository('XF:UserAlert');
           
$alerted = $alertRepo->alert(
               
$user,
               
$comment->user_id,
               
$comment->username,
               
'report',
               
$comment->report_id,
               
'mention',
                [
                   
'comment' => $comment->toArray()
                ],
                [
'autoRead' => false]
            );
            if (
$alerted)
            {
               
$this->usersAlerted[$user->user_id] = true;
                return
true;
            }
        }

        return
false;
    }
}