/**
  * Removes a participant from a conversation.
  */
 public function removeParticipant()
 {
     $this->conversation->removeParticipant($this->parameters['userID']);
     $this->conversation->updateParticipantSummary();
     ConversationModificationLogHandler::getInstance()->removeParticipant($this->conversation->getDecoratedObject(), $this->parameters['userID']);
     // reset storage
     UserStorageHandler::getInstance()->reset(array($this->parameters['userID']), 'unreadConversationCount');
     return array('userID' => $this->parameters['userID']);
 }
 /**
  * @see	\wcf\data\AbstractDatabaseObjectAction::create()
  */
 public function create()
 {
     // create conversation
     $data = $this->parameters['data'];
     $data['lastPosterID'] = $data['userID'];
     $data['lastPoster'] = $data['username'];
     $data['lastPostTime'] = $data['time'];
     // count participants
     if (!empty($this->parameters['participants'])) {
         $data['participants'] = count($this->parameters['participants']);
     }
     // count attachments
     if (isset($this->parameters['attachmentHandler']) && $this->parameters['attachmentHandler'] !== null) {
         $data['attachments'] = count($this->parameters['attachmentHandler']);
     }
     $conversation = call_user_func(array($this->className, 'create'), $data);
     $conversationEditor = new ConversationEditor($conversation);
     if (!$conversation->isDraft) {
         // save participants
         $conversationEditor->updateParticipants(!empty($this->parameters['participants']) ? $this->parameters['participants'] : array(), !empty($this->parameters['invisibleParticipants']) ? $this->parameters['invisibleParticipants'] : array());
         // add author
         $conversationEditor->updateParticipants(array($data['userID']));
         // update conversation count
         UserStorageHandler::getInstance()->reset($conversation->getParticipantIDs(), 'conversationCount');
         // mark conversation as read for the author
         $sql = "UPDATE\twcf" . WCF_N . "_conversation_to_user\n\t\t\t\tSET\tlastVisitTime = ?\n\t\t\t\tWHERE\tparticipantID = ?\n\t\t\t\t\tAND conversationID = ?";
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute(array($data['time'], $data['userID'], $conversation->conversationID));
     } else {
         // update conversation count
         UserStorageHandler::getInstance()->reset(array($data['userID']), 'conversationCount');
     }
     // update participant summary
     $conversationEditor->updateParticipantSummary();
     // create message
     $messageData = $this->parameters['messageData'];
     $messageData['conversationID'] = $conversation->conversationID;
     $messageData['time'] = $this->parameters['data']['time'];
     $messageData['userID'] = $this->parameters['data']['userID'];
     $messageData['username'] = $this->parameters['data']['username'];
     $messageAction = new ConversationMessageAction(array(), 'create', array('data' => $messageData, 'conversation' => $conversation, 'isFirstPost' => true, 'attachmentHandler' => isset($this->parameters['attachmentHandler']) ? $this->parameters['attachmentHandler'] : null));
     $resultValues = $messageAction->executeAction();
     // update first message id
     $conversationEditor->update(array('firstMessageID' => $resultValues['returnValues']->messageID));
     $conversation->setFirstMessage($resultValues['returnValues']);
     if (!$conversation->isDraft) {
         // fire notification event
         $notificationRecipients = array_merge(!empty($this->parameters['participants']) ? $this->parameters['participants'] : array(), !empty($this->parameters['invisibleParticipants']) ? $this->parameters['invisibleParticipants'] : array());
         UserNotificationHandler::getInstance()->fireEvent('conversation', 'com.woltlab.wcf.conversation.notification', new ConversationUserNotificationObject($conversation), $notificationRecipients);
     }
     return $conversation;
 }
 /**
  * Updates the participant summary of the given conversations.
  * 
  * @param	array<integer>		$conversationIDs
  */
 public static function updateParticipantSummaries(array $conversationIDs)
 {
     $conversationList = new ConversationList();
     $conversationList->getConditionBuilder()->add('conversation.conversationID IN (?)', array($conversationIDs));
     $conversationList->readObjects();
     foreach ($conversationList as $conversation) {
         $editor = new ConversationEditor($conversation);
         $editor->updateParticipantSummary();
     }
 }
 /**
  * @see	\wcf\data\AbstractDatabaseObjectAction::create()
  */
 public function create()
 {
     // count attachments
     if (isset($this->parameters['attachmentHandler']) && $this->parameters['attachmentHandler'] !== null) {
         $this->parameters['data']['attachments'] = count($this->parameters['attachmentHandler']);
     }
     if (LOG_IP_ADDRESS) {
         // add ip address
         if (!isset($this->parameters['data']['ipAddress'])) {
             $this->parameters['data']['ipAddress'] = WCF::getSession()->ipAddress;
         }
     } else {
         // do not track ip address
         if (isset($this->parameters['data']['ipAddress'])) {
             unset($this->parameters['data']['ipAddress']);
         }
     }
     // create message
     $message = parent::create();
     $messageEditor = new ConversationMessageEditor($message);
     // get conversation
     $conversation = isset($this->parameters['converation']) ? $this->parameters['converation'] : new Conversation($message->conversationID);
     $conversationEditor = new ConversationEditor($conversation);
     if (empty($this->parameters['isFirstPost'])) {
         // update last message
         $conversationEditor->addMessage($message);
         // fire notification event
         if (!$conversation->isDraft) {
             $notificationRecipients = array_diff($conversation->getParticipantIDs(true), array($message->userID));
             // don't notify message author
             if (!empty($notificationRecipients)) {
                 UserNotificationHandler::getInstance()->fireEvent('conversationMessage', 'com.woltlab.wcf.conversation.message.notification', new ConversationMessageUserNotificationObject($message), $notificationRecipients);
             }
         }
         $userConversation = Conversation::getUserConversation($conversation->conversationID, $message->userID);
         if ($userConversation !== null && $userConversation->isInvisible) {
             // make invisible participant visible
             $sql = "UPDATE\twcf" . WCF_N . "_conversation_to_user\n\t\t\t\t\tSET\tisInvisible = 0\n\t\t\t\t\tWHERE\tparticipantID = ?\n\t\t\t\t\t\tAND conversationID = ?";
             $statement = WCF::getDB()->prepareStatement($sql);
             $statement->execute(array($message->userID, $conversation->conversationID));
             $conversationEditor->updateParticipantSummary();
             $conversationEditor->updateParticipantCount();
         }
         // reset visibility if it was hidden but not left
         $sql = "UPDATE\twcf" . WCF_N . "_conversation_to_user\n\t\t\t\tSET\thideConversation = ?\n\t\t\t\tWHERE\tconversationID = ?\n\t\t\t\t\tAND hideConversation = ?";
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute(array(Conversation::STATE_DEFAULT, $conversation->conversationID, Conversation::STATE_HIDDEN));
     }
     // reset storage
     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);
     // update attachments
     if (isset($this->parameters['attachmentHandler']) && $this->parameters['attachmentHandler'] !== null) {
         $this->parameters['attachmentHandler']->updateObjectID($message->messageID);
     }
     // save embedded objects
     if (MessageEmbeddedObjectManager::getInstance()->registerObjects('com.woltlab.wcf.conversation.message', $message->messageID, $message->message)) {
         $messageEditor->update(array('hasEmbeddedObjects' => 1));
     }
     // clear quotes
     if (isset($this->parameters['removeQuoteIDs']) && !empty($this->parameters['removeQuoteIDs'])) {
         MessageQuoteManager::getInstance()->markQuotesForRemoval($this->parameters['removeQuoteIDs']);
     }
     MessageQuoteManager::getInstance()->removeMarkedQuotes();
     // return new message
     return $message;
 }
Ejemplo n.º 5
0
 /**
  * invite participant
  *
  * @param  Object  $oMbqEtPcInviteParticipant
  */
 public function inviteParticipant($oMbqEtPcInviteParticipant = null)
 {
     $oConversation = $oMbqEtPcInviteParticipant->oMbqEtPc->mbqBind['oViewableConversation']->getDecoratedObject();
     $conversationEditor = new ConversationEditor($oConversation);
     //ref wcf\data\conversation\ConversationAction::addParticipants()
     try {
         $participantIDs = Conversation::validateParticipants(implode(",", $oMbqEtPcInviteParticipant->userNames->oriValue), 'participants', $conversationEditor->getParticipantIDs(true));
     } catch (UserInputException $e) {
         MbqError::alert('', $e->getMessage(), '', MBQ_ERR_APP);
     } catch (Exception $e) {
         MbqError::alert('', $e->getMessage(), '', MBQ_ERR_APP);
     }
     // validate limit
     $newCount = $conversationEditor->participants + count($participantIDs);
     if ($newCount > WCF::getSession()->getPermission('user.conversation.maxParticipants')) {
         MbqError::alert('', 'Too many participants.', '', MBQ_ERR_APP);
     }
     $count = 0;
     $successMessage = '';
     if (!empty($participantIDs)) {
         // check for already added participants
         $data = array();
         if ($conversationEditor->isDraft) {
             $draftData = unserialize($conversationEditor->draftData);
             $draftData['participants'] = array_merge($draftData['participants'], $participantIDs);
             $data = array('data' => array('draftData' => serialize($draftData)));
         } else {
             $data = array('participants' => $participantIDs);
         }
         $conversationAction = new ConversationAction(array($conversationEditor), 'update', $data);
         $conversationAction->executeAction();
         $count = count($participantIDs);
         $successMessage = WCF::getLanguage()->getDynamicVariable('wcf.conversation.edit.addParticipants.success', array('count' => $count));
         ConversationModificationLogHandler::getInstance()->addParticipants($conversationEditor->getDecoratedObject(), $participantIDs);
         if (!$conversationEditor->isDraft) {
             // update participant summary
             $conversationEditor->updateParticipantSummary();
         }
     }
 }