diff --git a/packages/ditto/interfaces/DittoEvent.ts b/packages/ditto/interfaces/DittoEvent.ts index d80a5418..cfa81c60 100644 --- a/packages/ditto/interfaces/DittoEvent.ts +++ b/packages/ditto/interfaces/DittoEvent.ts @@ -57,4 +57,6 @@ export interface DittoEvent extends NostrEvent { zap_message?: string; /** Language of the event (kind 1s are more accurate). */ language?: LanguageCode; + /** Whether or not pubkey accepts cashu. */ + accepts_zaps_cashu?: boolean; } diff --git a/packages/ditto/storages/hydrate.ts b/packages/ditto/storages/hydrate.ts index 60ec89bd..de6c3a82 100644 --- a/packages/ditto/storages/hydrate.ts +++ b/packages/ditto/storages/hydrate.ts @@ -50,6 +50,10 @@ async function hydrateEvents(opts: HydrateOpts): Promise { cache.push(event); } + for (const event of await gatherAcceptCashu({ ...opts, events: cache })) { + cache.push(event); + } + const authorStats = await gatherAuthorStats(cache, db.kysely); const eventStats = await gatherEventStats(cache, db.kysely); @@ -194,6 +198,10 @@ export function assembleEvents( event.zap_message = zapRequest?.content ?? ''; } + event.accepts_zaps_cashu = b.find((e) => matchFilter({ kinds: [10019], authors: [event.pubkey] }, e)) + ? true + : false; + event.author_stats = authorStats[event.pubkey]; event.event_stats = eventStats[event.id]; } @@ -353,6 +361,24 @@ async function gatherInfo({ conf, events, relay, signal }: HydrateOpts): Promise ); } +/** Collect nutzap informational events. */ +function gatherAcceptCashu({ events, relay, signal }: HydrateOpts): Promise { + const pubkeys = new Set(); + + for (const event of events) { + pubkeys.add(event.pubkey); + } + + if (!pubkeys.size) { + return Promise.resolve([]); + } + + return relay.query( + [{ kinds: [10019], authors: [...pubkeys], limit: pubkeys.size }], + { signal }, + ); +} + /** Collect author stats from the events. */ async function gatherAuthorStats( events: DittoEvent[], diff --git a/packages/ditto/views/mastodon/accounts.ts b/packages/ditto/views/mastodon/accounts.ts index 7f390d1a..949b5648 100644 --- a/packages/ditto/views/mastodon/accounts.ts +++ b/packages/ditto/views/mastodon/accounts.ts @@ -117,6 +117,7 @@ function renderAccount(event: Omit, opts: ToAccountOpt username: parsed05?.nickname || npub.substring(0, 8), ditto: { accepts_zaps: Boolean(getLnurl({ lud06, lud16 })), + accepts_zaps_cashu: Boolean(event?.accepts_zaps_cashu), external_url: Conf.external(nprofile), streak: { days: streakDays, diff --git a/packages/mastoapi/types/MastodonAccount.ts b/packages/mastoapi/types/MastodonAccount.ts index 4ea6665b..ec17a7df 100644 --- a/packages/mastoapi/types/MastodonAccount.ts +++ b/packages/mastoapi/types/MastodonAccount.ts @@ -44,6 +44,7 @@ export interface MastodonAccount { username: string; ditto: { accepts_zaps: boolean; + accepts_zaps_cashu: boolean; external_url: string; streak: { days: number;