diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 89f42567a..08f8ab8b4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -675,13 +675,28 @@ class Account( myRelayList.addAll(it.relays) } - client.send(deletionEvent, outboxRelays.flow.value + myRelayList) + client.send(deletionEvent, myRelayList) cache.justConsumeMyOwnEvent(deletionEvent) } } } } + fun delete( + event: Event, + additionalRelays: Set, + ) { + if (!isWriteable()) return + if (event.pubKey != signer.pubKey) return + + signer.sign( + DeletionEvent.build(listOf(event)), + ) { deletionEvent -> + client.send(deletionEvent, outboxRelays.flow.value + additionalRelays) + cache.justConsumeMyOwnEvent(deletionEvent) + } + } + suspend fun createHTTPAuthorization( url: String, method: String, @@ -1438,9 +1453,10 @@ class Account( noteEvent.createDeletedEvent(signer) { client.send(it, outboxRelays.flow.value + note.relays) cache.justConsumeMyOwnEvent(it) + + delete(it, note.relays.toSet()) } } - delete(note) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index c1a2348bc..1856dca7f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -2784,6 +2784,12 @@ object LocalCache : ILocalCache { if (consumeBaseReplaceable(event, relay, wasVerified)) { return true } + } else { + // passes to the AccountViewModel for further delete. + val note = Note(event.id) + note.loadEvent(event, getOrCreateUser(event.pubKey), emptyList()) + relay?.let { note.addRelay(it) } + refreshObservers(note) } return false diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterDraftsAndReportsFromKey.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterDraftsAndReportsFromKey.kt index 0416ae94c..fbb5c5b9b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterDraftsAndReportsFromKey.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterDraftsAndReportsFromKey.kt @@ -28,7 +28,7 @@ import com.vitorpamplona.quartz.nip37Drafts.DraftEvent import com.vitorpamplona.quartz.nip51Lists.BookmarkListEvent import com.vitorpamplona.quartz.nip56Reports.ReportEvent -val DraftsAndReportsFromKeyKinds = +val ReportsAndBookmarksFromKeyKinds = listOf( DraftEvent.KIND, ReportEvent.KIND, @@ -47,7 +47,7 @@ fun filterDraftsAndReportsFromKey( relay = relay, filter = Filter( - kinds = DraftsAndReportsFromKeyKinds, + kinds = ReportsAndBookmarksFromKeyKinds, authors = listOf(pubkey), since = since, ), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt index 1418caa61..6b5635326 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt @@ -68,9 +68,13 @@ class PrecacheNewNotesProcessor( is DraftEvent -> { // Avoid decrypting over and over again if the event already exist. - if (!event.isDeleted() && event.preCachedDraft(account.signer) == null && event.pubKey == account.signer.pubKey) { - event.cachedDraft(account.signer) { - cache.indexDraftAsRealEvent(event, it) + if (event.pubKey == account.signer.pubKey) { + if (!event.isDeleted()) { + if (event.preCachedDraft(account.signer) == null) { + event.cachedDraft(account.signer) { + cache.indexDraftAsRealEvent(event, it) + } + } } } } @@ -135,6 +139,21 @@ class PrecacheNewNotesProcessor( newNotes.forEach { consume(it) } + + val toDelete = + newNotes.mapNotNull { + val noteEvent = it.event + if (noteEvent is DraftEvent && noteEvent.isDeleted()) { + it + } else { + null + } + } + + if (toDelete.isNotEmpty()) { + Log.w("PrecacheNewNotesProcessor", "Deleting ${toDelete.size} draft notes that should have been deleted already") + account.delete(toDelete) + } } catch (e: Exception) { if (e is CancellationException) throw e Log.e("PrecacheNewNotesProcessor", "This shouldn't happen", e)