import { extractTagsFromEvent } from '../nostrTagSystem' import { parseObjectId } from '../urlGenerator' export type ExtractedTags = ReturnType export function mapNostrCategoryToLegacy(category: string | undefined): 'science-fiction' | 'scientific-research' | undefined { if (category === 'sciencefiction') { return 'science-fiction' } if (category === 'research') { return 'scientific-research' } return undefined } export function getPreviewContent(content: string, previewTag?: string): { previewContent: string } { const lines = content.split('\n') const previewContent = previewTag ?? lines[0] ?? content.substring(0, 200) return { previewContent } } export function readRewardInfo(eventTags: string[][]): { rewarded: boolean; rewardAmount: number | undefined } { const rewarded = eventTags.some((tag) => tag[0] === 'rewarded' && tag[1] === 'true') const rewardAmountTag = eventTags.find((tag) => tag[0] === 'reward_amount')?.[1] const rewardAmountRaw = rewardAmountTag ? Number.parseInt(rewardAmountTag, 10) : Number.NaN const rewardAmount = Number.isNaN(rewardAmountRaw) ? undefined : rewardAmountRaw return { rewarded, rewardAmount } } export function readTextTag(eventTags: string[][]): string | undefined { return eventTags.find((tag) => tag[0] === 'text')?.[1] } export function readSeriesInput(params: { tags: ExtractedTags eventContent: string }): { idTag: string | undefined; defaultVersion: number; title: string; description: string; preview: string; coverUrl: string; categoryTag: string } | null { if (params.tags.type !== 'series' || !params.tags.title || !params.tags.description) { return null } return { idTag: params.tags.id, defaultVersion: params.tags.version ?? 0, title: params.tags.title, description: params.tags.description, preview: params.tags.preview ?? params.eventContent.substring(0, 200), coverUrl: params.tags.coverUrl ?? '', categoryTag: params.tags.category ?? 'sciencefiction', } } export function readReviewInput(tags: ExtractedTags): { idTag: string | undefined; defaultVersion: number; articleId: string; reviewerPubkey: string; title: string | undefined; description: string } | null { if (tags.type !== 'quote' || !tags.articleId || !tags.reviewerPubkey) { return null } return { idTag: tags.id, defaultVersion: tags.version ?? 0, articleId: tags.articleId, reviewerPubkey: tags.reviewerPubkey, title: tags.title, description: tags.description ?? '', } } export interface ObjectIdParts { hash: string version: number index: number } export function parseObjectIdPartsFromTag(params: { idTag: string; defaultVersion: number; defaultIndex: number }): ObjectIdParts { const parsed = parseObjectId(params.idTag) const hash = parsed.hash ?? params.idTag const version = parsed.version ?? params.defaultVersion const index = parsed.index ?? params.defaultIndex return { hash, version, index } } export async function resolveObjectIdParts(params: { idTag?: string defaultVersion: number defaultIndex: number generateHash: () => Promise }): Promise { if (params.idTag) { return parseObjectIdPartsFromTag({ idTag: params.idTag, defaultVersion: params.defaultVersion, defaultIndex: params.defaultIndex }) } const hash = await params.generateHash() return { hash, version: params.defaultVersion, index: params.defaultIndex } } export function resolveThumbnailUrl(tags: ExtractedTags): string { if (typeof tags.bannerUrl === 'string') { return tags.bannerUrl } if (typeof tags.pictureUrl === 'string') { return tags.pictureUrl } return '' }