From a06be64894ea7ea369ae59431e71709fc364a4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=E2=80=99Aquino?= Date: Fri, 6 Oct 2023 22:54:05 +0000 Subject: [PATCH] network: Broadcast quoted notes when posting a note with quotes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change addresses an issue where notes with quotes sometimes are not loaded correctly because the quoted note was not available in the same relay. Now whenever a user posts a note with a quoted note, the quoted note is also broadcast to the user's selected relays. Issue repro ----------- ISSUE REPRODUCED Device: iPhone 14 Pro Simulator iOS: 17.0 Damus: `1fabd4c0fe98d1f47b1fa0f76984ad78095bd49c` Setup: - Make sure you have a debugger connected - Have a test note that you can quote Steps: 1. Start Damus and let logs settle 2. Observe where the last log is 3. Quote the test note 4. Copy newly generated logs and paste on a text editor. 5. Analyze those logs. Pay attention to the new note id, as well as the note id of the quoted event (`["q", ]`) Results: Logs show that the newly posted event is being flushed to the relays, but not the note that is being quoted. Testing of the fix ------------------ PASS Device: iPhone 14 Pro Simulator iOS: 17.0 Damus: This commit Setup: - Make sure you have a debugger connected - Have a test note that you can quote Steps: 1. Start Damus and let logs settle 2. Observe where the last log is 3. Quote the test note 4. Copy newly generated logs and paste on a text editor. 5. Analyze those logs. Pay attention to the new note id, as well as the note id of the quoted event (`["q", ]`) Results: - Logs show the new event being flushed to the relays. PASS - Logs show the quoted event also being flushed to the relays. PASS Closes: https://github.com/damus-io/damus/issues/1495 Changelog-Fixed: Broadcast quoted notes when posting a note with quotes Signed-off-by: Daniel D’Aquino Reviewed-by: William Casarin Signed-off-by: William Casarin --- damus/ContentView.swift | 6 ++++++ damus/Nostr/Id.swift | 25 ++++++++++++++++++++++++- nostrdb/NdbNote.swift | 4 ++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/damus/ContentView.swift b/damus/ContentView.swift index e770a157..dc897f09 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -987,6 +987,12 @@ func handle_post_notification(keypair: FullKeypair, postbox: PostBox, events: Ev postbox.send(ev) } } + for qref in new_ev.referenced_quote_ids.prefix(3) { + // also broadcast at most 3 referenced quoted events + if let ev = events.lookup(qref.note_id) { + postbox.send(ev) + } + } return true case .cancel: print("post cancelled") diff --git a/damus/Nostr/Id.swift b/damus/Nostr/Id.swift index f97bf7a6..101faddd 100644 --- a/damus/Nostr/Id.swift +++ b/damus/Nostr/Id.swift @@ -34,14 +34,37 @@ protocol TagConvertible { static func from_tag(tag: TagSequence) -> Self? } -struct QuoteId: IdType, TagKey { +struct QuoteId: IdType, TagKey, TagConvertible { let id: Data init(_ data: Data) { self.id = data } + + /// Refer to this QuoteId as a NoteId + var note_id: NoteId { + NoteId(self.id) + } var keychar: AsciiCharacter { "q" } + + var tag: [String] { + ["q", self.hex()] + } + + static func from_tag(tag: TagSequence) -> QuoteId? { + var i = tag.makeIterator() + + guard tag.count >= 2, + let t0 = i.next(), + let key = t0.single_char, + key == "q", + let t1 = i.next(), + let quote_id = t1.id().map(QuoteId.init) + else { return nil } + + return quote_id + } } diff --git a/nostrdb/NdbNote.swift b/nostrdb/NdbNote.swift index b46deca3..4d39ca70 100644 --- a/nostrdb/NdbNote.swift +++ b/nostrdb/NdbNote.swift @@ -292,6 +292,10 @@ extension NdbNote { public var referenced_ids: References { References(tags: self.tags) } + + public var referenced_quote_ids: References { + References(tags: self.tags) + } public var referenced_noterefs: References { References(tags: self.tags)