From ca9246a20ac91d10c8085dc4fdd29abdd0f9344b Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 5 Feb 2025 18:05:07 -0600 Subject: [PATCH] Add "streak" app, letting users forfeit through the API --- src/app.ts | 2 ++ src/controllers/api/streak.ts | 24 ++++++++++++++++++++++++ src/utils/api.ts | 6 +++--- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/controllers/api/streak.ts diff --git a/src/app.ts b/src/app.ts index 6929757f..e02e2dd0 100644 --- a/src/app.ts +++ b/src/app.ts @@ -108,6 +108,7 @@ import { zapController, zappedByController, } from '@/controllers/api/statuses.ts'; +import streakApp from '@/controllers/api/streak.ts'; import { streamingController } from '@/controllers/api/streaming.ts'; import { localSuggestionsController, @@ -382,6 +383,7 @@ app.put('/api/v1/admin/ditto/relays', requireRole('admin'), adminSetRelaysContro app.put('/api/v1/admin/ditto/instance', requireRole('admin'), updateInstanceController); +app.route('/api/v1/ditto/streak', streakApp); app.post('/api/v1/ditto/names', requireSigner, nameRequestController); app.get('/api/v1/ditto/names', requireSigner, nameRequestsController); diff --git a/src/controllers/api/streak.ts b/src/controllers/api/streak.ts new file mode 100644 index 00000000..5022c6d6 --- /dev/null +++ b/src/controllers/api/streak.ts @@ -0,0 +1,24 @@ +import { Hono } from '@hono/hono'; + +import { Conf } from '@/config.ts'; +import { requireSigner } from '@/middleware/requireSigner.ts'; +import { updateAdminEvent } from '@/utils/api.ts'; + +const app = new Hono(); + +app.post('/forfeit', requireSigner, async (c) => { + const pubkey = await c.get('signer').getPublicKey(); + + await updateAdminEvent( + { kinds: [30382], authors: [Conf.pubkey], '#d': [pubkey], limit: 1 }, + (prev) => { + const tags = prev?.tags.filter(([name]) => !['ditto.streak.start', 'ditto.streak.end'].includes(name)) ?? []; + return { ...prev, kind: 30382, tags }; + }, + c, + ); + + return c.newResponse(null, 204); +}); + +export default app; diff --git a/src/utils/api.ts b/src/utils/api.ts index 29304cbd..1e2dc70b 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -80,7 +80,7 @@ function updateListEvent( } /** Publish an admin event through the pipeline. */ -async function createAdminEvent(t: EventStub, c: AppContext): Promise { +async function createAdminEvent(t: EventStub, c: Context): Promise { const signer = new AdminSigner(); const event = await signer.signEvent({ @@ -110,7 +110,7 @@ function updateListAdminEvent( async function updateAdminEvent( filter: UpdateEventFilter, fn: (prev: NostrEvent | undefined) => E, - c: AppContext, + c: Context, ): Promise { const store = await Storages.db(); const [prev] = await store.query([filter], { limit: 1, signal: c.req.raw.signal }); @@ -156,7 +156,7 @@ async function updateNames(k: number, d: string, n: Record, c: } /** Push the event through the pipeline, rethrowing any RelayError. */ -async function publishEvent(event: NostrEvent, c: AppContext): Promise { +async function publishEvent(event: NostrEvent, c: Context): Promise { logi({ level: 'info', ns: 'ditto.event', source: 'api', id: event.id, kind: event.kind }); try { await pipeline.handleEvent(event, { source: 'api', signal: c.req.raw.signal });