diff --git a/extensions/suspend/extend.php b/extensions/suspend/extend.php index 81e892447..c2e454269 100644 --- a/extensions/suspend/extend.php +++ b/extensions/suspend/extend.php @@ -9,6 +9,7 @@ use Flarum\Api\Serializer\BasicUserSerializer; use Flarum\Event\ConfigureNotificationTypes; +use Flarum\Event\ConfigureUserGambits; use Flarum\Extend; use Flarum\Suspend\Access; use Flarum\Suspend\Event\Suspended; @@ -16,6 +17,7 @@ use Flarum\Suspend\Event\Unsuspended; use Flarum\Suspend\Listener; use Flarum\Suspend\Notification\UserSuspendedBlueprint; use Flarum\Suspend\Notification\UserUnsuspendedBlueprint; +use Flarum\Suspend\Search\Gambit\SuspendedGambit; use Flarum\User\Event\Saving; use Flarum\User\User; use Illuminate\Contracts\Events\Dispatcher; @@ -48,5 +50,9 @@ return [ $events->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class); $events->subscribe(Access\UserPolicy::class); + + $events->listen(ConfigureUserGambits::class, function (ConfigureUserGambits $event) { + $event->gambits->add(SuspendedGambit::class); + }); } ]; diff --git a/extensions/suspend/src/Search/Gambit/SuspendedGambit.php b/extensions/suspend/src/Search/Gambit/SuspendedGambit.php new file mode 100644 index 000000000..d746c6770 --- /dev/null +++ b/extensions/suspend/src/Search/Gambit/SuspendedGambit.php @@ -0,0 +1,68 @@ +users = $users; + } + + /** + * {@inheritdoc} + */ + public function apply(AbstractSearch $search, $bit) + { + if (! $search->getActor()->can('suspend')) { + return false; + } + + return parent::apply($search, $bit); + } + + /** + * {@inheritdoc} + */ + protected function conditions(AbstractSearch $search, array $matches, $negate) + { + if (! $search instanceof UserSearch) { + throw new LogicException('This gambit can only be applied on a DiscussionSearch'); + } + + $search->getQuery()->where(function ($query) use ($negate) { + if ($negate) { + $query->where('suspended_until', null)->orWhere('suspended_until', '<', Carbon::now()); + } else { + $query->where('suspended_until', '>', Carbon::now()); + } + }); + } +}