From 48aa02226c08d25324cbf6a5861cec2faac335ac Mon Sep 17 00:00:00 2001 From: Silberengel Date: Wed, 25 Mar 2026 13:24:55 +0100 Subject: [PATCH] make sure kind 1111 has complete tags --- src/lib/draft-event.ts | 27 ++++++++++++++++++++------- src/lib/rss-article.ts | 7 ++++++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/lib/draft-event.ts b/src/lib/draft-event.ts index b2362d4c..ed935b5f 100644 --- a/src/lib/draft-event.ts +++ b/src/lib/draft-event.ts @@ -24,7 +24,7 @@ import { isProtectedEvent, isReplaceableEvent } from './event' -import { canonicalizeRssArticleUrl } from '@/lib/rss-article' +import { canonicalizeRssArticleUrl, NIP22_URL_SCOPE_KIND } from '@/lib/rss-article' import { cleanUrl } from '@/lib/url' import { randomString } from './random' import { generateBech32IdFromETag, tagNameEquals } from './tag' @@ -247,7 +247,9 @@ export async function createCommentDraftEvent( if (isRssArticleThreadRoot) { if (rssArticleUrl) { const u = canonicalizeHttpUrlForITags(rssArticleUrl) - tags.push(buildITag(u, false), buildITag(u, true)) + tags.push(buildITag(u, true), buildITag(u, false)) + const scopeKind = rootKind ?? NIP22_URL_SCOPE_KIND + tags.push(buildKTag(scopeKind, true), buildKTag(scopeKind)) } } else { if (rootCoordinateTag) { @@ -263,7 +265,7 @@ export async function createCommentDraftEvent( } if (rootUrl) { const u = canonicalizeHttpUrlForITags(rootUrl) - tags.push(buildITag(u, false), buildITag(u, true)) + tags.push(buildITag(u, true), buildITag(u, false)) } tags.push( ...[ @@ -1106,7 +1108,7 @@ async function extractCommentMentions(content: string, parentEvent: Event) { quoteReplaceableCoordinates, rootEventId: undefined, rootCoordinateTag: undefined, - rootKind: undefined, + rootKind: url ? NIP22_URL_SCOPE_KIND : undefined, rootPubkey: undefined, rootUrl: url } @@ -1119,12 +1121,21 @@ async function extractCommentMentions(content: string, parentEvent: Event) { ? buildATag(parentEvent, true) : undefined const rootEventId = isComment ? parentEvent.tags.find(tagNameEquals('E'))?.[1] : parentEvent.id - const rootKind = isComment ? parentEvent.tags.find(tagNameEquals('K'))?.[1] : parentEvent.kind + let rootKind = isComment ? parentEvent.tags.find(tagNameEquals('K'))?.[1] : parentEvent.kind const rootPubkey = isComment ? parentEvent.tags.find(tagNameEquals('P'))?.[1] : parentEvent.pubkey const rootUrl = isComment ? parentEvent.tags.find((t) => t[0] === 'I' || t[0] === 'i')?.[1] : undefined + if ( + isComment && + rootUrl && + (rootKind === undefined || rootKind === '') && + (rootUrl.startsWith('http://') || rootUrl.startsWith('https://')) + ) { + rootKind = NIP22_URL_SCOPE_KIND + } + return { quoteEventHexIds, quoteReplaceableCoordinates, @@ -1556,7 +1567,9 @@ export async function createVoiceCommentDraftEvent( if (isRssArticleThreadRootVoice) { if (rssArticleUrlVoice) { const u = canonicalizeHttpUrlForITags(rssArticleUrlVoice) - tags.push(buildITag(u, false), buildITag(u, true)) + tags.push(buildITag(u, true), buildITag(u, false)) + const scopeKind = rootKind ?? NIP22_URL_SCOPE_KIND + tags.push(buildKTag(scopeKind, true), buildKTag(scopeKind)) } } else { if (rootCoordinateTag) { @@ -1572,7 +1585,7 @@ export async function createVoiceCommentDraftEvent( } if (rootUrl) { const u = canonicalizeHttpUrlForITags(rootUrl) - tags.push(buildITag(u, false), buildITag(u, true)) + tags.push(buildITag(u, true), buildITag(u, false)) } tags.push( ...[ diff --git a/src/lib/rss-article.ts b/src/lib/rss-article.ts index b2418b39..a54c2db4 100644 --- a/src/lib/rss-article.ts +++ b/src/lib/rss-article.ts @@ -1,5 +1,8 @@ import { ExtendedKind } from '@/constants' import { cleanUrl } from '@/lib/url' + +/** NIP-22: `K` / `k` value for http(s) URL comment scopes (web pages, articles). */ +export const NIP22_URL_SCOPE_KIND = 'web' import { bytesToHex } from '@noble/hashes/utils' import { sha256 } from '@noble/hashes/sha256' import type { Event } from 'nostr-tools' @@ -62,8 +65,10 @@ export function createRssThreadRootEvent(articleUrl: string): Event { created_at: 0, kind: ExtendedKind.RSS_THREAD_ROOT, tags: [ + ['I', canonical], ['i', canonical], - ['I', canonical] + ['K', NIP22_URL_SCOPE_KIND], + ['k', NIP22_URL_SCOPE_KIND] ], content: '', sig: ''