import Nostrich from "nostrich.webp"; import { TaggedRawEvent } from "Nostr"; import EventKind from "Nostr/EventKind"; import type { NotificationRequest } from "State/Login"; import { MetadataCache, UsersDb } from "State/Users"; import { getDisplayName } from "Element/ProfileImage"; import { MentionRegex } from "Const"; export async function makeNotification( db: UsersDb, ev: TaggedRawEvent ): Promise { switch (ev.kind) { case EventKind.TextNote: { const pubkeys = new Set([ ev.pubkey, ...ev.tags.filter((a) => a[0] === "p").map((a) => a[1]), ]); const users = await db.bulkGet(Array.from(pubkeys)); const fromUser = users.find((a) => a?.pubkey === ev.pubkey); const name = getDisplayName(fromUser, ev.pubkey); const avatarUrl = fromUser?.picture || Nostrich; return { title: `Reply from ${name}`, body: replaceTagsWithUser(ev, users).substring(0, 50), icon: avatarUrl, timestamp: ev.created_at * 1000, }; } } return null; } function replaceTagsWithUser(ev: TaggedRawEvent, users: MetadataCache[]) { return ev.content .split(MentionRegex) .map((match) => { const matchTag = match.match(/#\[(\d+)\]/); if (matchTag && matchTag.length === 2) { const idx = parseInt(matchTag[1]); const ref = ev.tags[idx]; if (ref && ref[0] === "p" && ref.length > 1) { const u = users.find((a) => a.pubkey === ref[1]); return `@${getDisplayName(u, ref[1])}`; } } return match; }) .join(); }