damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit a06be64894ea7ea369ae59431e71709fc364a4e0
parent 0f9e87cb3709633238f73d2b03fec92223cefc74
Author: Daniel D’Aquino <daniel@daquino.me>
Date:   Fri,  6 Oct 2023 22:54:05 +0000

network: Broadcast quoted notes when posting a note with quotes

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", <QUOTED_NOTE_ID>]`)

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", <QUOTED_NOTE_ID>]`)

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 <daniel@daquino.me>
Reviewed-by: William Casarin <jb55@jb55.com>
Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mdamus/ContentView.swift | 6++++++
Mdamus/Nostr/Id.swift | 25++++++++++++++++++++++++-
Mnostrdb/NdbNote.swift | 4++++
3 files changed, 34 insertions(+), 1 deletion(-)

diff --git 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 @@ -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 @@ -292,6 +292,10 @@ extension NdbNote { public var referenced_ids: References<NoteId> { References<NoteId>(tags: self.tags) } + + public var referenced_quote_ids: References<QuoteId> { + References<QuoteId>(tags: self.tags) + } public var referenced_noterefs: References<NoteRef> { References<NoteRef>(tags: self.tags)