Use new flood control API for conversations
authorMatthias Schmidt <gravatronics@live.com>
Wed, 28 Oct 2020 13:35:05 +0000 (14:35 +0100)
committerMatthias Schmidt <gravatronics@live.com>
Wed, 28 Oct 2020 13:35:05 +0000 (14:35 +0100)
See WoltLab/WCF#3033

files/lib/form/ConversationAddForm.class.php
files/lib/system/conversation/ConversationHandler.class.php
objectType.xml

index bdd20c124f046c5c61e87987145770823825ff14..916e5c647e45024ae5c00949e98a2303e8fb17a7 100644 (file)
@@ -10,6 +10,7 @@ use wcf\system\exception\IllegalLinkException;
 use wcf\system\exception\NamedUserException;
 use wcf\system\exception\PermissionDeniedException;
 use wcf\system\exception\UserInputException;
+use wcf\system\flood\FloodControl;
 use wcf\system\message\quote\MessageQuoteManager;
 use wcf\system\page\PageLocationManager;
 use wcf\system\WCF;
@@ -258,6 +259,8 @@ class ConversationAddForm extends MessageForm {
                
                MessageQuoteManager::getInstance()->saved();
                
+               FloodControl::getInstance()->registerContent('com.woltlab.wcf.conversation');
+               
                $this->saved();
                
                // forward
index b4115698c1ca5da8438dc85f9a651cd382e8b295..837e15053aa3ca5869920003b9dbf9d3037d7dd5 100644 (file)
@@ -3,6 +3,7 @@ namespace wcf\system\conversation;
 use wcf\system\database\util\PreparedStatementConditionBuilder;
 use wcf\system\exception\NamedUserException;
 use wcf\system\exception\PermissionDeniedException;
+use wcf\system\flood\FloodControl;
 use wcf\system\user\storage\UserStorageHandler;
 use wcf\system\SingletonFactory;
 use wcf\system\WCF;
@@ -141,21 +142,11 @@ class ConversationHandler extends SingletonFactory {
                        throw new PermissionDeniedException();
                }
                
-               $sql = "SELECT  COUNT(*) AS count, MIN(time) AS oldestDate
-                       FROM    wcf" . WCF_N . "_conversation
-                       WHERE   userID = ?
-                               AND time > ?";
-               $statement = WCF::getDB()->prepareStatement($sql);
-               $statement->execute([
-                       WCF::getUser()->userID,
-                       TIME_NOW - 86400,
-               ]);
-               $row = $statement->fetchSingleRow();
-               
-               if ($row['count'] >= $limit) {
+               $count = FloodControl::getInstance()->countContent('com.woltlab.wcf.conversation', new \DateInterval('P1D'));
+               if ($count['count'] >= $limit) {
                        throw new NamedUserException(WCF::getLanguage()->getDynamicVariable('wcf.conversation.error.floodControl', [
-                               'limit' => $limit,
-                               'notBefore' => $row['oldestDate'] + 86400,
+                               'limit' => $count['count'],
+                               'notBefore' => $count['earliestTime'] + 86400,
                        ]));
                }
        }
index 4a62a48482df74ea25a102d458845020beed4087..1aad89efd2e9233ef665fb3f3f1c3c4889a73857 100644 (file)
                        <classname>wcf\system\user\content\provider\ConversationMessageUserContentProvider</classname>
                </type>
                <!-- /user content provider -->
+               <type>
+                       <name>com.woltlab.wcf.conversation</name>
+                       <definitionname>com.woltlab.wcf.floodControl</definitionname>
+               </type>
        </import>
 </data>