diff --git a/src/Post/Event/CheckingForFlooding.php b/src/Post/Event/CheckingForFlooding.php new file mode 100644 index 000000000..5a1992740 --- /dev/null +++ b/src/Post/Event/CheckingForFlooding.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Post\Event; + +use Flarum\User\User; + +class CheckingForFlooding +{ + /** + * @var User + */ + public $actor; + + /** + * @param User|null $actor + */ + public function __construct(User $actor = null) + { + $this->actor = $actor; + } +} diff --git a/src/Post/Floodgate.php b/src/Post/Floodgate.php index 94cc66d79..d3068053f 100644 --- a/src/Post/Floodgate.php +++ b/src/Post/Floodgate.php @@ -12,14 +12,26 @@ namespace Flarum\Post; use DateTime; +use Flarum\Post\Event\CheckingForFlooding; use Flarum\Post\Exception\FloodingException; use Flarum\User\User; +use Illuminate\Contracts\Events\Dispatcher; class Floodgate { + /** + * @var Dispatcher + */ + protected $events; + + public function __construct(Dispatcher $events) + { + $this->events = $events; + } + /** * @param User $actor - * @throws \Flarum\Post\Exception\FloodingException + * @throws FloodingException */ public function assertNotFlooding(User $actor) { @@ -32,8 +44,12 @@ class Floodgate * @param User $actor * @return bool */ - public function isFlooding(User $actor) + public function isFlooding(User $actor): bool { - return Post::where('user_id', $actor->id)->where('time', '>=', new DateTime('-10 seconds'))->exists(); + $isFlooding = $this->events->until( + new CheckingForFlooding($actor) + ); + + return $isFlooding ?? Post::where('user_id', $actor->id)->where('time', '>=', new DateTime('-10 seconds'))->exists(); } }