Files
damus/damus/Util/Lists.swift
2024-01-25 12:10:22 -08:00

71 lines
2.2 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: RefId) -> 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: RefId) -> NostrEvent? {
return remove_from_list_event(keypair: keypair, prev: prev, to_remove: to_remove)
}
func create_or_update_list_event(keypair: FullKeypair, mprev: NostrEvent?, to_add: RefId, list_name: String, list_type: String) -> NostrEvent? {
if let prev = mprev,
prev.pubkey == keypair.pubkey,
matches_list_name(tags: prev.tags, name: list_name)
{
return add_to_list_event(keypair: keypair, prev: prev, to_add: to_add)
}
let tags = [["d", list_name], [list_type, to_add.description]]
return NostrEvent(content: "", keypair: keypair.to_keypair(), kind: 30000, tags: tags)
}
func remove_from_list_event(keypair: FullKeypair, prev: NostrEvent, to_remove: RefId) -> NostrEvent? {
var removed = false
let tags = prev.tags.reduce(into: [[String]](), { acc, tag in
if let ref_id = RefId.from_tag(tag: tag), ref_id == to_remove {
removed = true
return
}
acc.append(tag.strings())
})
guard removed else {
return nil
}
return NostrEvent(content: prev.content, keypair: keypair.to_keypair(), kind: 30000, tags: tags)
}
func add_to_list_event(keypair: FullKeypair, prev: NostrEvent, to_add: RefId) -> NostrEvent? {
for tag in prev.tags {
// we are already muting this user
if let ref = RefId.from_tag(tag: tag), to_add == ref {
return nil
}
}
var tags = prev.tags.strings()
tags.append(to_add.tag)
return NostrEvent(content: prev.content, keypair: keypair.to_keypair(), kind: 30000, tags: tags)
}
func matches_list_name(tags: Tags, name: String) -> Bool {
for tag in tags {
if tag.count >= 2 && tag[0].matches_char("d") {
return tag[1].matches_str(name)
}
}
return false
}