X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FUpdatedSoneProcessor.kt;h=28bac6d0cbc2e31cfeab3bb3644aa6c73e654212;hp=17948c5276a7aaf719f490cab52c584b10e95147;hb=835c41cac521d1a988404f8711469c136b7a1764;hpb=8ba1240d5e15059e7469b46163c6f640dedefabb diff --git a/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt b/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt index 17948c5..28bac6d 100644 --- a/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt +++ b/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt @@ -1,16 +1,13 @@ package net.pterodactylus.sone.core -import com.google.common.eventbus.EventBus -import com.google.inject.ImplementedBy -import net.pterodactylus.sone.core.event.NewPostFoundEvent -import net.pterodactylus.sone.core.event.NewPostReplyFoundEvent -import net.pterodactylus.sone.core.event.PostRemovedEvent -import net.pterodactylus.sone.core.event.PostReplyRemovedEvent -import net.pterodactylus.sone.data.Sone -import net.pterodactylus.sone.data.Sone.SoneStatus -import net.pterodactylus.sone.database.Database -import net.pterodactylus.sone.utils.ifFalse -import net.pterodactylus.util.logging.Logging +import com.google.common.eventbus.* +import com.google.inject.* +import net.pterodactylus.sone.core.event.* +import net.pterodactylus.sone.data.* +import net.pterodactylus.sone.data.Sone.* +import net.pterodactylus.sone.database.* +import net.pterodactylus.sone.utils.* +import net.pterodactylus.util.logging.* import javax.inject.Inject /** @@ -32,12 +29,27 @@ abstract class BasicUpdateSoneProcessor(private val database: Database, private 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." } + logger.fine("Downloaded Sone $sone can not update stored Sone $storedSone.") return } - collectEventsForChanges(storedSone, sone) - .also { database.storeSone(sone) } - .forEach(eventBus::post) + + SoneComparison(storedSone, sone).apply { + newPosts + .onEach { post -> if (post.time <= sone.followingTime) post.isKnown = true } + .mapNotNull { post -> post.isKnown.ifFalse { NewPostFoundEvent(post) } } + .forEach(eventBus::post) + removedPosts + .map { PostRemovedEvent(it) } + .forEach(eventBus::post) + newPostReplies + .onEach { postReply -> if (postReply.time <= sone.followingTime) postReply.isKnown = true } + .mapNotNull { postReply -> postReply.isKnown.ifFalse { NewPostReplyFoundEvent(postReply) } } + .forEach(eventBus::post) + removedPostReplies + .map { PostReplyRemovedEvent(it) } + .forEach(eventBus::post) + } + database.storeSone(sone) sone.options = storedSone.options sone.isKnown = storedSone.isKnown sone.status = if (sone.time != 0L) SoneStatus.idle else SoneStatus.unknown @@ -47,16 +59,6 @@ abstract class BasicUpdateSoneProcessor(private val database: Database, private private val Sone.followingTime get() = database.getFollowingTime(id) ?: 0 - private fun collectEventsForChanges(oldSone: Sone, newSone: Sone): List = - SoneChangeCollector(oldSone) - .onNewPost { post -> if (post.time <= newSone.followingTime) post.isKnown = true } - .newPostEvent { post -> post.isKnown.ifFalse { NewPostFoundEvent(post) } } - .removedPostEvent { PostRemovedEvent(it) } - .onNewPostReply { postReply -> if (postReply.time <= newSone.followingTime) postReply.isKnown = true } - .newPostReplyEvent { postReply -> postReply.isKnown.ifFalse { NewPostReplyFoundEvent(postReply) } } - .onRemovedPostReply { PostReplyRemovedEvent(it) } - .detectChanges(newSone) - } class DefaultUpdateSoneProcessor @Inject constructor(database: Database, eventBus: EventBus) :