import type { Event } from 'nostr-tools' import { extractTagsFromEvent } from '../nostrTagSystem' import { generateAuthorHashId } from '../hashIdGenerator' import type { ExtractedAuthor } from './types' import { getMetadataFromEvent } from './metadataJson' import { firstString } from './utils' export async function extractAuthorFromEvent(event: Event): Promise { const tags = extractTagsFromEvent(event) if (tags.type !== 'author') { return null } const metadata = getMetadataFromEvent(event) if (metadata?.type !== 'author') { return null } const data = buildAuthorDataFromMetadata({ event, tags, metadata }) const id = await generateAuthorHashId(data) return buildExtractedAuthor({ eventId: event.id, id, data, metadata }) } function buildAuthorDataFromMetadata(params: { event: Event tags: ReturnType metadata: Record }): { pubkey: string authorName: string presentation: string contentDescription: string mainnetAddress?: string pictureUrl?: string category: string } { const pubkey = firstString(params.metadata.pubkey, params.event.pubkey) ?? params.event.pubkey const mainnetAddress = firstString(params.metadata.mainnetAddress) const pictureUrl = firstString(params.metadata.pictureUrl) return { pubkey, authorName: firstString(params.metadata.authorName) ?? '', presentation: firstString(params.metadata.presentation) ?? '', contentDescription: firstString(params.metadata.contentDescription) ?? '', ...(mainnetAddress ? { mainnetAddress } : {}), ...(pictureUrl ? { pictureUrl } : {}), category: firstString(params.metadata.category, params.tags.category, 'sciencefiction') ?? 'sciencefiction', } } function buildExtractedAuthor(params: { eventId: string id: string data: { pubkey: string authorName: string presentation: string contentDescription: string mainnetAddress?: string pictureUrl?: string category: string } metadata: Record }): ExtractedAuthor { const url = firstString(params.metadata.url) return { type: 'author', id: params.id, pubkey: params.data.pubkey, authorName: params.data.authorName, presentation: params.data.presentation, contentDescription: params.data.contentDescription, category: params.data.category, eventId: params.eventId, ...(params.data.mainnetAddress ? { mainnetAddress: params.data.mainnetAddress } : {}), ...(params.data.pictureUrl ? { pictureUrl: params.data.pictureUrl } : {}), ...(url ? { url } : {}), } }