This commit is contained in:
codytseng 2025-07-19 17:24:51 +08:00
parent 28ec943a52
commit 78725c1d14
45 changed files with 698 additions and 766 deletions

View file

@ -1,26 +1,22 @@
import client from '@/services/client.service'
import { TImageInfo } from '@/types'
import { TEmoji, TImageInfo } from '@/types'
import { isBlurhashValid } from 'blurhash'
import { Event, nip19 } from 'nostr-tools'
import { nip19 } from 'nostr-tools'
import { isValidPubkey } from './pubkey'
import { normalizeHttpUrl } from './url'
export function isSameTag(tag1: string[], tag2: string[]) {
if (tag1.length !== tag2.length) return false
for (let i = 0; i < tag1.length; i++) {
if (tag1[i] !== tag2[i]) return false
}
return true
}
export function tagNameEquals(tagName: string) {
return (tag: string[]) => tag[0] === tagName
}
export function isReplyETag([tagName, , , marker]: string[]) {
return tagName === 'e' && marker === 'reply'
}
export function isRootETag([tagName, , , marker]: string[]) {
return tagName === 'e' && marker === 'root'
}
export function isMentionETag([tagName, , , marker]: string[]) {
return tagName === 'e' && marker === 'mention'
}
export function generateEventIdFromETag(tag: string[]) {
export function generateBech32IdFromETag(tag: string[]) {
try {
const [, id, relay, , author] = tag
return nip19.neventEncode({ id, relays: relay ? [relay] : undefined, author })
@ -29,7 +25,7 @@ export function generateEventIdFromETag(tag: string[]) {
}
}
export function generateEventIdFromATag(tag: string[]) {
export function generateBech32IdFromATag(tag: string[]) {
try {
const [, coordinate, relay] = tag
const [kind, pubkey, identifier] = coordinate.split(':')
@ -44,12 +40,7 @@ export function generateEventIdFromATag(tag: string[]) {
}
}
export function generateEventId(event: Pick<Event, 'id' | 'pubkey'>) {
const relay = client.getEventHint(event.id)
return nip19.neventEncode({ id: event.id, author: event.pubkey, relays: [relay] })
}
export function extractImageInfoFromTag(tag: string[], pubkey?: string): TImageInfo | null {
export function getImageInfoFromImetaTag(tag: string[], pubkey?: string): TImageInfo | null {
if (tag[0] !== 'imeta') return null
const urlItem = tag.find((item) => item.startsWith('url '))
const url = urlItem?.slice(4)
@ -75,7 +66,7 @@ export function extractImageInfoFromTag(tag: string[], pubkey?: string): TImageI
return image
}
export function extractPubkeysFromEventTags(tags: string[][]) {
export function getPubkeysFromPTags(tags: string[][]) {
return Array.from(
new Set(
tags
@ -87,10 +78,18 @@ export function extractPubkeysFromEventTags(tags: string[][]) {
)
}
export function isSameTag(tag1: string[], tag2: string[]) {
if (tag1.length !== tag2.length) return false
for (let i = 0; i < tag1.length; i++) {
if (tag1[i] !== tag2[i]) return false
}
return true
export function getEmojiInfosFromEmojiTags(tags: string[][] = []) {
return tags
.map((tag) => {
if (tag.length < 3 || tag[0] !== 'emoji') return null
return { shortcode: tag[1], url: tag[2] }
})
.filter(Boolean) as TEmoji[]
}
export function getServersFromServerTags(tags: string[][] = []) {
return tags
.filter(tagNameEquals('server'))
.map(([, url]) => (url ? normalizeHttpUrl(url) : ''))
.filter(Boolean)
}