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
This commit is contained in:
96
src/index.js
96
src/index.js
@@ -1,7 +1,7 @@
|
||||
import 'dotenv/config';
|
||||
import { runMigrations, cleanUpInvalidForeignKeys } from './migrations/runner.js';
|
||||
import { registerRoutes } from './router/routes.js';
|
||||
import bot from './context/bot.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';
|
||||
@@ -16,62 +16,60 @@ await cleanUpInvalidForeignKeys();
|
||||
await initStates();
|
||||
registerRoutes();
|
||||
|
||||
const logDebug = (action, functionName) => {
|
||||
logger.debug({ action, functionName }, 'Button Press');
|
||||
};
|
||||
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(/\/start/, async (msg) => {
|
||||
logDebug('/start', 'handleStart');
|
||||
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.onText(/\/admin/, async (msg) => {
|
||||
logDebug('/admin', 'handleAdminCommand');
|
||||
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('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('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);
|
||||
|
||||
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');
|
||||
});
|
||||
|
||||
logger.info('Bot is running...');
|
||||
|
||||
import { startAdminPanel } from './admin/server.js';
|
||||
startAdminPanel();
|
||||
startAdminPanel();
|
||||
Reference in New Issue
Block a user