X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FUpdatedSoneProcessor.kt;h=ebaa3c8f9b2a089f0c196395ba70582f1bfc5f4b;hp=580f2275c4294538812a60414b49752b705886dc;hb=cdee9199c8ab6a1646ef9fce6930ce41f1b1b25b;hpb=456676dc95a161603707fc8e2021a6c396ef1e24 diff --git a/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt b/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt index 580f227..ebaa3c8 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 /** @@ -35,9 +32,23 @@ abstract class BasicUpdateSoneProcessor(private val database: Database, private 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) + } sone.options = storedSone.options sone.isKnown = storedSone.isKnown sone.status = if (sone.time != 0L) SoneStatus.idle else SoneStatus.unknown @@ -47,16 +58,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) :