2 namespace wcf\system\conversation
;
3 use wcf\system\database\util\PreparedStatementConditionBuilder
;
4 use wcf\system\package\PackageDependencyHandler
;
5 use wcf\system\user\storage\UserStorageHandler
;
6 use wcf\system\SingletonFactory
;
9 class ConversationHandler
extends SingletonFactory
{
11 * number of unread conversations
14 protected $unreadConversationCount = array();
17 * number of conversations
20 protected $conversationCount = array();
23 * Returns the number of unread conversations for given user.
25 * @param integer $userID
28 public function getUnreadConversationCount($userID = null) {
29 if ($userID === null) $userID = WCF
::getUser()->userID
;
31 if (!isset($this->unreadConversationCount
[$userID])) {
32 $this->unreadConversationCount
[$userID] = 0;
35 UserStorageHandler
::getInstance()->loadStorage(array($userID));
38 $data = UserStorageHandler
::getInstance()->getStorage(array($userID), 'unreadConversationCount');
40 // cache does not exist or is outdated
41 if ($data[$userID] === null) {
42 $conditionBuilder = new PreparedStatementConditionBuilder();
43 $conditionBuilder->add('conversation.conversationID = conversation_to_user.conversationID');
44 $conditionBuilder->add('conversation_to_user.participantID = ?', array($userID));
45 $conditionBuilder->add('conversation_to_user.hideConversation = 0');
46 $conditionBuilder->add('conversation_to_user.lastVisitTime < conversation.lastPostTime');
48 $sql = "SELECT COUNT(*) AS count
49 FROM wcf".WCF_N
."_conversation_to_user conversation_to_user,
50 wcf".WCF_N
."_conversation conversation
51 ".$conditionBuilder->__toString();
52 $statement = WCF
::getDB()->prepareStatement($sql);
53 $statement->execute($conditionBuilder->getParameters());
54 $row = $statement->fetchArray();
55 $this->unreadConversationCount
[$userID] = $row['count'];
57 // update storage data
58 UserStorageHandler
::getInstance()->update($userID, 'unreadConversationCount', serialize($this->unreadConversationCount
[$userID]), PackageDependencyHandler
::getInstance()->getPackageID('com.woltlab.wcf.conversation'));
61 $this->unreadConversationCount
[$userID] = unserialize($data[$userID]);
65 return $this->unreadConversationCount
[$userID];
69 * Returns the number of conversations for given user.
71 * @param integer $userID
74 public function getConversationCount($userID = null) {
75 if ($userID === null) $userID = WCF
::getUser()->userID
;
77 if (!isset($this->conversationCount
[$userID])) {
78 $this->conversationCount
[$userID] = 0;
81 UserStorageHandler
::getInstance()->loadStorage(array($userID));
84 $data = UserStorageHandler
::getInstance()->getStorage(array($userID), 'conversationCount');
86 // cache does not exist or is outdated
87 if ($data[$userID] === null) {
88 $conditionBuilder1 = new PreparedStatementConditionBuilder();
89 $conditionBuilder1->add('conversation_to_user.participantID = ?', array($userID));
90 $conditionBuilder1->add('conversation_to_user.hideConversation IN (0,1)');
91 $conditionBuilder2 = new PreparedStatementConditionBuilder();
92 $conditionBuilder2->add('conversation.userID = ?', array($userID));
93 $conditionBuilder2->add('conversation.isDraft = 1');
95 $sql = "SELECT (SELECT COUNT(*)
96 FROM wcf".WCF_N
."_conversation_to_user conversation_to_user
97 ".$conditionBuilder1->__toString().")
100 FROM wcf".WCF_N
."_conversation conversation
101 ".$conditionBuilder2->__toString().") AS count";
102 $statement = WCF
::getDB()->prepareStatement($sql);
103 $statement->execute(array_merge($conditionBuilder1->getParameters(), $conditionBuilder2->getParameters()));
104 $row = $statement->fetchArray();
105 $this->conversationCount
[$userID] = $row['count'];
107 // update storage data
108 UserStorageHandler
::getInstance()->update($userID, 'conversationCount', serialize($this->conversationCount
[$userID]), PackageDependencyHandler
::getInstance()->getPackageID('com.woltlab.wcf.conversation'));
111 $this->conversationCount
[$userID] = unserialize($data[$userID]);
115 return $this->conversationCount
[$userID];