Rearranged options / option categories (WIP)
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / system / conversation / ConversationHandler.class.php
1 <?php
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;
7 use wcf\system\WCF;
8
9 class ConversationHandler extends SingletonFactory {
10 /**
11 * number of unread conversations
12 * @var array<integer>
13 */
14 protected $unreadConversationCount = array();
15
16 /**
17 * number of conversations
18 * @var array<integer>
19 */
20 protected $conversationCount = array();
21
22 /**
23 * Returns the number of unread conversations for given user.
24 *
25 * @param integer $userID
26 * @return integer
27 */
28 public function getUnreadConversationCount($userID = null) {
29 if ($userID === null) $userID = WCF::getUser()->userID;
30
31 if (!isset($this->unreadConversationCount[$userID])) {
32 $this->unreadConversationCount[$userID] = 0;
33
34 // load storage data
35 UserStorageHandler::getInstance()->loadStorage(array($userID));
36
37 // get ids
38 $data = UserStorageHandler::getInstance()->getStorage(array($userID), 'unreadConversationCount');
39
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');
47
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'];
56
57 // update storage data
58 UserStorageHandler::getInstance()->update($userID, 'unreadConversationCount', serialize($this->unreadConversationCount[$userID]), PackageDependencyHandler::getInstance()->getPackageID('com.woltlab.wcf.conversation'));
59 }
60 else {
61 $this->unreadConversationCount[$userID] = unserialize($data[$userID]);
62 }
63 }
64
65 return $this->unreadConversationCount[$userID];
66 }
67
68 /**
69 * Returns the number of conversations for given user.
70 *
71 * @param integer $userID
72 * @return integer
73 */
74 public function getConversationCount($userID = null) {
75 if ($userID === null) $userID = WCF::getUser()->userID;
76
77 if (!isset($this->conversationCount[$userID])) {
78 $this->conversationCount[$userID] = 0;
79
80 // load storage data
81 UserStorageHandler::getInstance()->loadStorage(array($userID));
82
83 // get ids
84 $data = UserStorageHandler::getInstance()->getStorage(array($userID), 'conversationCount');
85
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');
94
95 $sql = "SELECT (SELECT COUNT(*)
96 FROM wcf".WCF_N."_conversation_to_user conversation_to_user
97 ".$conditionBuilder1->__toString().")
98 +
99 (SELECT COUNT(*)
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'];
106
107 // update storage data
108 UserStorageHandler::getInstance()->update($userID, 'conversationCount', serialize($this->conversationCount[$userID]), PackageDependencyHandler::getInstance()->getPackageID('com.woltlab.wcf.conversation'));
109 }
110 else {
111 $this->conversationCount[$userID] = unserialize($data[$userID]);
112 }
113 }
114
115 return $this->conversationCount[$userID];
116 }
117 }