Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Conversation/MessageManager.php
<?php

namespace XF\Service\Conversation;

use
XF\Entity\ConversationMessage;

class
MessageManager extends \XF\Service\AbstractService
{
   
/**
     * @var ConversationMessage
     */
   
protected $conversationMessage;

    protected
$attachmentHash;

    protected
$logIp = true;

    public function
__construct(\XF\App $app, ConversationMessage $conversationMessage)
    {
       
parent::__construct($app);
       
$this->conversationMessage = $conversationMessage;
    }

    public function
getConversationMessage()
    {
        return
$this->conversationMessage;
    }

    public function
setLogIp($logIp)
    {
       
$this->logIp = $logIp;
    }

    public function
setMessage($message, $format = true, $checkValidity = true)
    {
       
$preparer = $this->getMessagePreparer($format);
       
$this->conversationMessage->message = $preparer->prepare($message, $checkValidity);
       
$this->conversationMessage->embed_metadata = $preparer->getEmbedMetadata();

        return
$preparer->pushEntityErrorIfInvalid($this->conversationMessage);
    }

   
/**
     * @param bool $format
     *
     * @return \XF\Service\Message\Preparer
     */
   
protected function getMessagePreparer($format = true)
    {
       
/** @var \XF\Service\Message\Preparer $preparer */
       
$preparer = $this->service('XF:Message\Preparer', 'conversation_message', $this->conversationMessage);
        if (!
$format)
        {
           
$preparer->disableAllFilters();
        }

        return
$preparer;
    }

    public function
setAttachmentHash($hash)
    {
       
$this->attachmentHash = $hash;
    }

    public function
checkForSpam()
    {
       
$conversationMessage = $this->conversationMessage;

       
/** @var \XF\Entity\User $user */
       
$user = $conversationMessage->User ?: $this->repository('XF:User')->getGuestUser($conversationMessage->username);
       
$message = $conversationMessage->Conversation->title . "\n" . $conversationMessage->message;

       
$checker = $this->app->spam()->contentChecker();
       
$checker->check($user, $message, [
           
'content_type' => 'conversation_message'
       
]);

       
$decision = $checker->getFinalDecision();
        switch (
$decision)
        {
            case
'moderated':
            case
'denied':
               
$checker->logSpamTrigger('conversation', null);
               
$conversationMessage->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
                break;
        }
    }

    public function
afterInsert()
    {
        if (
$this->attachmentHash)
        {
           
$this->associateAttachments($this->attachmentHash);
        }

        if (
$this->logIp)
        {
           
$ip = ($this->logIp === true ? $this->app->request()->getIp() : $this->logIp);
           
$this->writeIpLog($ip);
        }
    }

    public function
afterUpdate()
    {
        if (
$this->attachmentHash)
        {
           
$this->associateAttachments($this->attachmentHash);
        }

       
// TODO: moderator log?
        // TODO: edit history?
   
}

    protected function
associateAttachments($hash)
    {
       
$conversationMessage = $this->conversationMessage;

       
/** @var \XF\Service\Attachment\Preparer $inserter */
       
$inserter = $this->service('XF:Attachment\Preparer');
       
$associated = $inserter->associateAttachmentsWithContent($hash, 'conversation_message', $conversationMessage->message_id);
        if (
$associated)
        {
           
$conversationMessage->fastUpdate('attach_count', $conversationMessage->attach_count + $associated);
        }
    }

    protected function
writeIpLog($ip)
    {
       
$conversationMessage = $this->conversationMessage;

       
/** @var \XF\Repository\IP $ipRepo */
       
$ipRepo = $this->repository('XF:Ip');
       
$ipEnt = $ipRepo->logIp($conversationMessage->user_id, $ip, 'conversation_message', $conversationMessage->message_id);
        if (
$ipEnt)
        {
           
$conversationMessage->fastUpdate('ip_id', $ipEnt->ip_id);
        }
    }
}