feat: add compatibility for legacy comments

This commit is contained in:
codytseng
2025-12-23 23:30:57 +08:00
parent 0ee93718da
commit 96abe5f24f
4 changed files with 61 additions and 24 deletions

View File

@@ -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<TDraftEvent> {
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]
}

View File

@@ -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

View File

@@ -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<NEvent | undefined> {
const event = await this.fetchEventFromBigRelaysDataloader.load(id)
if (event) {

View File

@@ -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)