From 96abe5f24f3ade09397a7d754fd8f80749074471 Mon Sep 17 00:00:00 2001 From: codytseng Date: Tue, 23 Dec 2025 23:30:57 +0800 Subject: [PATCH] feat: add compatibility for legacy comments --- src/lib/draft-event.ts | 54 ++++++++++++++++++++++------------ src/lib/event.ts | 26 +++++++++++++--- src/services/client.service.ts | 4 +++ src/services/fayan.service.ts | 1 - 4 files changed, 61 insertions(+), 24 deletions(-) diff --git a/src/lib/draft-event.ts b/src/lib/draft-event.ts index 9e3d66d..4d531e9 100644 --- a/src/lib/draft-event.ts +++ b/src/lib/draft-event.ts @@ -16,7 +16,7 @@ import { Event, kinds, nip19 } from 'nostr-tools' import { getReplaceableCoordinate, getReplaceableCoordinateFromEvent, - getRootETag, + getRootTag, isProtectedEvent, isReplaceableEvent } from './event' @@ -153,7 +153,7 @@ export async function createShortTextNoteDraftEvent( } = {} ): Promise { const { content: transformedEmojisContent, emojiTags } = transformCustomEmojisInContent(content) - const { quoteTags, rootETag, parentETag } = await extractRelatedEventIds( + const { quoteTags, rootTag, parentTag } = await extractRelatedEventIds( transformedEmojisContent, options.parentEvent ) @@ -170,13 +170,13 @@ export async function createShortTextNoteDraftEvent( // q tags tags.push(...quoteTags) - // e tags - if (rootETag.length) { - tags.push(rootETag) + // thread tags + if (rootTag) { + tags.push(rootTag) } - if (parentETag.length) { - tags.push(parentETag) + if (parentTag) { + tags.push(parentTag) } // p tags @@ -640,36 +640,42 @@ function generateImetaTags(imageUrls: string[]) { } async function extractRelatedEventIds(content: string, parentEvent?: Event) { - let rootETag: string[] = [] - let parentETag: string[] = [] + let rootTag: string[] | null = null + let parentTag: string[] | null = null const quoteTags = extractQuoteTags(content) if (parentEvent) { - const _rootETag = getRootETag(parentEvent) - if (_rootETag) { - parentETag = buildETagWithMarker(parentEvent.id, parentEvent.pubkey, '', 'reply') + const _rootTag = getRootTag(parentEvent) + if (_rootTag?.type === 'e') { + parentTag = buildETagWithMarker(parentEvent.id, parentEvent.pubkey, '', 'reply') - const [, rootEventHexId, hint, , rootEventPubkey] = _rootETag + const [, rootEventHexId, hint, , rootEventPubkey] = _rootTag.tag if (rootEventPubkey) { - rootETag = buildETagWithMarker(rootEventHexId, rootEventPubkey, hint, 'root') + rootTag = buildETagWithMarker(rootEventHexId, rootEventPubkey, hint, 'root') } else { - const rootEventId = generateBech32IdFromETag(_rootETag) + const rootEventId = generateBech32IdFromETag(_rootTag.tag) const rootEvent = rootEventId ? await client.fetchEvent(rootEventId) : undefined - rootETag = rootEvent + rootTag = rootEvent ? buildETagWithMarker(rootEvent.id, rootEvent.pubkey, hint, 'root') : buildETagWithMarker(rootEventHexId, rootEventPubkey, hint, 'root') } + } + if (_rootTag?.type === 'a') { + // Legacy + parentTag = buildETagWithMarker(parentEvent.id, parentEvent.pubkey, '', 'reply') + const [, coordinate, hint] = _rootTag.tag + rootTag = buildLegacyRootATag(coordinate, hint) } else { // reply to root event - rootETag = buildETagWithMarker(parentEvent.id, parentEvent.pubkey, '', 'root') + rootTag = buildETagWithMarker(parentEvent.id, parentEvent.pubkey, '', 'root') } } return { quoteTags, - rootETag, - parentETag + rootTag, + parentTag } } @@ -823,6 +829,16 @@ function buildETagWithMarker( return trimTagEnd(['e', eventHexId, hint, marker, pubkey]) } +function buildLegacyRootATag(coordinate: string, hint: string = '') { + if (!hint) { + const evt = client.getReplaeableEventFromCache(coordinate) + if (evt) { + hint = client.getEventHint(evt.id) + } + } + return trimTagEnd(['a', coordinate, hint, 'root']) +} + function buildITag(url: string, upperCase: boolean = false) { return [upperCase ? 'I' : 'i', url] } diff --git a/src/lib/event.ts b/src/lib/event.ts index f4a64e8..e40cefe 100644 --- a/src/lib/event.ts +++ b/src/lib/event.ts @@ -83,6 +83,14 @@ export function getParentETag(event?: Event) { return tag } +function getLegacyParentATag(event?: Event) { + if (!event || event.kind !== kinds.ShortTextNote) { + return undefined + } + + return event.tags.find(([tagName, , , marker]) => tagName === 'a' && marker === 'reply') +} + export function getParentATag(event?: Event) { if ( !event || @@ -114,8 +122,9 @@ export function getParentTag(event?: Event): { type: 'e' | 'a' | 'i'; tag: strin if (!event) return undefined if (event.kind === kinds.ShortTextNote) { - const tag = getParentETag(event) - return tag ? { type: 'e', tag } : undefined + const tag = getLegacyParentATag(event) ?? getParentETag(event) ?? getLegacyRootATag(event) + if (!tag) return undefined + return { type: tag[0] === 'e' ? 'e' : 'a', tag } } // NIP-22 @@ -164,6 +173,14 @@ export function getRootETag(event?: Event) { return tag } +function getLegacyRootATag(event?: Event) { + if (!event || event.kind !== kinds.ShortTextNote) { + return undefined + } + + return event.tags.find(([tagName, , , marker]) => tagName === 'a' && marker === 'root') +} + export function getRootATag(event?: Event) { if ( !event || @@ -195,8 +212,9 @@ export function getRootTag(event?: Event): { type: 'e' | 'a' | 'i'; tag: string[ if (!event) return undefined if (event.kind === kinds.ShortTextNote) { - const tag = getRootETag(event) - return tag ? { type: 'e', tag } : undefined + const tag = getLegacyRootATag(event) ?? getRootETag(event) + if (!tag) return undefined + return { type: tag[0] === 'e' ? 'e' : 'a', tag } } // NIP-22 diff --git a/src/services/client.service.ts b/src/services/client.service.ts index e68a461..2612339 100644 --- a/src/services/client.service.ts +++ b/src/services/client.service.ts @@ -842,6 +842,10 @@ class ClientService extends EventTarget { } } + getReplaeableEventFromCache(coordinate: string): NEvent | undefined { + return this.replaceableEventCacheMap.get(coordinate) + } + private async fetchEventById(relayUrls: string[], id: string): Promise { const event = await this.fetchEventFromBigRelaysDataloader.load(id) if (event) { diff --git a/src/services/fayan.service.ts b/src/services/fayan.service.ts index 2fb3370..0c89039 100644 --- a/src/services/fayan.service.ts +++ b/src/services/fayan.service.ts @@ -17,7 +17,6 @@ class FayanService { return new Array(pubkeys.length).fill(null) } const data = await res.json() - console.log('FayanService fetched user percentiles:', data) return pubkeys.map((pubkey) => data[pubkey] ?? null) } catch { return new Array(pubkeys.length).fill(null)