From b4d54e3eb924bb51f3f1e27e51b38f58480d5763 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Fri, 9 Jan 2026 09:44:24 -0500 Subject: Add button to mute/unmute account --- src/lib/nip07.ts | 11 ++++++ src/lib/nip17.ts | 2 +- src/lib/nip51.ts | 35 ++++++++++++----- src/routes/(app)/dm/+page.svelte | 81 ++++++++++++++++++++++++++-------------- 4 files changed, 92 insertions(+), 37 deletions(-) create mode 100644 src/lib/nip07.ts diff --git a/src/lib/nip07.ts b/src/lib/nip07.ts new file mode 100644 index 00000000..b93779dc --- /dev/null +++ b/src/lib/nip07.ts @@ -0,0 +1,11 @@ +import { finalizeEvent } from 'nostr-tools/pure'; +import { getPrivateKey } from '$lib/nostr'; + +export const signEvent = async (event: object, user: object): object => { + if (await window.nostr.getPublicKey() === user.pubkey) { + return window.nostr.signEvent(event); + } else { + const sk = await getPrivateKey(); + return finalizeEvent(event, sk); + } +} diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts index 1a78eb5a..ce5654cf 100644 --- a/src/lib/nip17.ts +++ b/src/lib/nip17.ts @@ -4,7 +4,7 @@ import { finalizeEvent, getEventHash, generateSecretKey, getPublicKey } from 'no import { SimplePool } from 'nostr-tools/pool'; import { unwrapEvent } from 'nostr-tools/nip17'; -import { sign, getPrivateKey } from '$lib/nostr'; +import { getPrivateKey } from '$lib/nostr'; import { relaysSupporting } from '$lib/nip11'; import { expired, expiration } from '$lib/nip40'; import { encrypt, u } from '$lib/nip44'; diff --git a/src/lib/nip51.ts b/src/lib/nip51.ts index 142f0bbf..521ba60a 100644 --- a/src/lib/nip51.ts +++ b/src/lib/nip51.ts @@ -1,16 +1,27 @@ import { SimplePool } from 'nostr-tools/pool'; +import { verifyEvent } from 'nostr-tools/pure'; +import { signEvent } from '$lib/nip07'; const pool = new SimplePool(); import { PUBLIC_DM_RELAYS } from '$env/static/public'; const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(','); -// export const mute = async (pubkey: string, hidden: bool) => { - -// } +export const mute = async (user: object, pubkey: string, hide: bool) => { + let { shown, hidden } = await getMuteLists(user); + if (hide) { + hidden.push(pubkey); + } else { + shown.push(pubkey); + } + await publishMuteList(user, shown, hidden); +} -// export const unmute = async (pubkey: string) => { - -// } +export const unmute = async (user: object, pubkey: string) => { + let { shown, hidden } = await getMuteLists(user); + shown = shown.filter(p => p !== pubkey); + hidden = hidden.filter(p => p !== pubkey); + await publishMuteList(user, shown, hidden); +} export const mutedAccounts = async (user: object): Set => { const { shown, hidden } = await getMuteLists(user); @@ -42,6 +53,12 @@ const getMuteLists = async (user: object): object => { return { shown, hidden: [] }; } -// const publishMuteList = async (shown: Array, hidden: Array) => { - -// } +const publishMuteList = async (user: object, shown: Array, hidden: Array) => { + const event = await signEvent({ + kind: 10000, + created_at: Math.floor(Date.now() / 1000), + tags: shown.map(p => ["p", p]), + content: '' + }, user); + return Promise.any(pool.publish(DM_RELAYS_LIST, event)); +} diff --git a/src/routes/(app)/dm/+page.svelte b/src/routes/(app)/dm/+page.svelte index 336733e0..a8da9538 100644 --- a/src/routes/(app)/dm/+page.svelte +++ b/src/routes/(app)/dm/+page.svelte @@ -10,7 +10,7 @@ import { getMessageRumours } from '$lib/nip17'; import * as libnip17 from '$lib/nip17'; import { npubEncode, decode } from 'nostr-tools/nip19'; - import { mutedAccounts } from '$lib/nip51'; + import { mute, unmute, mutedAccounts } from '$lib/nip51'; import { sign, getPrivateKey, pTagKeys } from '$lib/nostr'; import { t } from "$lib/translations"; import { theme } from "$lib/store"; @@ -18,9 +18,6 @@ let { data } = $props(); const { user } = data; - let muted = $state(new Set()); - mutedAccounts(user).then((m) => muted = m); - /// chat selection const usernameFromPubkey = async (pubkey: string): string => { const response = await fetch(`/api/users/${pubkey}`); @@ -260,6 +257,18 @@ } relayWarningShown = false; }); + + let muted = $state(new Set()); + mutedAccounts(user).then((m) => muted = m); + + const toggleMute = async (pubkey: string) => { + if (muted && muted.has(pubkey)) { + await unmute(user, pubkey); + } else { + await mute(user, pubkey, false); + } + muted = await mutedAccounts(user); + }