From 2c08b9a2f0a16a3cf275cd49bc8bcfefec890f55 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Fri, 21 Jun 2024 20:36:59 -0300 Subject: [PATCH] feat: create scavenger and handle kind 9735 --- src/utils/scavenger.ts | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/utils/scavenger.ts diff --git a/src/utils/scavenger.ts b/src/utils/scavenger.ts new file mode 100644 index 00000000..0ffaa669 --- /dev/null +++ b/src/utils/scavenger.ts @@ -0,0 +1,48 @@ +import { NostrEvent, NSchema as n } from '@nostrify/nostrify'; +import { Kysely } from 'kysely'; +import { z } from 'zod'; + +import { DittoTables } from '@/db/DittoTables.ts'; +import { getAmount } from '@/utils/bolt11.ts'; + +interface ScavengerEventOpts { + savedEvent: Promise; + kysely: Kysely; +} + +/** Consumes the event already stored in the database and uses it to insert into a new custom table, if eligible. + * Scavenger is organism that eats dead or rotting biomass, such as animal flesh or plant material. */ +async function scavengerEvent({ savedEvent, kysely }: ScavengerEventOpts): Promise { + const event = await savedEvent; + if (!event) return; + + switch (event.kind) { + case 9735: + await handleEvent9735(kysely, event); + break; + } +} + +async function handleEvent9735(kysely: Kysely, event: NostrEvent) { + const zapRequestString = event?.tags?.find(([name]) => name === 'description')?.[1]; + if (!zapRequestString) return; + const zapRequest = n.json().pipe(n.event()).optional().catch(undefined).parse(zapRequestString); + if (!zapRequest) return; + + const amountSchema = z.coerce.number().int().nonnegative().catch(0); + const amount_millisats = amountSchema.parse(getAmount(event?.tags.find(([name]) => name === 'bolt11')?.[1])); + if (!amount_millisats || amount_millisats < 1) return; + + const zappedEventId = zapRequest.tags.find(([name]) => name === 'e')?.[1]; + if (!zappedEventId) return; + + await kysely.insertInto('event_zaps').values({ + receipt_id: event.id, + target_event_id: zappedEventId, + sender_pubkey: zapRequest.pubkey, + amount_millisats, + comment: zapRequest.content, + }).execute(); +} + +export { scavengerEvent };