/** * 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; }
/** * 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(); } } }