2026-01-13 14:49:19 +01:00

80 lines
2.6 KiB
TypeScript

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<ExtractedAuthor | null> {
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<typeof extractTagsFromEvent>
metadata: Record<string, unknown>
}): {
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<string, unknown>
}): 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 } : {}),
}
}