Files
telegram-shop/src/index.js
NW 6aa7980ddf fix: bot no longer crashes container on invalid token
- bot.js: 5 retries with 5s delay on init, graceful fallback to null
- errorHandler.js: 5 retries on 404 (invalid token), stops polling after
  max retries but keeps process alive for admin panel
- config.js: BOT_TOKEN missing logs warning instead of process.exit
- index.js: bot handlers only registered when bot is available,
  admin panel always starts regardless of bot status
2026-06-24 15:05:44 +01:00

75 lines
2.5 KiB
JavaScript

import 'dotenv/config';
import { runMigrations, cleanUpInvalidForeignKeys } from './migrations/runner.js';
import { registerRoutes } from './router/routes.js';
import bot, { botAvailable } from './context/bot.js';
import ErrorHandler from './utils/errorHandler.js';
import logger from './utils/logger.js';
import userHandler from './handlers/userHandlers/userHandler.js';
import adminHandler from './handlers/adminHandlers/adminHandler.js';
import callbackRouter from './router/callbackRouter.js';
import messageRouter from './router/messageRouter.js';
import { initStates } from './services/stateService.js';
await runMigrations();
await cleanUpInvalidForeignKeys();
await initStates();
registerRoutes();
if (bot && botAvailable) {
bot.onText(/\/start/, async (msg) => {
const canUse = await userHandler.canUseBot(msg);
if (!canUse) return;
try {
await userHandler.handleStart(msg);
} catch (error) {
await ErrorHandler.handleError(bot, msg.chat.id, error, 'start command');
}
});
bot.onText(/\/admin/, async (msg) => {
try {
await adminHandler.handleAdminCommand(msg);
} catch (error) {
await ErrorHandler.handleError(bot, msg.chat.id, error, 'admin command');
}
});
bot.on('message', async (msg) => {
if (msg.text?.toLowerCase() === '/start') return;
const canUse = await userHandler.canUseBot(msg);
if (!canUse) return;
try {
await messageRouter.dispatch(msg);
} catch (error) {
await ErrorHandler.handleError(bot, msg.chat.id, error, 'message handler');
}
});
bot.on('callback_query', async (callbackQuery) => {
const canUse = await userHandler.canUseBot(callbackQuery);
if (!canUse) {
await bot.answerCallbackQuery(callbackQuery.id);
return;
}
try {
await callbackRouter.dispatch(callbackQuery);
await bot.answerCallbackQuery(callbackQuery.id);
} catch (error) {
await ErrorHandler.handleError(bot, callbackQuery.message.chat.id, error, 'callback query');
}
});
bot.on('polling_error', ErrorHandler.handlePollingError);
logger.info('Bot is running...');
} else {
logger.warn('Bot is not available. Running in admin-only mode. Admin panel will continue to work.');
}
process.on('unhandledRejection', (error) => {
logger.error({ err: error }, 'Unhandled promise rejection');
});
import { startAdminPanel } from './admin/server.js';
startAdminPanel();