feat: 🌸

This commit is contained in:
codytseng
2025-07-18 23:25:47 +08:00
parent 74e04e1c7d
commit e91b2648cc
41 changed files with 756 additions and 92 deletions

View File

@@ -13,6 +13,7 @@ import {
isProtectedEvent,
isReplaceable
} from './event'
import { normalizeHttpUrl } from './url'
// https://github.com/nostr-protocol/nips/blob/master/25.md
export function createReactionDraftEvent(event: Event, emoji: TEmoji | string = '+'): TDraftEvent {
@@ -346,6 +347,15 @@ export function createBookmarkDraftEvent(tags: string[][], content = ''): TDraft
}
}
export function createBlossomServerListDraftEvent(servers: string[]): TDraftEvent {
return {
kind: ExtendedKind.BLOSSOM_SERVER_LIST,
content: '',
tags: servers.map((server) => ['server', normalizeHttpUrl(server)]),
created_at: dayjs().unix()
}
}
function generateImetaTags(imageUrls: string[]) {
return imageUrls
.map((imageUrl) => {

View File

@@ -451,7 +451,7 @@ export function extractHashtags(content: string) {
export function extractImageInfosFromEventTags(event: Event) {
const images: TImageInfo[] = []
event.tags.forEach((tag) => {
const imageInfo = extractImageInfoFromTag(tag)
const imageInfo = extractImageInfoFromTag(tag, event.pubkey)
if (imageInfo) {
images.push(imageInfo)
}
@@ -588,6 +588,13 @@ export function extractEmojiInfosFromTags(tags: string[][] = []) {
.filter(Boolean) as TEmoji[]
}
export function extractServersFromTags(tags: string[][] = []) {
return tags
.filter(tagNameEquals('server'))
.map(([, url]) => (url ? normalizeHttpUrl(url) : ''))
.filter(Boolean)
}
export function createFakeEvent(event: Partial<Event>): Event {
return {
id: '',

View File

@@ -49,13 +49,13 @@ export function generateEventId(event: Pick<Event, 'id' | 'pubkey'>) {
return nip19.neventEncode({ id: event.id, author: event.pubkey, relays: [relay] })
}
export function extractImageInfoFromTag(tag: string[]): TImageInfo | null {
export function extractImageInfoFromTag(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)
if (!url) return null
const image: TImageInfo = { url }
const image: TImageInfo = { url, pubkey }
const blurHashItem = tag.find((item) => item.startsWith('blurhash '))
const blurHash = blurHashItem?.slice(9)
if (blurHash) {

View File

@@ -48,7 +48,7 @@ export function normalizeHttpUrl(url: string): string {
return p.toString()
} catch {
console.error('Invalid URL:', url)
return url
return ''
}
}