✨ Add filter for updated Sones
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 20 Jul 2026 14:07:31 +0000 (16:07 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 22 Jul 2026 16:00:30 +0000 (18:00 +0200)
src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt
src/test/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessorTest.kt

index 18773e0..35052ba 100644 (file)
@@ -17,6 +17,9 @@ import jakarta.inject.Inject
 @ImplementedBy(DefaultUpdateSoneProcessor::class)
 interface UpdatedSoneProcessor {
 
+       var postFilter: (post: Post) -> Boolean
+       var postReplyFilter: (postReply: PostReply) -> Boolean
+
        fun updateSone(sone: Sone)
 
 }
@@ -26,12 +29,17 @@ abstract class BasicUpdateSoneProcessor(private val database: Database, private
 
        private val logger = Logger.getLogger(UpdatedSoneProcessor::class.qualifiedName)!!
 
+       override var postFilter: (post: Post) -> Boolean = { _ -> true }
+       override var postReplyFilter: (postReply: PostReply) -> Boolean = { _ -> true }
+
        override fun updateSone(sone: Sone) {
                val storedSone = database.getSone(sone.id) ?: return
                if (!soneCanBeUpdated(storedSone, sone)) {
                        logger.fine("Downloaded Sone $sone can not update stored Sone $storedSone.")
                        return
                }
+               sone.setPosts(sone.posts.filter(postFilter))
+               sone.setReplies(sone.replies.filter(postReplyFilter))
 
                SoneComparison(storedSone, sone).apply {
                        newPosts
index 51eb8b6..ab90893 100644 (file)
@@ -8,8 +8,10 @@ import net.pterodactylus.sone.core.event.PostReplyRemovedEvent
 import net.pterodactylus.sone.data.Post
 import net.pterodactylus.sone.data.PostReply
 import net.pterodactylus.sone.data.Sone
+import net.pterodactylus.sone.data.SoneOptions.DefaultSoneOptions
 import net.pterodactylus.sone.database.Database
 import net.pterodactylus.sone.test.argumentCaptor
+import net.pterodactylus.sone.test.createRemoteSone
 import net.pterodactylus.sone.test.getInstance
 import net.pterodactylus.sone.test.isProvidedByMock
 import net.pterodactylus.sone.test.mock
@@ -148,6 +150,26 @@ class UpdatedSoneProcessorTest {
        }
 
        @Test
+       fun `updated Sone processor only stores posts that match the post filter`() {
+               whenever(storedSone.posts).thenReturn(emptyList<Post>())
+               whenever(storedSone.options).thenReturn(DefaultSoneOptions())
+               updatedSoneProcessor.postFilter = { post -> post.time > 2500 }
+               val newSone = createRemoteSone("sone", posts = posts, time = 9999)
+               updatedSoneProcessor.updateSone(newSone)
+               assertThat(newSone.posts, contains(posts[2]))
+       }
+
+       @Test
+       fun `updated Sone processor only stores post replies that match the post reply filter`() {
+               whenever(storedSone.posts).thenReturn(emptyList<Post>())
+               whenever(storedSone.options).thenReturn(DefaultSoneOptions())
+               updatedSoneProcessor.postReplyFilter = { postReply -> postReply.time > 2500 }
+               val newSone = createRemoteSone("sone", postReplies = postReplies.toSet(), time = 9999)
+               updatedSoneProcessor.updateSone(newSone)
+               assertThat(newSone.replies, contains(postReplies[2]))
+       }
+
+       @Test
        fun `default updated Sone processor can be created by dependency injection`() {
                assertThat(baseInjector.createChildInjector(
                                Database::class.isProvidedByMock()