92 lines
2.8 KiB
Swift
92 lines
2.8 KiB
Swift
//
|
|
// 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)
|
|
}
|
|
}
|
|
|
|
let 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
|
|
}
|