diff options
| author | Adrien Hopkins <[email protected]> | 2025-12-13 15:07:32 -0500 |
|---|---|---|
| committer | Adrien Hopkins <[email protected]> | 2025-12-13 15:07:32 -0500 |
| commit | a1801b2c8c68da10fc70a835c46e6121e3cb73b5 (patch) | |
| tree | 23ac9a7e6c2ec09f694daff7c9d45a96ba87f407 /src | |
| parent | ee846df5039ee3768fa302812442a01e03f4e03a (diff) | |
| download | coinos-ui-a1801b2c8c68da10fc70a835c46e6121e3cb73b5.tar.gz coinos-ui-a1801b2c8c68da10fc70a835c46e6121e3cb73b5.zip | |
Get NIP-05 usernames
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/nip05.ts | 18 | ||||
| -rw-r--r-- | src/routes/(app)/dm/+page.svelte | 26 |
2 files changed, 39 insertions, 5 deletions
diff --git a/src/lib/nip05.ts b/src/lib/nip05.ts new file mode 100644 index 00000000..e79bdb02 --- /dev/null +++ b/src/lib/nip05.ts @@ -0,0 +1,18 @@ +import { PUBLIC_DM_RELAYS, PUBLIC_COINOS_RELAY } from '$env/static/public'; +const DM_RELAYS_LIST = PUBLIC_DM_RELAYS.split(','); +const NIP05_RELAYS = [ ...DM_RELAYS_LIST, PUBLIC_COINOS_RELAY ]; + +import { SimplePool } from 'nostr-tools/pool'; +const pool = new SimplePool(); + +export const getNip05 = async (pubkey: string) => { + const events = await pool.querySync( + NIP05_RELAYS, { kinds: [0], limit: 1, authors: [pubkey] } + ); + + if (events.length == 0) { + return null; + } + + return JSON.parse(events[0].content); +} diff --git a/src/routes/(app)/dm/+page.svelte b/src/routes/(app)/dm/+page.svelte index 025dde40..3e9d8629 100644 --- a/src/routes/(app)/dm/+page.svelte +++ b/src/routes/(app)/dm/+page.svelte @@ -1,19 +1,29 @@ <script lang="ts"> + import { isValid } from "nostr-tools/nip05"; import { t } from "$lib/translations"; import { pTagKeys } from '$lib/nostr'; + import { getNip05 } from '$lib/nip05'; import { getMessageRumours } from '$lib/nip17'; let { data } = $props(); const { user } = data; - const updateSendersRecipients = (rumours: object[]) => { + const userInfo = async (pubkey: string) => { + const nip05Info = await getNip05(pubkey); + const valid = await isValid(pubkey, nip05Info.nip05); + return { name: nip05Info.name, nip05: nip05Info.nip05, valid }; + } + + const updateSendersRecipients = async (rumours: object[]) => { const senders = new Set<string>(); const recipients = new Set<string>(); for (const rumour of rumours) { if (rumour.pubkey !== user.pubkey) { - senders.add(rumour.pubkey); + senders.add(await userInfo(rumour.pubkey)); } else { - pTagKeys(rumour).forEach(r => recipients.add(r)); + for (const pubkey of pTagKeys(rumour)) { + recipients.add(await userInfo(pubkey)); + } } } messageSenders = Array.from(senders); @@ -25,6 +35,12 @@ getMessageRumours(user).then(updateSendersRecipients); </script> +<style> + .invalid { + text-decoration: line-through; + } +</style> + <div class="container"> <div class="space-y-2 mx-auto space-y-5 lg:max-w-xl xl:max-w-2xl lg:pl-10 mt-5 lg:mt-0"> <h1 @@ -35,14 +51,14 @@ <p>The following people have sent messages to you:</p> <ul> {#each messageSenders as sender} - <li>{sender}</li> + <li class={sender.valid ? "" : "invalid"}>{sender.name}{#if sender.valid} ✓{/if}</li> {/each} </ul> <p>The following people have received messages from you:</p> <ul> {#each messageRecipients as recipient} - <li>{recipient}</li> + <li class={recipient.valid ? "" : "invalid"}>{recipient.name}{#if recipient.valid} ✓{/if}</li> {/each} </ul> </div> |
