Files
AnonBot/bot.py

90 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Основной файл для запуска 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)