58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
import {derived} from "svelte/store"
|
|
import {displayProfileByPubkey, getProfile, userFollowList, userMuteList} from "@welshman/app"
|
|
import {shuffle, tryCatch} from "@welshman/lib"
|
|
import {
|
|
getAddress,
|
|
getAddressTagValues,
|
|
getEventTagValues,
|
|
getListTags,
|
|
getParentAddrs,
|
|
getParentIds,
|
|
getPubkeyTagValues,
|
|
getTagValues,
|
|
} from "@welshman/util"
|
|
import type {TrustedEvent} from "@welshman/util"
|
|
import {withGetter} from "@welshman/store"
|
|
import {DEFAULT_PUBKEYS} from "@app/env"
|
|
export const bootstrapPubkeys = derived(userFollowList, $userFollowList => {
|
|
const appPubkeys = DEFAULT_PUBKEYS.split(",")
|
|
const userPubkeys = shuffle(getPubkeyTagValues(getListTags($userFollowList)))
|
|
|
|
return userPubkeys.length > 5 ? userPubkeys : [...userPubkeys, ...appPubkeys]
|
|
})
|
|
|
|
export const isEventMuted = withGetter(
|
|
derived(userMuteList, $userMuteList => {
|
|
const pubkey = $userMuteList?.event.pubkey
|
|
const tags = getListTags($userMuteList)
|
|
const mutedEvents = new Set(getEventTagValues(tags))
|
|
const mutedPubkeys = new Set(getPubkeyTagValues(tags))
|
|
const mutedAddresses = new Set(getAddressTagValues(tags))
|
|
const mutedTopics = new Set(getTagValues("t", tags))
|
|
const mutedWords = getTagValues("word", tags)
|
|
const regex =
|
|
mutedWords.length > 0
|
|
? new RegExp(`\\b(${mutedWords.map(w => w.toLowerCase().trim()).join("|")})\\b`)
|
|
: null
|
|
|
|
return (e: TrustedEvent) => {
|
|
if (!pubkey) return false
|
|
if (pubkey === e.pubkey) return false
|
|
if (mutedPubkeys.has(e.pubkey)) return true
|
|
if (mutedEvents.has(e.id)) return true
|
|
if (mutedAddresses.has(getAddress(e))) return true
|
|
if (getParentIds(e).some(id => mutedEvents.has(id))) return true
|
|
if (getParentAddrs(e).some(address => mutedAddresses.has(address))) return true
|
|
if (getTagValues("t", e.tags).some(t => mutedTopics.has(t))) return true
|
|
|
|
if (regex) {
|
|
if (e.content?.toLowerCase().match(regex)) return true
|
|
if (displayProfileByPubkey(e.pubkey).toLowerCase().match(regex)) return true
|
|
if (tryCatch(() => getProfile(e.pubkey)?.nip05?.match(regex))) return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
}),
|
|
)
|