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

102 lines
3.6 KiB
TypeScript

import { extractTagsFromEvent } from '../nostrTagSystem'
import { parseObjectId } from '../urlGenerator'
export type ExtractedTags = ReturnType<typeof extractTagsFromEvent>
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<string>
}): Promise<ObjectIdParts> {
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 ''
}