03691d0369
A fairly large change that replaces Zaps in the codebase with "Zapping" which is a tagged union consisting of a resolved Zap and a Pending Zap. These are both counted as Zaps everywhere in Damus, except pending zaps can be cancelled (most of the time).
83 lines
2.2 KiB
Swift
83 lines
2.2 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.filter_kinds([NostrKind.zap.rawValue])
|
|
switch target {
|
|
case .profile(let profile_id):
|
|
filter.pubkeys = [profile_id]
|
|
case .note(let note_target):
|
|
filter.referenced_ids = [note_target.note_id]
|
|
}
|
|
state.pool.subscribe(sub_id: zaps_subid, filters: [filter], handler: handle_event)
|
|
}
|
|
|
|
func unsubscribe() {
|
|
state.pool.unsubscribe(sub_id: zaps_subid)
|
|
}
|
|
|
|
func handle_event(relay_id: String, 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 }
|
|
load_profiles(profiles_subid: profiles_subid, relay_id: relay_id, load: .from_events(events), damus_state: state)
|
|
case .event(_, let ev):
|
|
guard ev.kind == 9735 else {
|
|
return
|
|
}
|
|
|
|
if let zap = state.zaps.zaps[ev.id] {
|
|
state.events.store_zap(zap: zap)
|
|
return
|
|
}
|
|
|
|
guard let zapper = state.profiles.lookup_zapper(pubkey: target.pubkey) else {
|
|
return
|
|
}
|
|
|
|
guard 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))
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|