Initial NIP-51 Mute List Implementation
This commit is contained in:
@@ -12,12 +12,25 @@ import Vault
|
||||
let PUBKEY_HRP = "npub"
|
||||
let PRIVKEY_HRP = "nsec"
|
||||
|
||||
struct FullKeypair {
|
||||
let pubkey: String
|
||||
let privkey: String
|
||||
}
|
||||
|
||||
struct Keypair {
|
||||
let pubkey: String
|
||||
let privkey: String?
|
||||
let pubkey_bech32: String
|
||||
let privkey_bech32: String?
|
||||
|
||||
func to_full() -> FullKeypair? {
|
||||
guard let privkey = self.privkey else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return FullKeypair(pubkey: pubkey, privkey: privkey)
|
||||
}
|
||||
|
||||
init(pubkey: String, privkey: String?) {
|
||||
self.pubkey = pubkey
|
||||
self.privkey = privkey
|
||||
|
||||
91
damus/Util/Lists.swift
Normal file
91
damus/Util/Lists.swift
Normal file
@@ -0,0 +1,91 @@
|
||||
//
|
||||
// Mute.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-01-25.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
func create_or_update_mutelist(keypair: FullKeypair, mprev: NostrEvent?, to_add: String) -> NostrEvent? {
|
||||
return create_or_update_list_event(keypair: keypair, mprev: mprev, to_add: to_add, list_name: "mute", list_type: "p")
|
||||
}
|
||||
|
||||
func remove_from_mutelist(keypair: FullKeypair, prev: NostrEvent, to_remove: String) -> NostrEvent? {
|
||||
return remove_from_list_event(keypair: keypair, prev: prev, to_remove: to_remove, tag_type: "p")
|
||||
}
|
||||
|
||||
func create_or_update_list_event(keypair: FullKeypair, mprev: NostrEvent?, to_add: String, list_name: String, list_type: String) -> NostrEvent? {
|
||||
let pubkey = keypair.pubkey
|
||||
|
||||
if let prev = mprev {
|
||||
if let okprev = ensure_list_name(list: prev, name: list_name), prev.pubkey == keypair.pubkey {
|
||||
return add_to_list_event(keypair: keypair, prev: okprev, to_add: to_add, tag_type: list_type)
|
||||
}
|
||||
}
|
||||
|
||||
var tags = [["d", list_name], [list_type, to_add]]
|
||||
let ev = NostrEvent(content: "", pubkey: pubkey, kind: 30000, tags: tags)
|
||||
|
||||
ev.tags = tags
|
||||
ev.id = calculate_event_id(ev: ev)
|
||||
ev.sig = sign_event(privkey: keypair.privkey, ev: ev)
|
||||
|
||||
return ev
|
||||
}
|
||||
|
||||
func remove_from_list_event(keypair: FullKeypair, prev: NostrEvent, to_remove: String, tag_type: String) -> NostrEvent? {
|
||||
var exists = false
|
||||
for tag in prev.tags {
|
||||
if tag.count >= 2 && tag[0] == tag_type && tag[1] == to_remove {
|
||||
exists = true
|
||||
}
|
||||
}
|
||||
|
||||
// make sure we actually have the pubkey to remove
|
||||
guard exists else {
|
||||
return nil
|
||||
}
|
||||
|
||||
let new_tags = prev.tags.filter { tag in
|
||||
!(tag.count >= 2 && tag[0] == tag_type && tag[1] == to_remove)
|
||||
}
|
||||
|
||||
let ev = NostrEvent(content: prev.content, pubkey: keypair.pubkey, kind: 30000, tags: new_tags)
|
||||
ev.id = calculate_event_id(ev: ev)
|
||||
ev.sig = sign_event(privkey: keypair.privkey, ev: ev)
|
||||
|
||||
return ev
|
||||
}
|
||||
|
||||
func add_to_list_event(keypair: FullKeypair, prev: NostrEvent, to_add: String, tag_type: String) -> NostrEvent? {
|
||||
for tag in prev.tags {
|
||||
// we are already muting this user
|
||||
if tag.count >= 2 && tag[0] == tag_type && tag[1] == to_add {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
let new = NostrEvent(content: prev.content, pubkey: keypair.pubkey, kind: 30000, tags: prev.tags)
|
||||
new.tags.append([tag_type, to_add])
|
||||
new.id = calculate_event_id(ev: new)
|
||||
new.sig = sign_event(privkey: keypair.privkey, ev: new)
|
||||
|
||||
return new
|
||||
}
|
||||
|
||||
func ensure_list_name(list: NostrEvent, name: String) -> NostrEvent? {
|
||||
for tag in list.tags {
|
||||
if tag.count >= 2 && tag[0] == "d" {
|
||||
if tag[1] != name {
|
||||
return nil
|
||||
} else {
|
||||
return list
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
list.tags.insert(["d", name], at: 0)
|
||||
|
||||
return list
|
||||
}
|
||||
Reference in New Issue
Block a user