diff options
| author | Adam Soltys <[email protected]> | 2026-03-01 22:20:59 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-03-01 22:20:59 -0800 |
| commit | 3bafa6c0f211a1aa8d223b9ad091016440947f2e (patch) | |
| tree | c698070f8acf80bdd65ae3eca553e5bfa2221320 /lib | |
| parent | 1649bfd6dc01e8bebccab97327db2d55addb8854 (diff) | |
| download | coinos-server-3bafa6c0f211a1aa8d223b9ad091016440947f2e.tar.gz coinos-server-3bafa6c0f211a1aa8d223b9ad091016440947f2e.zip | |
message notifications
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dmNotifications.ts | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/dmNotifications.ts b/lib/dmNotifications.ts new file mode 100644 index 00000000..3f229842 --- /dev/null +++ b/lib/dmNotifications.ts @@ -0,0 +1,52 @@ +import config from "$config"; +import { db, g } from "$lib/db"; +import { l, warn } from "$lib/logging"; +import { getUser } from "$lib/utils"; +import { Relay } from "nostr-tools/relay"; +import webpush from "web-push"; + +export const listenForDMs = async () => { + try { + const relay = await Relay.connect(config.nostr); + const since = Math.floor(Date.now() / 1000); + + relay.subscribe([{ kinds: [1059], since }], { + onevent: async (event) => { + const pTag = event.tags.find((t) => t[0] === "p"); + if (!pTag) return; + + const recipientPubkey = pTag[1]; + + try { + const user = await getUser(recipientPubkey); + if (!user?.id) return; + + const subscriptions = await db.sMembers(`${user.id}:subscriptions`); + if (!subscriptions?.length) return; + + const payload = JSON.stringify({ + title: "New message", + body: "You have a new encrypted message", + url: "/messages", + }); + + for (const s of subscriptions as any) { + webpush + .sendNotification(JSON.parse(s as string), payload) + .catch((e) => { + warn("dm push failed", e.message); + db.sRem(`${user.id}:subscriptions`, s); + }); + } + } catch (e) { + // User not found for this pubkey - not a coinos user + } + }, + }); + + l("listening for DM notifications on relay"); + } catch (e) { + warn("DM notification listener failed", e.message); + setTimeout(listenForDMs, 5000); + } +}; |
