Made `ConversationHandler` less error-prone
authorMarcel Werk <burntime@woltlab.com>
Mon, 19 Feb 2024 16:29:14 +0000 (17:29 +0100)
committerMarcel Werk <burntime@woltlab.com>
Mon, 19 Feb 2024 16:29:14 +0000 (17:29 +0100)
The number of unread conversations is often shown in the templates. If this is accidentally queried for a guest due to individual template changes, it leads directly to an error message.

files/lib/system/conversation/ConversationHandler.class.php

index 210622f423e96e12823b1673aa54f09987e62d3c..da0befc724748196f5eb6cd0ea29e25cfea0ed26 100644 (file)
@@ -13,37 +13,37 @@ use wcf\system\WCF;
 /**
  * Handles the number of conversations and unread conversations of the active user.
  *
- * @author  Marcel Werk
- * @copyright   2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @author      Marcel Werk
+ * @copyright   2001-2024 WoltLab GmbH
+ * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  */
-class ConversationHandler extends SingletonFactory
+final class ConversationHandler extends SingletonFactory
 {
     /**
      * number of unread conversations
      * @var int[]
      */
-    protected $unreadConversationCount = [];
+    private array $unreadConversationCount = [];
 
     /**
      * number of conversations
      * @var int[]
      */
-    protected $conversationCount = [];
+    private array $conversationCount = [];
 
     /**
      * Returns the number of unread conversations for given user.
-     *
-     * @param int $userID
-     * @param bool $skipCache
-     * @return  int
      */
-    public function getUnreadConversationCount($userID = null, $skipCache = false)
+    public function getUnreadConversationCount(?int $userID = null, bool $skipCache = false): int
     {
         if ($userID === null) {
             $userID = WCF::getUser()->userID;
         }
 
+        if (!$userID) {
+            return 0;
+        }
+
         if (!isset($this->unreadConversationCount[$userID]) || $skipCache) {
             $this->unreadConversationCount[$userID] = 0;
 
@@ -87,16 +87,17 @@ class ConversationHandler extends SingletonFactory
 
     /**
      * Returns the number of conversations for given user.
-     *
-     * @param int $userID
-     * @return  int
      */
-    public function getConversationCount($userID = null)
+    public function getConversationCount(?int $userID = null): int
     {
         if ($userID === null) {
             $userID = WCF::getUser()->userID;
         }
 
+        if (!$userID) {
+            return 0;
+        }
+
         if (!isset($this->conversationCount[$userID])) {
             $this->conversationCount[$userID] = 0;
 
@@ -151,7 +152,7 @@ class ConversationHandler extends SingletonFactory
      */
     public function enforceFloodControl(
         bool $isReply = false
-    ) {
+    ): void {
         if (!$isReply) {
             // 1. Check for the maximum conversations per 24 hours.
             $limit = WCF::getSession()->getPermission('user.conversation.maxStartedConversationsPer24Hours');