damus

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

commit 6e220ac4c1dac3e8d807a9331884647d9d959a7b
parent bcb40a6ec7703827f7cf4bfaa55b6c2d5b1a9e6d
Author: William Casarin <jb55@jb55.com>
Date:   Sat, 14 Jan 2023 09:48:31 -0800

dms: extract incoming DM handling into pure functions

So that it will be easier to test

Diffstat:
Mdamus/Models/HomeModel.swift | 125+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
1 file changed, 71 insertions(+), 54 deletions(-)

diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift @@ -347,17 +347,6 @@ class HomeModel: ObservableObject { return m[kind] } - func handle_last_event(ev: NostrEvent, timeline: Timeline, shouldNotify: Bool = true) { - let last_ev = get_last_event(timeline) - - if last_ev == nil || last_ev!.created_at < ev.created_at { - save_last_event(ev, timeline: timeline) - if shouldNotify { - new_events = NewEventsBits(prev: new_events, setting: timeline) - } - } - } - func handle_notification(ev: NostrEvent) { if !insert_uniq_sorted_event(events: &notifications, new_ev: ev, cmp: { $0.created_at > $1.created_at }) { return @@ -365,6 +354,12 @@ class HomeModel: ObservableObject { handle_last_event(ev: ev, timeline: .notifications) } + + func handle_last_event(ev: NostrEvent, timeline: Timeline, shouldNotify: Bool = true) { + if let new_bits = handle_last_events(new_events: self.new_events, ev: ev, timeline: timeline, shouldNotify: shouldNotify) { + new_events = new_bits + } + } func insert_home_event(_ ev: NostrEvent) -> Bool { let ok = insert_uniq_sorted_event(events: &self.events, new_ev: ev, cmp: { $0.created_at > $1.created_at }) @@ -391,49 +386,8 @@ class HomeModel: ObservableObject { } func handle_dm(_ ev: NostrEvent) { - - var inserted = false - var found = false - let ours = ev.pubkey == self.damus_state.pubkey - var i = 0 - - var the_pk = ev.pubkey - if ours { - if let ref_pk = ev.referenced_pubkeys.first { - the_pk = ref_pk.ref_id - } else { - // self dm!? - print("TODO: handle self dm?") - } - } - - for (pk, _) in dms.dms { - if pk == the_pk { - found = true - inserted = insert_uniq_sorted_event(events: &(dms.dms[i].1.events), new_ev: ev) { - $0.created_at < $1.created_at - } - - break - } - i += 1 - } - - if !found { - inserted = true - let model = DirectMessageModel(events: [ev]) - dms.dms.append((the_pk, model)) - } - - if inserted { - handle_last_event(ev: ev, timeline: .dms, shouldNotify: !ours) - - dms.dms = dms.dms.sorted { a, b in - if a.1.events.count > 0 && b.1.events.count > 0 { - return a.1.events.last!.created_at > b.1.events.last!.created_at - } - return false - } + if let notifs = handle_incoming_dm(prev_events: self.new_events, dms: self.dms, our_pubkey: self.damus_state.pubkey, ev: ev) { + self.new_events = notifs } } } @@ -656,4 +610,67 @@ func load_our_relays(contacts: Contacts, our_pubkey: String, pool: RelayPool, m_ } } +func handle_incoming_dm(prev_events: NewEventsBits, dms: DirectMessagesModel, our_pubkey: String, ev: NostrEvent) -> NewEventsBits? { + var inserted = false + var found = false + let ours = ev.pubkey == our_pubkey + var i = 0 + + var the_pk = ev.pubkey + if ours { + if let ref_pk = ev.referenced_pubkeys.first { + the_pk = ref_pk.ref_id + } else { + // self dm!? + print("TODO: handle self dm?") + } + } + + for (pk, _) in dms.dms { + if pk == the_pk { + found = true + inserted = insert_uniq_sorted_event(events: &(dms.dms[i].1.events), new_ev: ev) { + $0.created_at < $1.created_at + } + + break + } + i += 1 + } + + if !found { + inserted = true + let model = DirectMessageModel(events: [ev]) + dms.dms.append((the_pk, model)) + } + + var new_events: NewEventsBits? = nil + if inserted { + new_events = handle_last_events(new_events: prev_events, ev: ev, timeline: .dms, shouldNotify: !ours) + + dms.dms = dms.dms.sorted { a, b in + if a.1.events.count > 0 && b.1.events.count > 0 { + return a.1.events.last!.created_at > b.1.events.last!.created_at + } + return false + } + } + + return new_events +} + + +/// A helper to determine if we need to notify the user of new events +func handle_last_events(new_events: NewEventsBits, ev: NostrEvent, timeline: Timeline, shouldNotify: Bool = true) -> NewEventsBits? { + let last_ev = get_last_event(timeline) + + if last_ev == nil || last_ev!.created_at < ev.created_at { + save_last_event(ev, timeline: timeline) + if shouldNotify { + return NewEventsBits(prev: new_events, setting: timeline) + } + } + + return nil +}