90 lines
3.7 KiB
Python
90 lines
3.7 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.pid_manager import get_pid_manager, cleanup_pid_file
|
||
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
|
||
pid_manager = None
|
||
|
||
try:
|
||
logger.info("🤖 Запуск бота анонимных вопросов...")
|
||
logger.info(f"📊 Режим отладки: {'Включен' if config.DEBUG else 'Выключен'}")
|
||
logger.info(f"💾 База данных: {config.DATABASE_PATH}")
|
||
logger.info(f"👑 Администраторы: {config.ADMINS}")
|
||
|
||
# Создаем PID файл для отслеживания процесса
|
||
logger.info("📄 Создание PID файла...")
|
||
pid_manager = get_pid_manager("anon_bot")
|
||
if not pid_manager.create_pid_file():
|
||
logger.error("❌ Не удалось создать PID файл, завершаем работу")
|
||
return
|
||
logger.info(f"✅ PID файл создан: {pid_manager.get_pid_file_path()}")
|
||
|
||
# Запускаем 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)
|
||
|
||
# Очищаем PID файл
|
||
if pid_manager:
|
||
logger.info("📄 Очистка PID файла...")
|
||
pid_manager.cleanup_pid_file()
|
||
|
||
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)
|