X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ftext%2FSoneMentionDetector.kt;fp=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Ftext%2FSoneMentionDetector.kt;h=e816c8e9de105f72536d4968fecd38b88b9e40ef;hp=f3d8cb41067da44474e5f135a9e163d66ebb499a;hb=62ef0f7790f226019d56f93e12f64cef1e897f72;hpb=2bc7c56a3c7a138b771909682d41347bd89064c8 diff --git a/src/main/kotlin/net/pterodactylus/sone/text/SoneMentionDetector.kt b/src/main/kotlin/net/pterodactylus/sone/text/SoneMentionDetector.kt index f3d8cb4..e816c8e 100644 --- a/src/main/kotlin/net/pterodactylus/sone/text/SoneMentionDetector.kt +++ b/src/main/kotlin/net/pterodactylus/sone/text/SoneMentionDetector.kt @@ -19,6 +19,8 @@ package net.pterodactylus.sone.text import com.google.common.eventbus.* import net.pterodactylus.sone.core.event.* +import net.pterodactylus.sone.data.* +import net.pterodactylus.sone.database.* import net.pterodactylus.sone.utils.* import javax.inject.* @@ -27,14 +29,14 @@ import javax.inject.* * texts and emits a [MentionOfLocalSoneFoundEvent] if a [SoneTextParser] * finds a [SonePart] that points to a local [Sone]. */ -class SoneMentionDetector @Inject constructor(private val eventBus: EventBus, private val soneTextParser: SoneTextParser) { +class SoneMentionDetector @Inject constructor(private val eventBus: EventBus, private val soneTextParser: SoneTextParser, private val postReplyProvider: PostReplyProvider) { @Subscribe fun onNewPost(newPostFoundEvent: NewPostFoundEvent) { newPostFoundEvent.post.let { post -> post.sone.isLocal.onFalse { - val parts = soneTextParser.parse(post.text, null) - if (parts.filterIsInstance().any { it.sone.isLocal }) { + if (post.text.hasLinksToLocalSones()) { + mentionedPosts += post eventBus.post(MentionOfLocalSoneFoundEvent(post)) } } @@ -45,11 +47,47 @@ class SoneMentionDetector @Inject constructor(private val eventBus: EventBus, pr fun onNewPostReply(event: NewPostReplyFoundEvent) { event.postReply.let { postReply -> postReply.sone.isLocal.onFalse { - if (soneTextParser.parse(postReply.text, null).filterIsInstance().any { it.sone.isLocal }) { - postReply.post.let(::MentionOfLocalSoneFoundEvent).also(eventBus::post) + if (postReply.text.hasLinksToLocalSones()) { + postReply.post + .also { mentionedPosts += it } + .let(::MentionOfLocalSoneFoundEvent).also(eventBus::post) } } } } + @Subscribe + fun onPostRemoved(event: PostRemovedEvent) { + unmentionPost(event.post) + } + + @Subscribe + fun onPostMarkedKnown(event: MarkPostKnownEvent) { + unmentionPost(event.post) + } + + @Subscribe + fun onReplyRemoved(event: PostReplyRemovedEvent) { + event.postReply.post.let { + if ((!it.text.hasLinksToLocalSones() || it.isKnown) && (it.replies.filterNot { it == event.postReply }.none { it.text.hasLinksToLocalSones() && !it.isKnown })) { + unmentionPost(it) + } + } + } + + private fun unmentionPost(post: Post) { + if (post in mentionedPosts) { + eventBus.post(MentionOfLocalSoneRemovedEvent(post)) + mentionedPosts -= post + } + } + + private val mentionedPosts = mutableSetOf() + + private fun String.hasLinksToLocalSones() = soneTextParser.parse(this, null) + .filterIsInstance() + .any { it.sone.isLocal } + + private val Post.replies get() = postReplyProvider.getReplies(id) + }