From d16df8086a76a09e62105d4ff995cbd995a3cd1d Mon Sep 17 00:00:00 2001 From: kieran Date: Fri, 22 Nov 2024 16:30:09 +0000 Subject: [PATCH] feat: client tag feat: attach relays to link for event --- packages/app/src/index.tsx | 2 ++ packages/system/src/event-builder.ts | 8 ++++++++ packages/system/src/nostr-link.ts | 13 +++++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index a0f5e8f7..67a97f26 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -3,6 +3,7 @@ import "@szhsin/react-menu/dist/index.css"; import "@/assets/fonts/inter.css"; import { unixNow, unixNowMs } from "@snort/shared"; +import { EventBuilder } from "@snort/system"; import { SnortContext } from "@snort/system-react"; import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; @@ -47,6 +48,7 @@ import { Day } from "./Utils/Const"; import { LoginStore } from "./Utils/Login"; async function initSite() { + EventBuilder.ClientTag = ["snort", __SNORT_VERSION__]; storeRefCode(); if (hasWasm) { await wasmInit(WasmPath); diff --git a/packages/system/src/event-builder.ts b/packages/system/src/event-builder.ts index ec8be2c5..3fbf8d6a 100644 --- a/packages/system/src/event-builder.ts +++ b/packages/system/src/event-builder.ts @@ -5,6 +5,11 @@ import { EventExt } from "./event-ext"; import { NostrLink, tryParseNostrLink } from "./nostr-link"; export class EventBuilder { + /** + * Client tag to attach to all events + */ + static ClientTag: Array | undefined = ["client", "snort_system"]; + #kind?: EventKind; #content?: string; #createdAt?: number; @@ -101,6 +106,9 @@ export class EventBuilder { created_at: (this.#createdAt ?? unixNow()) - (this.#jitter ? Math.floor(jitter(this.#jitter)) : 0), tags: this.#tags.sort((a, b) => a[0].localeCompare(b[0])), } as NostrEvent; + if (EventBuilder.ClientTag && EventBuilder.ClientTag[0] === "client" && EventBuilder.ClientTag.length > 1) { + ev.tags.push(EventBuilder.ClientTag); + } ev.id = EventExt.createId(ev); return ev; } diff --git a/packages/system/src/nostr-link.ts b/packages/system/src/nostr-link.ts index 52263642..751945d7 100644 --- a/packages/system/src/nostr-link.ts +++ b/packages/system/src/nostr-link.ts @@ -1,4 +1,4 @@ -import { bech32ToHex, hexToBech32, isHex, removeUndefined, unwrap, Bech32Regex } from "@snort/shared"; +import { bech32ToHex, hexToBech32, isHex, removeUndefined, unwrap, Bech32Regex, sanitizeRelayUrl, appendDedupe } from "@snort/shared"; import { decodeTLV, encodeTLV, EventExt, EventKind, NostrEvent, NostrPrefix, TaggedNostrEvent, TLVEntryType } from "."; import { findTag } from "./utils"; @@ -11,7 +11,7 @@ export interface ToNostrEventTag { } export class NostrHashtagLink implements ToNostrEventTag { - constructor(readonly tag: string) {} + constructor(readonly tag: string) { } equals(other: ToNostrEventTag): boolean { const otherTag = other.toEventTag(); @@ -24,7 +24,7 @@ export class NostrHashtagLink implements ToNostrEventTag { } export class UnknownTag implements ToNostrEventTag { - constructor(readonly value: Array) {} + constructor(readonly value: Array) { } equals(other: ToNostrEventTag): boolean { const otherTag = other.toEventTag(); @@ -226,8 +226,13 @@ export class NostrLink implements ToNostrEventTag { ); } + /** + * Create an event link from an existing nostr event + */ static fromEvent(ev: TaggedNostrEvent | NostrEvent) { - const relays = "relays" in ev ? ev.relays : undefined; + let relays = "relays" in ev ? ev.relays : undefined; + const eventRelays = removeUndefined(ev.tags.filter(a => a[0] === "relays" || a[0] === "relay" || a[0] === "r").map(a => sanitizeRelayUrl(a[1]))); + relays = appendDedupe(relays, eventRelays); if (ev.kind >= 30_000 && ev.kind < 40_000) { const dTag = unwrap(findTag(ev, "d"));