import { AdminSigner } from '@/signers/AdminSigner.ts'; import { Command } from 'commander'; import { NostrEvent } from 'nostr-tools'; import { nostrNow } from '@/utils.ts'; import { Buffer } from 'node:buffer'; import { Conf } from '@/config.ts'; import pngToIco from 'png-to-ico'; import { Storages } from '@/storages.ts'; function die(code: number, ...args: unknown[]) { console.error(...args); Deno.exit(code); } if (import.meta.main) { const kind0 = new Command() .name('setup:kind0') .description('Set up / change the kind 0 for a Ditto instance.') .version('0.1.0') .showHelpAfterError(); kind0 .argument('', 'The name of the Ditto instance. Can just be your hostname.') .option( '-l --lightning ', 'Lightning address for the server. Can just be your own lightning address.', ) .option('-a --about ', 'About text. This shows up whenever a description for your server is needed.') .option('-i --image ', 'Image URL to use for OpenGraph previews and favicon.') .action(async (name, args) => { const { lightning, about, image } = args; const content: Record = {}; if (!name || !name.trim()) die(1, 'You must atleast supply a name!'); content.bot = true; content.about = about; content.lud16 = lightning; content.name = name; content.picture = image; content.website = Conf.localDomain; const signer = new AdminSigner(); const bare: Omit = { created_at: nostrNow(), kind: 0, tags: [], content: JSON.stringify(content), }; const signed = await signer.signEvent(bare); if (image) { try { await fetch(image) .then((res) => { if (!res.ok) throw new Error('Error attempting to fetch favicon.'); if (res.headers.get('content-type') !== 'image/png') throw new Error('Non-png images are not supported!'); return res.blob(); }) .then(async (blob) => await pngToIco(Buffer.from(await blob.arrayBuffer())) .then(async (buf) => await Deno.writeFile('./public/favicon.ico', new Uint8Array(buf))) ); } catch (e) { console.log( `Error generating favicon from url ${image}: "${e}". Please check this or try again later -- proceeding silently for now.`, ); } } console.log({ content, signed }); const store = await Storages.db(); await store.event(signed); Deno.exit(0); }); await kind0.parseAsync(); }