import type { Event } from 'nostr-tools' export function isRecord(value: unknown): value is Record { return typeof value === 'object' && value !== null && !Array.isArray(value) } export function readPayerPubkeyFromZapReceipt(event: Event): string | undefined { const descriptionTag = readTagValue(event, 'description') if (!descriptionTag) { return undefined } try { const parsed: unknown = JSON.parse(descriptionTag) return isRecord(parsed) && typeof parsed.pubkey === 'string' ? parsed.pubkey : undefined } catch (e) { console.error('[metadataExtractor] Error parsing zap receipt description tag:', e) return undefined } } export function firstString(...values: unknown[]): string | undefined { for (const value of values) { if (typeof value === 'string') { return value } } return undefined } export function firstNumber(...values: unknown[]): number | undefined { for (const value of values) { if (typeof value === 'number') { return value } } return undefined } export function readTagValue(event: Event, key: string): string | undefined { return event.tags.find((tag) => tag[0] === key)?.[1] } export function readZapReceiptKind(event: Event): string | undefined { if (event.kind !== 9735) { return undefined } return readTagValue(event, 'kind_type') } export function readAmountSats(event: Event): number | undefined { const amountTag = readTagValue(event, 'amount') if (!amountTag) { return undefined } const millisats = Number.parseInt(amountTag, 10) if (Number.isNaN(millisats)) { return undefined } return millisats / 1000 } export function readPaymentHash(event: Event): string { return readTagValue(event, 'payment_hash') ?? event.id } export function resolveSponsoringArticleId(params: { articleTag: string | undefined; eTag: string | undefined }): string | undefined { return params.articleTag ?? params.eTag }