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:
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: ¬ifications, 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
+}