From 1af3bb7dfc0c8ce81676e13cb0fbf29992e913e9 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 31 Aug 2023 11:48:22 -0400 Subject: [PATCH] Improve cohesiveness of the pruning system. --- .../amethyst/model/LocalCache.kt | 165 +++++++++--------- 1 file changed, 78 insertions(+), 87 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 165c0d06e..6c08e18f9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -1183,13 +1183,7 @@ object LocalCache { val childrenToBeRemoved = mutableListOf() toBeRemoved.forEach { - notes.remove(it.idHex) - // Doesn't need to clean up the replies and mentions.. Too small to matter. - - // Counts the replies - it.replyTo?.forEach { parent -> - parent.removeReply(it) - } + removeFromCache(it) childrenToBeRemoved.addAll(it.removeAllChildNotes()) } @@ -1208,12 +1202,7 @@ object LocalCache { val childrenToBeRemoved = mutableListOf() toBeRemoved.forEach { - notes.remove(it.idHex) - - // Counts the replies - it.replyTo?.forEach { parent -> - parent.removeReply(it) - } + removeFromCache(it) childrenToBeRemoved.addAll(it.removeAllChildNotes()) } @@ -1240,17 +1229,12 @@ object LocalCache { val childrenToBeRemoved = mutableListOf() toBeRemoved.forEach { - notes.remove(it.idHex) - val newerVersion = addressables[(it.event as? AddressableEvent)?.address()?.toTag()] if (newerVersion != null) { it.moveAllReferencesTo(newerVersion) } - it.replyTo?.forEach { masterNote -> - removeLinkFromParentNote(it) - } - + removeFromCache(it) childrenToBeRemoved.addAll(it.removeAllChildNotes()) } @@ -1279,11 +1263,7 @@ object LocalCache { val childrenToBeRemoved = mutableListOf() toBeRemoved.forEach { - notes.remove(it.idHex) - - removeLinkFromParentNote(it) - removeAuthorLinkTo(it) - + removeFromCache(it) childrenToBeRemoved.addAll(it.removeAllChildNotes()) } @@ -1300,73 +1280,39 @@ object LocalCache { } } - fun removeLinkFromParentNote(it: Note) { - it.replyTo?.forEach { masterNote -> - masterNote.removeReply(it) - masterNote.removeBoost(it) - masterNote.removeReaction(it) - masterNote.removeZap(it) - masterNote.removeReport(it) + private fun removeFromCache(note: Note) { + note.replyTo?.forEach { masterNote -> + masterNote.removeReply(note) + masterNote.removeBoost(note) + masterNote.removeReaction(note) + masterNote.removeZap(note) + masterNote.removeReport(note) masterNote.clearEOSE() // allows reloading of these events if needed } - } - fun pruneExpiredEvents() { - checkNotInMainThread() - - val toBeRemoved = notes.filter { - it.value.event?.isExpired() == true - }.values - - val childrenToBeRemoved = mutableListOf() - - toBeRemoved.forEach { - notes.remove(it.idHex) - - removeLinkFromParentNote(it) - removeAuthorLinkTo(it) - - childrenToBeRemoved.addAll(it.removeAllChildNotes()) - } - - removeChildrenOf(childrenToBeRemoved) - - if (toBeRemoved.size > 1) { - println("PRUNE: ${toBeRemoved.size} thread replies removed.") - } - } - - fun pruneHiddenMessages(account: Account) { - checkNotInMainThread() - - val childrenToBeRemoved = mutableListOf() - - val toBeRemoved = account.hiddenUsers.map { userHex -> - ( - notes.values.filter { - it.event?.pubKey() == userHex - } + addressables.values.filter { - it.event?.pubKey() == userHex - } - ).toSet() - }.flatten() - - toBeRemoved.forEach { - // Counts the replies - it.replyTo?.forEach { masterNote -> - removeLinkFromParentNote(it) + if (note.event is LnZapEvent) { + (note.event as LnZapEvent).zappedAuthor().mapNotNull { + val author = getUserIfExists(it) + author?.removeZap(note) + author?.clearEOSE() + } + } + if (note.event is LnZapRequestEvent) { + (note.event as LnZapRequestEvent).zappedAuthor().mapNotNull { + val author = getUserIfExists(it) + author?.removeZap(note) + author?.clearEOSE() + } + } + if (note.event is ReportEvent) { + (note.event as ReportEvent).reportedAuthor().mapNotNull { + val author = getUserIfExists(it.key) + author?.removeReport(note) + author?.clearEOSE() } - - notes.remove(it.idHex) - - removeAuthorLinkTo(it) - - childrenToBeRemoved.addAll(it.removeAllChildNotes()) } - removeChildrenOf(childrenToBeRemoved) - - println("PRUNE: ${toBeRemoved.size} messages removed because they were Hidden") + notes.remove(note.idHex) } fun removeAuthorLinkTo(note: Note) { @@ -1395,11 +1341,56 @@ object LocalCache { fun removeChildrenOf(nextToBeRemoved: List) { nextToBeRemoved.forEach { note -> - removeAuthorLinkTo(note) - notes.remove(note.idHex) + removeFromCache(note) } } + fun pruneExpiredEvents() { + checkNotInMainThread() + + val toBeRemoved = notes.filter { + it.value.event?.isExpired() == true + }.values + + val childrenToBeRemoved = mutableListOf() + + toBeRemoved.forEach { + removeFromCache(it) + childrenToBeRemoved.addAll(it.removeAllChildNotes()) + } + + removeChildrenOf(childrenToBeRemoved) + + if (toBeRemoved.size > 1) { + println("PRUNE: ${toBeRemoved.size} thread replies removed.") + } + } + + fun pruneHiddenMessages(account: Account) { + checkNotInMainThread() + + val childrenToBeRemoved = mutableListOf() + + val toBeRemoved = account.hiddenUsers.map { userHex -> + ( + notes.values.filter { + it.event?.pubKey() == userHex + } + addressables.values.filter { + it.event?.pubKey() == userHex + } + ).toSet() + }.flatten() + + toBeRemoved.forEach { + removeFromCache(it) + childrenToBeRemoved.addAll(it.removeAllChildNotes()) + } + + removeChildrenOf(childrenToBeRemoved) + + println("PRUNE: ${toBeRemoved.size} messages removed because they were Hidden") + } + fun pruneContactLists(loggedIn: Set) { checkNotInMainThread()