import { Context } from 'telegraf'; import { BotContext } from '../bots/types/botTypes'; import { createLogger } from './logger'; const logger = createLogger('BotUtils'); // Map to store bot token to bot ID mapping const botTokenToIdMap = new Map(); /** * Extracts bot ID from a bot token * @param token The bot token to extract ID from * @returns The bot ID */ export function getBotIdFromToken(token: string): string { // Check if we already have this mapping cached if (botTokenToIdMap.has(token)) { return botTokenToIdMap.get(token)!; } // Extract bot ID from token (format: :) const botId = token.split(':')[0]; // Cache the mapping botTokenToIdMap.set(token, botId); return botId; } /** * Gets bot token from context * @param ctx The Telegraf context * @returns The bot token or undefined if not found */ export function getBotTokenFromContext(ctx: BotContext): string | undefined { try { // Try to get token from bot instance return (ctx as any).telegram?.token; } catch (error) { logger.error('Error getting bot token from context:', error); return undefined; } } /** * Saves a bot token to ID mapping * @param token The bot token * @param botId The bot ID */ export function saveBotTokenMapping(token: string, botId: string): void { botTokenToIdMap.set(token, botId); logger.info(`Saved bot token mapping for bot ID: ${botId}`); } /** * Gets bot ID from context * @param ctx The Telegraf context * @returns The bot ID or undefined if not found */ export function getBotIdFromContext(ctx: BotContext): string | undefined { try { // First try to get from botData if available if (ctx.botData?.id) { return ctx.botData.id; } // Then try to get from token const token = getBotTokenFromContext(ctx); if (token) { return getBotIdFromToken(token); } return undefined; } catch (error) { logger.error('Error getting bot ID from context:', error); return undefined; } } /** * Validates a bot token format * @param token The bot token to validate * @returns boolean indicating if the token is valid */ export function isValidBotToken(token: string): boolean { if (!token) return false; // Check if token follows the format: : const parts = token.split(':'); if (parts.length !== 2) return false; // Check if bot_id is numeric const botId = parts[0]; if (!/^\d+$/.test(botId)) return false; // Check if random_string is not empty if (!parts[1]) return false; return true; } /** * Clears the bot token to ID mapping cache */ export function clearBotTokenCache(): void { botTokenToIdMap.clear(); logger.info('Cleared bot token mapping cache'); }