Merge branch 'main' into fix-zap-sender-missing-kind-0

This commit is contained in:
P. Reis 2024-10-18 14:27:42 -03:00
commit ceaf6534ae
6 changed files with 55 additions and 13 deletions

View file

@ -1,4 +1,4 @@
image: denoland/deno:2.0.1
image: denoland/deno:2.0.2
default:
interruptible: true
@ -35,5 +35,4 @@ test:
paths:
- deno-test.xml
reports:
junit: deno-test.xml
junit: deno-test.xml

View file

@ -1 +1 @@
deno 2.0.1
deno 2.0.2

View file

@ -560,7 +560,7 @@ const zapController: AppController = async (c) => {
lnurl = getLnurl(meta);
if (target && lnurl) {
tags.push(
['e', target.id, Conf.relay, '', target.pubkey],
['e', target.id, Conf.relay],
['p', target.pubkey, Conf.relay],
['amount', amount.toString()],
['relays', Conf.relay],

View file

@ -6,6 +6,7 @@ import { Storages } from '@/storages.ts';
import { type DittoEvent } from '@/interfaces/DittoEvent.ts';
import { type DittoRelation } from '@/interfaces/DittoFilter.ts';
import { hydrateEvents } from '@/storages/hydrate.ts';
import { fallbackAuthor } from '@/utils.ts';
import { findReplyTag, getTagSet } from '@/utils/tags.ts';
const debug = Debug('ditto:queries');
@ -38,15 +39,21 @@ const getEvent = async (
.then(([event]) => event);
};
/** Get a Nostr `set_medatadata` event for a user's pubkey. */
const getAuthor = async (pubkey: string, opts: GetEventOpts = {}): Promise<NostrEvent | undefined> => {
/**
* Get a Nostr `set_medatadata` event for a user's pubkey.
* @deprecated Use `store.query` directly.
*/
async function getAuthor(pubkey: string, opts: GetEventOpts = {}): Promise<NostrEvent | undefined> {
const store = await Storages.db();
const { signal = AbortSignal.timeout(1000) } = opts;
return await store.query([{ authors: [pubkey], kinds: [0], limit: 1 }], { limit: 1, signal })
.then((events) => hydrateEvents({ events, store, signal }))
.then(([event]) => event);
};
const events = await store.query([{ authors: [pubkey], kinds: [0], limit: 1 }], { limit: 1, signal });
const event = events[0] ?? fallbackAuthor(pubkey);
await hydrateEvents({ events: [event], store, signal });
return event;
}
/** Get users the given pubkey follows. */
const getFollows = async (pubkey: string, signal?: AbortSignal): Promise<NostrEvent | undefined> => {

View file

@ -7,6 +7,7 @@ import { z } from 'zod';
import { DittoTables } from '@/db/DittoTables.ts';
import { Conf } from '@/config.ts';
import { type DittoEvent } from '@/interfaces/DittoEvent.ts';
import { fallbackAuthor } from '@/utils.ts';
import { findQuoteTag } from '@/utils/tags.ts';
import { findQuoteInContent } from '@/utils/note.ts';
import { getAmount } from '@/utils/bolt11.ts';
@ -225,6 +226,7 @@ function gatherQuotes({ events, store, signal }: HydrateOpts): Promise<DittoEven
}
/** Collect authors from the events. */
<<<<<<< HEAD
function gatherAuthors({ events, store, signal }: HydrateOpts): Promise<DittoEvent[]> {
const pubkeys = new Set<string>();
@ -247,10 +249,20 @@ function gatherAuthors({ events, store, signal }: HydrateOpts): Promise<DittoEve
pubkeys.add(event.pubkey);
}
return store.query(
const authors = await store.query(
[{ kinds: [0], authors: [...pubkeys], limit: pubkeys.size }],
{ signal },
);
for (const pubkey of pubkeys) {
const author = authors.find((e) => matchFilter({ kinds: [0], authors: [pubkey] }, e));
if (author) {
const fallback = fallbackAuthor(pubkey);
authors.push(fallback);
}
}
return authors;
}
/** Collect users from the events. */

View file

@ -74,6 +74,30 @@ function isURL(value: unknown): boolean {
return z.string().url().safeParse(value).success;
}
export { bech32ToPubkey, eventAge, findTag, isNostrId, isURL, type Nip05, nostrDate, nostrNow, parseNip05 };
/** Render an empty author event so other things can stick to it. */
function fallbackAuthor(pubkey: string): NostrEvent {
return {
kind: 0,
pubkey,
content: '',
tags: [],
created_at: nostrNow(),
id: '',
sig: '',
};
}
export {
bech32ToPubkey,
eventAge,
fallbackAuthor,
findTag,
isNostrId,
isURL,
type Nip05,
nostrDate,
nostrNow,
parseNip05,
};
export { Time } from '@/utils/time.ts';