Merge branch 'refs/heads/pr/90' into next
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / data / conversation / message / ConversationMessageAction.class.php
index fb54eefb9765231e3e2bc6f3e106f33f96243eb8..00f0b05a1e98986876b4b98350719b6e2c763929 100644 (file)
@@ -27,7 +27,6 @@ use wcf\system\user\notification\object\ConversationMessageUserNotificationObjec
 use wcf\system\user\notification\UserNotificationHandler;
 use wcf\system\user\storage\UserStorageHandler;
 use wcf\system\WCF;
-use wcf\util\MessageUtil;
 use wcf\util\StringUtil;
 
 /**
@@ -36,9 +35,7 @@ use wcf\util\StringUtil;
  * @author     Marcel Werk
  * @copyright  2001-2016 WoltLab GmbH
  * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package    com.woltlab.wcf.conversation
- * @subpackage data.conversation.message
- * @category   Community Framework
+ * @package    WoltLabSuite\Core\Data\Conversation\Message
  * 
  * @method     ConversationMessageEditor[]     getObjects()
  * @method     ConversationMessageEditor       getSingleObject()
@@ -71,6 +68,8 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
         * @return      ConversationMessage
         */
        public function create() {
+               if (!isset($this->parameters['data']['enableHtml'])) $this->parameters['data']['enableHtml'] = 1;
+               
                // count attachments
                if (isset($this->parameters['attachmentHandler']) && $this->parameters['attachmentHandler'] !== null) {
                        $this->parameters['data']['attachments'] = count($this->parameters['attachmentHandler']);
@@ -90,9 +89,8 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                }
                
                if (!empty($this->parameters['htmlInputProcessor'])) {
-                       /** @var HtmlInputProcessor $htmlInputProcessor */
-                       $htmlInputProcessor = $this->parameters['htmlInputProcessor'];
-                       $this->parameters['data']['message'] = $htmlInputProcessor->getHtml();
+                       /** @noinspection PhpUndefinedMethodInspection */
+                       $this->parameters['data']['message'] = $this->parameters['htmlInputProcessor']->getHtml();
                }
                
                // create message
@@ -101,7 +99,7 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                $messageEditor = new ConversationMessageEditor($message);
                
                // get conversation
-               $conversation = (isset($this->parameters['converation']) ? $this->parameters['converation'] : new Conversation($message->conversationID));
+               $conversation = (isset($this->parameters['conversation']) ? $this->parameters['conversation'] : new Conversation($message->conversationID));
                $conversationEditor = new ConversationEditor($conversation);
                
                if (empty($this->parameters['isFirstPost'])) {
@@ -147,7 +145,7 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                UserStorageHandler::getInstance()->reset($conversation->getParticipantIDs(), 'unreadConversationCount');
                
                // update search index
-               SearchIndexManager::getInstance()->add('com.woltlab.wcf.conversation.message', $message->messageID, $message->message, (!empty($this->parameters['isFirstPost']) ? $conversation->subject : ''), $message->time, $message->userID, $message->username);
+               SearchIndexManager::getInstance()->set('com.woltlab.wcf.conversation.message', $message->messageID, $message->message, (!empty($this->parameters['isFirstPost']) ? $conversation->subject : ''), $message->time, $message->userID, $message->username);
                
                // update attachments
                if (isset($this->parameters['attachmentHandler']) && $this->parameters['attachmentHandler'] !== null) {
@@ -156,10 +154,13 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                }
                
                // save embedded objects
-               if (MessageEmbeddedObjectManager::getInstance()->registerObjects('com.woltlab.wcf.conversation.message', $message->messageID, $message->message)) {
-                       $messageEditor->update([
-                               'hasEmbeddedObjects' => 1
-                       ]);
+               if (!empty($this->parameters['htmlInputProcessor'])) {
+                       /** @noinspection PhpUndefinedMethodInspection */
+                       $this->parameters['htmlInputProcessor']->setObjectID($message->messageID);
+                       
+                       if (MessageEmbeddedObjectManager::getInstance()->registerObjects($this->parameters['htmlInputProcessor'])) {
+                               $messageEditor->update(['hasEmbeddedObjects' => 1]);
+                       }
                }
                
                // clear quotes
@@ -181,18 +182,26 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                        $this->parameters['data']['attachments'] = count($this->parameters['attachmentHandler']);
                }
                
+               if (!empty($this->parameters['htmlInputProcessor'])) {
+                       /** @noinspection PhpUndefinedMethodInspection */
+                       $this->parameters['data']['message'] = $this->parameters['htmlInputProcessor']->getHtml();
+               }
+               
                parent::update();
                
                // update search index / embedded objects
                if (isset($this->parameters['data']) && isset($this->parameters['data']['message'])) {
                        foreach ($this->getObjects() as $message) {
                                $conversation = $message->getConversation();
-                               SearchIndexManager::getInstance()->update('com.woltlab.wcf.conversation.message', $message->messageID, $this->parameters['data']['message'], ($conversation->firstMessageID == $message->messageID ? $conversation->subject : ''), $message->time, $message->userID, $message->username);
+                               SearchIndexManager::getInstance()->set('com.woltlab.wcf.conversation.message', $message->messageID, $this->parameters['data']['message'], ($conversation->firstMessageID == $message->messageID ? $conversation->subject : ''), $message->time, $message->userID, $message->username);
                                
-                               if ($message->hasEmbeddedObjects != MessageEmbeddedObjectManager::getInstance()->registerObjects('com.woltlab.wcf.conversation.message', $message->messageID, $this->parameters['data']['message'])) {
-                                       $message->update([
-                                               'hasEmbeddedObjects' => ($message->hasEmbeddedObjects ? 0 : 1)
-                                       ]);
+                               if (!empty($this->parameters['htmlInputProcessor'])) {
+                                       /** @noinspection PhpUndefinedMethodInspection */
+                                       $this->parameters['htmlInputProcessor']->setObjectID($message->messageID);
+                                       
+                                       if ($message->hasEmbeddedObjects != MessageEmbeddedObjectManager::getInstance()->registerObjects($this->parameters['htmlInputProcessor'])) {
+                                               $message->update(['hasEmbeddedObjects' => ($message->hasEmbeddedObjects ? 0 : 1)]);
+                                       }
                                }
                        }
                }
@@ -223,7 +232,7 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                
                if (!empty($this->objectIDs)) {
                        // delete notifications
-                       UserNotificationHandler::getInstance()->deleteNotifications('conversationMessage', 'com.woltlab.wcf.conversation.message.notification', [], $this->objectIDs);
+                       UserNotificationHandler::getInstance()->removeNotifications('com.woltlab.wcf.conversation.message.notification', $this->objectIDs);
                        
                        // update search index
                        SearchIndexManager::getInstance()->delete('com.woltlab.wcf.conversation.message', $this->objectIDs);
@@ -247,7 +256,7 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
         * @inheritDoc
         */
        public function validateQuickReply() {
-               QuickReplyManager::getInstance()->setAllowedBBCodes(explode(',', WCF::getSession()->getPermission('user.message.allowedBBCodes')));
+               QuickReplyManager::getInstance()->setDisallowedBBCodes(explode(',', WCF::getSession()->getPermission('user.message.disallowedBBCodes')));
                QuickReplyManager::getInstance()->validateParameters($this, $this->parameters, Conversation::class);
        }
        
@@ -342,14 +351,14 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                if (!$this->message->canEdit()) {
                        throw new PermissionDeniedException();
                }
+               
+               BBCodeHandler::getInstance()->setDisallowedBBCodes(explode(',', WCF::getSession()->getPermission('user.message.disallowedBBCodes')));
        }
        
        /**
         * @inheritDoc
         */
        public function beginEdit() {
-               BBCodeHandler::getInstance()->setAllowedBBCodes(explode(',', WCF::getSession()->getPermission('user.message.allowedBBCodes')));
-               
                WCF::getTPL()->assign([
                        'defaultSmilies' => SmileyCache::getInstance()->getCategorySmilies(),
                        'message' => $this->message,
@@ -390,23 +399,24 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                
                $this->validateBeginEdit();
                
-               $this->validateMessage($this->conversation, $this->getHtmlInputProcessor($this->parameters['data']['message']));
+               $this->validateMessage($this->conversation, $this->getHtmlInputProcessor($this->parameters['data']['message'], $this->message->messageID));
        }
        
        /**
         * @inheritDoc
         */
        public function save() {
-               $data = [
-                       //'message' => PreParser::getInstance()->parse(MessageUtil::stripCrap($this->parameters['data']['message']), explode(',', WCF::getSession()->getPermission('user.message.allowedBBCodes')))
-               ];
+               $data = [];
                
                if (!$this->message->getConversation()->isDraft) {
                        $data['lastEditTime'] = TIME_NOW;
                        $data['editCount'] = $this->message->editCount + 1;
                }
                // execute update action
-               $action = new ConversationMessageAction([$this->message], 'update', ['data' => $data]);
+               $action = new ConversationMessageAction([$this->message], 'update', [
+                       'data' => $data,
+                       'htmlInputProcessor' => $this->getHtmlInputProcessor()
+               ]);
                $action->executeAction();
                
                // load new message
@@ -475,12 +485,13 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
         * @inheritDoc
         */
        public function validateMessage(DatabaseObject $container, HtmlInputProcessor $htmlInputProcessor) {
-               /*if (mb_strlen($message) > WCF::getSession()->getPermission('user.conversation.maxLength')) {
+               $message = $htmlInputProcessor->getTextContent();
+               if (mb_strlen($message) > WCF::getSession()->getPermission('user.conversation.maxLength')) {
                        throw new UserInputException('message', WCF::getLanguage()->getDynamicVariable('wcf.message.error.tooLong', ['maxTextLength' => WCF::getSession()->getPermission('user.conversation.maxLength')]));
                }
                
                // search for disallowed bbcodes
-               $disallowedBBCodes = BBCodeParser::getInstance()->validateBBCodes($message, explode(',', WCF::getSession()->getPermission('user.message.allowedBBCodes')));
+               $disallowedBBCodes = $htmlInputProcessor->validate();
                if (!empty($disallowedBBCodes)) {
                        throw new UserInputException('text', WCF::getLanguage()->getDynamicVariable('wcf.message.error.disallowedBBCodes', ['disallowedBBCodes' => $disallowedBBCodes]));
                }
@@ -491,7 +502,7 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
                        if ($result) {
                                throw new UserInputException('message', WCF::getLanguage()->getDynamicVariable('wcf.message.error.censoredWordsFound', ['censoredWords' => $result]));
                        }
-               }*/
+               }
        }
        
        /**
@@ -641,13 +652,13 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
        /**
         * @inheritDoc
         */
-       public function getHtmlInputProcessor($message = null) {
+       public function getHtmlInputProcessor($message = null, $objectID = 0) {
                if ($message === null) {
                        return $this->htmlInputProcessor;
                }
                
                $this->htmlInputProcessor = new HtmlInputProcessor();
-               $this->htmlInputProcessor->process($message);
+               $this->htmlInputProcessor->process($message, 'com.woltlab.wcf.conversation.message', $objectID);
                
                return $this->htmlInputProcessor;
        }