From 10c1db95018f744171e4e360abfadf6a762d9e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Ca=C5=82ka?= <25438601+rafaucau@users.noreply.github.com> Date: Sat, 11 Apr 2026 01:04:33 +0200 Subject: [PATCH 1/3] fix: use ServiceProvider decorator to properly handle auto-merge --- extend.php | 9 ++- src/Handler/AutoMergePostReplyHandler.php | 93 +++++++++++++++++++++++ src/Listener/AutoMerge.php | 68 ----------------- src/Provider/AutoMergeServiceProvider.php | 17 +++++ 4 files changed, 115 insertions(+), 72 deletions(-) create mode 100644 src/Handler/AutoMergePostReplyHandler.php delete mode 100644 src/Listener/AutoMerge.php create mode 100644 src/Provider/AutoMergeServiceProvider.php diff --git a/extend.php b/extend.php index f11cd2d..d715e0e 100644 --- a/extend.php +++ b/extend.php @@ -12,13 +12,12 @@ namespace FoF\Filter; use Flarum\Extend; -use Flarum\Post\Event\Posted; use Flarum\Post\Event\Saving as PostSaving; use Flarum\Post\Post; use Flarum\Settings\Event\Saving as SettingSaving; use FoF\Filter\Listener\AddCensorChecks; -use FoF\Filter\Listener\AutoMerge; use FoF\Filter\Listener\CheckPost; +use FoF\Filter\Provider\AutoMergeServiceProvider; return [ (new Extend\Frontend('admin')) @@ -39,8 +38,10 @@ (new Extend\Event()) ->listen(SettingSaving::class, AddCensorChecks::class) - ->listen(PostSaving::class, CheckPost::class) - ->listen(Posted::class, AutoMerge::class), + ->listen(PostSaving::class, CheckPost::class), + + (new Extend\ServiceProvider()) + ->register(AutoMergeServiceProvider::class), (new Extend\Settings()) ->default('fof-filter.autoDeletePosts', false) diff --git a/src/Handler/AutoMergePostReplyHandler.php b/src/Handler/AutoMergePostReplyHandler.php new file mode 100644 index 0000000..ffae95d --- /dev/null +++ b/src/Handler/AutoMergePostReplyHandler.php @@ -0,0 +1,93 @@ +original = $original; + $this->settings = $settings; + $this->posts = $posts; + $this->discussions = $discussions; + $this->events = $events; + } + + /** + * @throws PermissionDeniedException + */ + public function handle(PostReply $command): CommentPost + { + if ( + !$this->settings->get('fof-filter.autoMergePosts') + || $command->isFirstPost + ) { + return $this->original->handle($command); + } + + $actor = $command->actor; + $discussion = $this->discussions->findOrFail( + $command->discussionId, + $actor + ); + + $lastPost = $this->posts->query() + ->where('discussion_id', '=', $discussion->id) + ->whereNull('hidden_at') + ->orderBy('number', 'desc') + ->first(); + + $cooldown = (int) $this->settings->get('fof-filter.cooldown'); + if ( + !$lastPost instanceof CommentPost + || $lastPost->user_id !== $actor->id + || $lastPost->auto_mod + || ($cooldown > 0 && $lastPost->created_at->lessThanOrEqualTo(Carbon::now()->subMinutes($cooldown))) + ) { + return $this->original->handle($command); + } + + $actor->assertCan('reply', $discussion); + + $newContent = Arr::get($command->data, 'attributes.content', ''); + $mergedContent = $lastPost->content."\n\n".$newContent; + + $lastPost->revise($mergedContent, $actor); + + $this->events->dispatch( + new Saving($lastPost, $actor, [ + 'attributes' => ['content' => $mergedContent], + ]) + ); + + $lastPost->save(); + $this->dispatchEventsFor($lastPost, $actor); + + return $lastPost; + } +} diff --git a/src/Listener/AutoMerge.php b/src/Listener/AutoMerge.php deleted file mode 100644 index 58db50a..0000000 --- a/src/Listener/AutoMerge.php +++ /dev/null @@ -1,68 +0,0 @@ -settings = $settings; - $this->posts = $posts; - } - - public function handle(Posted $event) - { - $post = $event->post; - - if ($post instanceof CommentPost && $post->number !== 1 && !$post->auto_mod && (bool) $this->settings->get('fof-filter.autoMergePosts')) { - $oldPost = $this->posts->query() - ->where('discussion_id', '=', $post->discussion_id) - ->where('number', '<', $post->number) - ->where('hidden_at', '=', null) - ->orderBy('number', 'desc') - ->firstOrFail(); - - if (!$oldPost instanceof CommentPost) { - return; - } - - $cooldown = $this->settings->get('fof-filter.cooldown'); - - if ($oldPost->user_id == $post->user_id && strtotime("-$cooldown minutes") < strtotime($oldPost->created_at)) { - $oldPost->revise($oldPost->content."\n\n".$post->content, $post->user); - - $oldPost->save(); - - $post->delete(); - } - } - } -} diff --git a/src/Provider/AutoMergeServiceProvider.php b/src/Provider/AutoMergeServiceProvider.php new file mode 100644 index 0000000..08e51b0 --- /dev/null +++ b/src/Provider/AutoMergeServiceProvider.php @@ -0,0 +1,17 @@ +container->extend(PostReplyHandler::class, function (PostReplyHandler $handler, $container) { + return $container->make(AutoMergePostReplyHandler::class, ['original' => $handler]); + }); + } +} From c031ceb512fdd151d7d5f028788e7a5f447ab972 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 10 Apr 2026 23:04:50 +0000 Subject: [PATCH 2/3] Apply fixes from StyleCI [ci skip] [skip ci] --- src/Handler/AutoMergePostReplyHandler.php | 9 +++++++++ src/Provider/AutoMergeServiceProvider.php | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/Handler/AutoMergePostReplyHandler.php b/src/Handler/AutoMergePostReplyHandler.php index ffae95d..ed85a0e 100644 --- a/src/Handler/AutoMergePostReplyHandler.php +++ b/src/Handler/AutoMergePostReplyHandler.php @@ -1,5 +1,14 @@ Date: Sat, 11 Apr 2026 13:09:05 +0200 Subject: [PATCH 3/3] fix: skip merging when new post contains a poll --- src/Handler/AutoMergePostReplyHandler.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Handler/AutoMergePostReplyHandler.php b/src/Handler/AutoMergePostReplyHandler.php index ed85a0e..240567b 100644 --- a/src/Handler/AutoMergePostReplyHandler.php +++ b/src/Handler/AutoMergePostReplyHandler.php @@ -55,6 +55,8 @@ public function handle(PostReply $command): CommentPost if ( !$this->settings->get('fof-filter.autoMergePosts') || $command->isFirstPost + // If the new post contains a poll, skip merging to avoid potential issues. + || Arr::has($command->data, 'attributes.poll') ) { return $this->original->handle($command); }