aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdrien Hopkins <[email protected]>2025-12-13 15:07:32 -0500
committerAdrien Hopkins <[email protected]>2025-12-13 15:07:32 -0500
commita1801b2c8c68da10fc70a835c46e6121e3cb73b5 (patch)
tree23ac9a7e6c2ec09f694daff7c9d45a96ba87f407 /src
parentee846df5039ee3768fa302812442a01e03f4e03a (diff)
downloadcoinos-ui-a1801b2c8c68da10fc70a835c46e6121e3cb73b5.tar.gz
coinos-ui-a1801b2c8c68da10fc70a835c46e6121e3cb73b5.zip
Get NIP-05 usernames
Diffstat (limited to 'src')
-rw-r--r--src/lib/nip05.ts18
-rw-r--r--src/routes/(app)/dm/+page.svelte26
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} &#x2713;{/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} &#x2713;{/if}</li>
{/each}
</ul>
</div>