77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
"""
|
|
Основной файл для запуска 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)
|