""" Основной файл для запуска Telegram бота анонимных вопросов """ import asyncio import sys from pathlib import Path # Добавляем корневую директорию в путь для импортов sys.path.append(str(Path(__file__).parent)) from config import config from loader import loader from services.infrastructure.http_server import start_http_server, stop_http_server from services.infrastructure.logger import get_logger from services.infrastructure.metrics_updater import start_metrics_updater, stop_metrics_updater from config.constants import DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT # Настройка логирования logger = get_logger(__name__) async def main(): """Главная функция для запуска бота""" http_runner = None try: logger.info("🤖 Запуск бота анонимных вопросов...") logger.info(f"📊 Режим отладки: {'Включен' if config.DEBUG else 'Выключен'}") logger.info(f"💾 База данных: {config.DATABASE_PATH}") logger.info(f"👑 Администраторы: {config.ADMINS}") # Запускаем HTTP сервер для метрик и health check logger.info("🌐 Запуск HTTP сервера для метрик...") http_runner = await start_http_server(host=DEFAULT_HTTP_HOST, port=DEFAULT_HTTP_PORT) # Запускаем обновление метрик logger.info("📊 Запуск обновления метрик...") await start_metrics_updater(update_interval=30, db_path=config.DATABASE_PATH) # Запускаем бота await loader.start_polling() except KeyboardInterrupt: logger.info("⏹️ Получен сигнал остановки (Ctrl+C)") except Exception as e: logger.error(f"💥 Критическая ошибка: {e}") raise finally: # Останавливаем обновление метрик logger.info("📊 Остановка обновления метрик...") await stop_metrics_updater() # Останавливаем HTTP сервер if http_runner: logger.info("🛑 Остановка HTTP сервера...") await stop_http_server(http_runner) logger.info("🛑 Бот остановлен") if __name__ == "__main__": try: # Проверяем конфигурацию перед запуском config.validate() # Запускаем бота asyncio.run(main()) except ValueError as e: logger.error(f"❌ Ошибка конфигурации: {e}") sys.exit(1) except Exception as e: logger.error(f"💥 Неожиданная ошибка: {e}") sys.exit(1)