2 namespace wcf\system\conversation
;
3 use wcf\system\database\util\PreparedStatementConditionBuilder
;
4 use wcf\system\user\storage\UserStorageHandler
;
5 use wcf\system\SingletonFactory
;
9 * Handles the number of conversations and unread conversations of the active user.
12 * @copyright 2001-2019 WoltLab GmbH
13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14 * @package WoltLabSuite\Core\System\Conversation
16 class ConversationHandler
extends SingletonFactory
{
18 * number of unread conversations
21 protected $unreadConversationCount = [];
24 * number of conversations
27 protected $conversationCount = [];
30 * Returns the number of unread conversations for given user.
32 * @param integer $userID
33 * @param boolean $skipCache
36 public function getUnreadConversationCount($userID = null, $skipCache = false) {
37 if ($userID === null) $userID = WCF
::getUser()->userID
;
39 if (!isset($this->unreadConversationCount
[$userID]) ||
$skipCache) {
40 $this->unreadConversationCount
[$userID] = 0;
43 UserStorageHandler
::getInstance()->loadStorage([$userID]);
46 $data = UserStorageHandler
::getInstance()->getStorage([$userID], 'unreadConversationCount');
48 // cache does not exist or is outdated
49 if ($data[$userID] === null ||
$skipCache) {
50 $conditionBuilder = new PreparedStatementConditionBuilder();
51 $conditionBuilder->add('conversation.conversationID = conversation_to_user.conversationID');
52 $conditionBuilder->add('conversation_to_user.participantID = ?', [$userID]);
53 $conditionBuilder->add('conversation_to_user.hideConversation = 0');
54 $conditionBuilder->add('conversation_to_user.lastVisitTime < conversation.lastPostTime');
55 $conditionBuilder->add('conversation_to_user.leftAt = 0');
57 $sql = "SELECT COUNT(*) AS count
58 FROM wcf".WCF_N
."_conversation_to_user conversation_to_user,
59 wcf".WCF_N
."_conversation conversation
61 $statement = WCF
::getDB()->prepareStatement($sql);
62 $statement->execute($conditionBuilder->getParameters());
63 $row = $statement->fetchArray();
64 $this->unreadConversationCount
[$userID] = $row['count'];
66 // update storage data
67 UserStorageHandler
::getInstance()->update($userID, 'unreadConversationCount', serialize($this->unreadConversationCount
[$userID]));
70 $this->unreadConversationCount
[$userID] = unserialize($data[$userID]);
74 return $this->unreadConversationCount
[$userID];
78 * Returns the number of conversations for given user.
80 * @param integer $userID
83 public function getConversationCount($userID = null) {
84 if ($userID === null) $userID = WCF
::getUser()->userID
;
86 if (!isset($this->conversationCount
[$userID])) {
87 $this->conversationCount
[$userID] = 0;
90 UserStorageHandler
::getInstance()->loadStorage([$userID]);
93 $data = UserStorageHandler
::getInstance()->getStorage([$userID], 'conversationCount');
95 // cache does not exist or is outdated
96 if ($data[$userID] === null) {
97 $conditionBuilder1 = new PreparedStatementConditionBuilder();
98 $conditionBuilder1->add('conversation_to_user.participantID = ?', [$userID]);
99 $conditionBuilder1->add('conversation_to_user.hideConversation IN (0,1)');
100 $conditionBuilder2 = new PreparedStatementConditionBuilder();
101 $conditionBuilder2->add('conversation.userID = ?', [$userID]);
102 $conditionBuilder2->add('conversation.isDraft = 1');
104 $sql = "SELECT (SELECT COUNT(*)
105 FROM wcf".WCF_N
."_conversation_to_user conversation_to_user
106 ".$conditionBuilder1->__toString().")
109 FROM wcf".WCF_N
."_conversation conversation
110 ".$conditionBuilder2->__toString().") AS count";
111 $statement = WCF
::getDB()->prepareStatement($sql);
112 $statement->execute(array_merge($conditionBuilder1->getParameters(), $conditionBuilder2->getParameters()));
113 $row = $statement->fetchArray();
114 $this->conversationCount
[$userID] = $row['count'];
116 // update storage data
117 UserStorageHandler
::getInstance()->update($userID, 'conversationCount', serialize($this->conversationCount
[$userID]));
120 $this->conversationCount
[$userID] = unserialize($data[$userID]);
124 return $this->conversationCount
[$userID];