44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { Hono } from 'hono'
|
|||
|
|
import { db, schema } from '../db/index.js'
|
||
|
|
import { eq } from 'drizzle-orm'
|
||
|
|
import { joinQueue, leaveQueue, getQueueSize, getQueueSnapshot } from '../engine/queue.js'
|
||
|
|
|
||
|
|
export const queueRouter = new Hono()
|
||
|
|
|
||
|
|
// Get queue status
|
||
|
|
queueRouter.get('/status', (c) => {
|
||
|
|
return c.json({
|
||
|
|
waiting: getQueueSize(),
|
||
|
|
queue: getQueueSnapshot(),
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
// Join the queue — blocks until matched, then returns fightId
|
||
|
|
queueRouter.post('/join/:botId', async (c) => {
|
||
|
|
const botId = c.req.param('botId')
|
||
|
|
|
||
|
|
const botRows = await db.select({ id: schema.bots.id, name: schema.bots.name })
|
||
|
|
.from(schema.bots)
|
||
|
|
.where(eq(schema.bots.id, botId))
|
||
|
|
.limit(1)
|
||
|
|
|
||
|
|
if (botRows.length === 0) {
|
||
|
|
return c.json({ error: 'Bot not found.' }, 404)
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
const fightId = await joinQueue(botId)
|
||
|
|
return c.json({ fightId, message: 'Matched! Fight starting.' })
|
||
|
|
} catch (err) {
|
||
|
|
const message = err instanceof Error ? err.message : 'Queue error'
|
||
|
|
return c.json({ error: message }, 500)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// Leave the queue
|
||
|
|
queueRouter.post('/leave/:botId', (c) => {
|
||
|
|
const botId = c.req.param('botId')
|
||
|
|
const left = leaveQueue(botId)
|
||
|
|
return c.json({ left })
|
||
|
|
})
|