From f9e5c1c3293a727b312a55c2f10a43568fd703e7 Mon Sep 17 00:00:00 2001 From: Dorian Date: Mon, 9 Mar 2026 09:29:55 +0000 Subject: [PATCH] fix: return fightId from ranked queue on duplicate join, fix calculateTier call Co-Authored-By: Claude Opus 4.6 --- server/src/engine/lifecycle.test.ts | 2 +- server/src/engine/ranked-queue.ts | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/server/src/engine/lifecycle.test.ts b/server/src/engine/lifecycle.test.ts index 44a9263..c7be637 100644 --- a/server/src/engine/lifecycle.test.ts +++ b/server/src/engine/lifecycle.test.ts @@ -536,7 +536,7 @@ describe('fight lifecycle', () => { // Elo + tier calculation calculateElo(eloA, eloB) - calculateTier(eloA, f % 50, f % 20) + calculateTier(eloA, f % 50) } const elapsed = performance.now() - start diff --git a/server/src/engine/ranked-queue.ts b/server/src/engine/ranked-queue.ts index e8829d5..9a9f6fe 100644 --- a/server/src/engine/ranked-queue.ts +++ b/server/src/engine/ranked-queue.ts @@ -1,7 +1,7 @@ import { logger } from '../lib/logger.js' import { db, schema } from '../db/index.js' import { eq, sql } from 'drizzle-orm' -import { runFightAsync, isInFight } from './orchestrator.js' +import { runFightAsync, isInFight, getActiveFightId } from './orchestrator.js' import { checkPaymentStatus, refundEntry, consumePaymentForQueue, linkPaymentsToFight, releasePayment } from './payments.js' interface RankedQueueEntry { @@ -61,10 +61,12 @@ export async function joinRankedQueue(botId: string, paymentId: string): Promise throw new Error(`Cooldown active. Wait ${waitSec}s.`) } - // Check if already in a fight + // Check if already in a fight — return fightId so frontend can redirect if (isInFight(botId)) { releasePayment(paymentId) - throw new Error('Bot is already in a fight.') + const err = new Error('Bot is already in a fight.') + ;(err as any).fightId = getActiveFightId(botId) + throw err } // Load bot