This commit implements a new layer called NostrNetworkManager, responsible for managing interactions with the Nostr network, and providing a higher level API that is easier and more secure to use for the layer above it. It also integrates it with the rest of the app, by moving RelayPool and PostBox into NostrNetworkManager, along with all their usages. Changelog-Added: Added NIP-65 relay list support Changelog-Changed: Improved robustness of relay list handling Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
77 lines
2.1 KiB
Swift
77 lines
2.1 KiB
Swift
//
|
|
// ZapsModel.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2023-02-10.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
class ZapsModel: ObservableObject {
|
|
let state: DamusState
|
|
let target: ZapTarget
|
|
|
|
let zaps_subid = UUID().description
|
|
let profiles_subid = UUID().description
|
|
|
|
init(state: DamusState, target: ZapTarget) {
|
|
self.state = state
|
|
self.target = target
|
|
}
|
|
|
|
var zaps: [Zapping] {
|
|
return state.events.lookup_zaps(target: target)
|
|
}
|
|
|
|
func subscribe() {
|
|
var filter = NostrFilter(kinds: [.zap])
|
|
switch target {
|
|
case .profile(let profile_id):
|
|
filter.pubkeys = [profile_id]
|
|
case .note(let note_target):
|
|
filter.referenced_ids = [note_target.note_id]
|
|
}
|
|
state.nostrNetwork.pool.subscribe(sub_id: zaps_subid, filters: [filter], handler: handle_event)
|
|
}
|
|
|
|
func unsubscribe() {
|
|
state.nostrNetwork.pool.unsubscribe(sub_id: zaps_subid)
|
|
}
|
|
|
|
@MainActor
|
|
func handle_event(relay_id: RelayURL, conn_ev: NostrConnectionEvent) {
|
|
guard case .nostr_event(let resp) = conn_ev else {
|
|
return
|
|
}
|
|
|
|
guard resp.subid == zaps_subid else {
|
|
return
|
|
}
|
|
|
|
switch resp {
|
|
case .ok:
|
|
break
|
|
case .notice:
|
|
break
|
|
case .eose:
|
|
let events = state.events.lookup_zaps(target: target).map { $0.request.ev }
|
|
guard let txn = NdbTxn(ndb: state.ndb) else { return }
|
|
load_profiles(context: "zaps_model", profiles_subid: profiles_subid, relay_id: relay_id, load: .from_events(events), damus_state: state, txn: txn)
|
|
case .event(_, let ev):
|
|
guard ev.kind == 9735,
|
|
let zapper = state.profiles.lookup_zapper(pubkey: target.pubkey),
|
|
let zap = Zap.from_zap_event(zap_ev: ev, zapper: zapper, our_privkey: state.keypair.privkey)
|
|
else {
|
|
return
|
|
}
|
|
|
|
self.state.add_zap(zap: .zap(zap))
|
|
case .auth:
|
|
break
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|