mirror of
https://github.com/multipleof4/KalBot.git
synced 2026-03-17 05:51:02 +00:00
Fix: empty markets fallback + rotation fix
This commit is contained in:
@@ -2,6 +2,8 @@ import { getActiveBTCEvent, getEventMarkets, getOrderbook, getMarket } from '../
|
|||||||
import { KalshiWS } from '../kalshi/websocket.js';
|
import { KalshiWS } from '../kalshi/websocket.js';
|
||||||
import { EventEmitter } from 'events';
|
import { EventEmitter } from 'events';
|
||||||
|
|
||||||
|
const OPEN_MARKET_STATUSES = new Set(['open', 'active', 'initialized', 'trading']);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tracks the currently active BTC 15-min market.
|
* Tracks the currently active BTC 15-min market.
|
||||||
* Auto-rotates when the current market expires.
|
* Auto-rotates when the current market expires.
|
||||||
@@ -80,28 +82,41 @@ export class MarketTracker extends EventEmitter {
|
|||||||
async _findAndSubscribe() {
|
async _findAndSubscribe() {
|
||||||
try {
|
try {
|
||||||
const event = await getActiveBTCEvent();
|
const event = await getActiveBTCEvent();
|
||||||
|
|
||||||
if (!event) {
|
if (!event) {
|
||||||
|
if (!this.currentTicker) this.emit('update', null);
|
||||||
console.log('[Tracker] No active BTC 15m event found. Retrying in 30s...');
|
console.log('[Tracker] No active BTC 15m event found. Retrying in 30s...');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const markets = event.markets || await getEventMarkets(event.event_ticker);
|
const inlineMarkets = Array.isArray(event.markets) ? event.markets : [];
|
||||||
// Find the up/down market (usually only one market per event)
|
const markets = inlineMarkets.length ? inlineMarkets : await getEventMarkets(event.event_ticker);
|
||||||
const market = markets.find(m => m.status === 'active' || m.status === 'open') || markets[0];
|
|
||||||
|
const market = markets.find((m) => OPEN_MARKET_STATUSES.has(String(m?.status || '').toLowerCase())) || markets[0];
|
||||||
|
|
||||||
if (!market) {
|
if (!market) {
|
||||||
console.log('[Tracker] No active market in event. Retrying...');
|
if (!this.currentTicker) {
|
||||||
|
this.currentEvent = event.event_ticker || null;
|
||||||
|
this.marketData = null;
|
||||||
|
this.orderbook = { yes: [], no: [] };
|
||||||
|
this.emit('update', null);
|
||||||
|
}
|
||||||
|
console.log(`[Tracker] Event ${event.event_ticker} has no active market yet. Retrying...`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const newTicker = market.ticker;
|
const newTicker = market.ticker;
|
||||||
|
if (newTicker === this.currentTicker) {
|
||||||
|
this.currentEvent = event.event_ticker;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (newTicker === this.currentTicker) return;
|
const oldTicker = this.currentTicker;
|
||||||
|
|
||||||
// Unsubscribe from old
|
// Unsubscribe from old
|
||||||
if (this.currentTicker) {
|
if (oldTicker) {
|
||||||
console.log(`[Tracker] Rotating from ${this.currentTicker} → ${newTicker}`);
|
console.log(`[Tracker] Rotating from ${oldTicker} → ${newTicker}`);
|
||||||
this.ws.unsubscribeTicker(this.currentTicker);
|
this.ws.unsubscribeTicker(oldTicker);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.currentTicker = newTicker;
|
this.currentTicker = newTicker;
|
||||||
@@ -122,8 +137,7 @@ export class MarketTracker extends EventEmitter {
|
|||||||
console.log(`[Tracker] Now tracking: ${newTicker} (${market.title || market.subtitle})`);
|
console.log(`[Tracker] Now tracking: ${newTicker} (${market.title || market.subtitle})`);
|
||||||
|
|
||||||
this.emit('update', this.getState());
|
this.emit('update', this.getState());
|
||||||
this.emit('market-rotated', { from: this.currentTicker, to: newTicker });
|
this.emit('market-rotated', { from: oldTicker, to: newTicker });
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[Tracker] Discovery error:', err.message);
|
console.error('[Tracker] Discovery error:', err.message);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user