make last-of-kind per-relay
also fix multiple subscriptions otherwise wonky things happen Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -42,7 +42,7 @@ struct ContentView: View {
|
||||
@State var loading: Bool = true
|
||||
@State var pool: RelayPool? = nil
|
||||
@State var selected_timeline: Timeline? = .home
|
||||
@State var last_event_of_kind: [Int: NostrEvent] = [:]
|
||||
@State var last_event_of_kind: [String: [Int: NostrEvent]] = [:]
|
||||
@State var has_events: [String: ()] = [:]
|
||||
@State var has_friend_event: [String: ()] = [:]
|
||||
@State var new_notifications: Bool = false
|
||||
@@ -184,11 +184,17 @@ struct ContentView: View {
|
||||
}
|
||||
}
|
||||
.onReceive(NotificationCenter.default.publisher(for: .post)) { obj in
|
||||
let post = obj.object as! NostrPost
|
||||
print("post \(post.content)")
|
||||
let privkey = ""
|
||||
let new_ev = post.to_event(privkey: privkey, pubkey: pubkey)
|
||||
self.pool?.send(.event(new_ev))
|
||||
|
||||
let post_res = obj.object as! NostrPostResult
|
||||
switch post_res {
|
||||
case .post(let post):
|
||||
print("post \(post.content)")
|
||||
let new_ev = post.to_event(privkey: privkey, pubkey: pubkey)
|
||||
self.pool?.send(.event(new_ev))
|
||||
case .cancel:
|
||||
active_sheet = nil
|
||||
print("post cancelled")
|
||||
}
|
||||
}
|
||||
.onReceive(timer) { n in
|
||||
self.pool?.connect_to_disconnected()
|
||||
@@ -230,24 +236,26 @@ struct ContentView: View {
|
||||
|
||||
func add_relay(_ pool: RelayPool, _ relay: String) {
|
||||
//add_rw_relay(pool, "wss://nostr-pub.wellorder.net")
|
||||
let wssrelay = "wss://\(relay)"
|
||||
add_rw_relay(pool, wssrelay)
|
||||
add_rw_relay(pool, relay)
|
||||
let profile = Profile(name: relay, about: nil, picture: nil)
|
||||
let ts = Int64(Date().timeIntervalSince1970)
|
||||
let tsprofile = TimestampedProfile(profile: profile, timestamp: ts)
|
||||
self.profiles.add(id: wssrelay, profile: tsprofile)
|
||||
self.profiles.add(id: relay, profile: tsprofile)
|
||||
}
|
||||
|
||||
func connect() {
|
||||
let pool = RelayPool()
|
||||
|
||||
add_relay(pool, "nostr-pub.wellorder.net")
|
||||
add_relay(pool, "nostr.onsats.org")
|
||||
add_relay(pool, "nostr.bitcoiner.social")
|
||||
add_relay(pool, "nostr-relay.freeberty.net")
|
||||
add_relay(pool, "nostr-relay.untethr.me")
|
||||
add_relay(pool, "wss://nostr-pub.wellorder.net")
|
||||
add_relay(pool, "wss://nostr.onsats.org")
|
||||
add_relay(pool, "wss://nostr.bitcoiner.social")
|
||||
add_relay(pool, "ws://monad.jb55.com:8080")
|
||||
add_relay(pool, "wss://nostr-relay.freeberty.net")
|
||||
add_relay(pool, "wss://nostr-relay.untethr.me")
|
||||
|
||||
pool.register_handler(sub_id: sub_id, handler: handle_event)
|
||||
pool.register_handler(sub_id: sub_id) { (relay_id, ev) in
|
||||
self.handle_event(relay_id: relay_id, conn_event: ev)
|
||||
}
|
||||
|
||||
self.pool = pool
|
||||
pool.connect()
|
||||
@@ -280,16 +288,25 @@ struct ContentView: View {
|
||||
self.profiles.add(id: ev.pubkey, profile: tprof)
|
||||
}
|
||||
|
||||
func get_last_event_of_kind(relay_id: String, kind: Int) -> NostrEvent? {
|
||||
guard let m = last_event_of_kind[relay_id] else {
|
||||
last_event_of_kind[relay_id] = [:]
|
||||
return nil
|
||||
}
|
||||
|
||||
return m[kind]
|
||||
}
|
||||
|
||||
func send_filters(relay_id: String) {
|
||||
// TODO: since times should be based on events from a specific relay
|
||||
// perhaps we could mark this in the relay pool somehow
|
||||
|
||||
let last_text_event = last_event_of_kind[NostrKind.text.rawValue]
|
||||
let last_text_event = get_last_event_of_kind(relay_id: relay_id, kind: NostrKind.text.rawValue)
|
||||
let since = get_since_time(last_event: last_text_event)
|
||||
var since_filter = NostrFilter.filter_text
|
||||
since_filter.since = since
|
||||
|
||||
let last_metadata_event = last_event_of_kind[NostrKind.metadata.rawValue]
|
||||
let last_metadata_event = get_last_event_of_kind(relay_id: relay_id, kind: NostrKind.metadata.rawValue)
|
||||
var profile_filter = NostrFilter.filter_profiles
|
||||
if let prof_since = get_metadata_since_time(last_metadata_event) {
|
||||
profile_filter.since = prof_since
|
||||
@@ -305,7 +322,7 @@ struct ContentView: View {
|
||||
|
||||
let filters = [since_filter, profile_filter, contacts_filter]
|
||||
print("connected to \(relay_id), refreshing from \(since)")
|
||||
self.pool?.send(.subscribe(.init(filters: filters, sub_id: sub_id)))
|
||||
self.pool?.send(.subscribe(.init(filters: filters, sub_id: sub_id)), to: [relay_id])
|
||||
//self.pool?.send(.subscribe(.init(filters: [notification_filter], sub_id: "notifications")))
|
||||
}
|
||||
|
||||
@@ -330,12 +347,12 @@ struct ContentView: View {
|
||||
self.friend_events = self.friend_events.sorted { $0.created_at > $1.created_at }
|
||||
}
|
||||
|
||||
func process_event(_ ev: NostrEvent) {
|
||||
func process_event(relay_id: String, ev: NostrEvent) {
|
||||
if has_events[ev.id] == nil {
|
||||
has_events[ev.id] = ()
|
||||
let last_k = last_event_of_kind[ev.kind]
|
||||
let last_k = get_last_event_of_kind(relay_id: relay_id, kind: ev.kind)
|
||||
if last_k == nil || ev.created_at > last_k!.created_at {
|
||||
last_event_of_kind[ev.kind] = ev
|
||||
last_event_of_kind[relay_id]?[ev.kind] = ev
|
||||
}
|
||||
if ev.kind == 1 {
|
||||
if !should_hide_event(ev) {
|
||||
@@ -409,7 +426,7 @@ struct ContentView: View {
|
||||
return
|
||||
}
|
||||
|
||||
self.process_event(ev)
|
||||
self.process_event(relay_id: relay_id, ev: ev)
|
||||
case .notice(let msg):
|
||||
self.events.insert(NostrEvent(content: "NOTICE from \(relay_id): \(msg)", pubkey: "system"), at: 0)
|
||||
print(msg)
|
||||
@@ -418,10 +435,6 @@ struct ContentView: View {
|
||||
}
|
||||
|
||||
func should_hide_event(_ ev: NostrEvent) -> Bool {
|
||||
// TODO: implement mute
|
||||
if ev.pubkey == "887645fef0ce0c3c1218d2f5d8e6132a19304cdc57cd20281d082f38cfea0072" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,6 +148,8 @@ func make_nostr_subscription_req(_ filters: [NostrFilter], sub_id: String) -> St
|
||||
}
|
||||
|
||||
func make_websocket(url: URL) -> WebSocket {
|
||||
return WebSocket(request: URLRequest(url: url), compressionHandler: .none)
|
||||
var req = URLRequest(url: url)
|
||||
//req.setValue("chat,superchat", forHTTPHeaderField: "Sec-WebSocket-Protocol")
|
||||
return WebSocket(request: req, compressionHandler: .none)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user