Files
telegram-helper-bot/run_helper.py

96 lines
3.6 KiB
Python

import asyncio
import os
import sys
import signal
# Ensure project root is on sys.path for module resolution
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
if CURRENT_DIR not in sys.path:
sys.path.insert(0, CURRENT_DIR)
from helper_bot.main import start_bot
from helper_bot.utils.base_dependency_factory import get_global_instance
from helper_bot.utils.auto_unban_scheduler import get_auto_unban_scheduler
async def main():
"""Основная функция запуска"""
bdf = get_global_instance()
# Создаем бота для автоматического разбана
from aiogram import Bot
from aiogram.client.default import DefaultBotProperties
auto_unban_bot = Bot(
token=bdf.settings['Telegram']['bot_token'],
default=DefaultBotProperties(parse_mode='HTML'),
timeout=30.0
)
# Инициализируем планировщик автоматического разбана
auto_unban_scheduler = get_auto_unban_scheduler()
auto_unban_scheduler.set_bot(auto_unban_bot)
auto_unban_scheduler.start_scheduler()
# Инициализируем метрики ПОСЛЕ импорта всех модулей
# Это гарантирует, что global instance полностью инициализирован
from helper_bot.utils.metrics_exporter import MetricsManager
metrics_manager = MetricsManager(host="0.0.0.0", port=8000)
# Флаг для корректного завершения
shutdown_event = asyncio.Event()
def signal_handler(signum, frame):
"""Обработчик сигналов для корректного завершения"""
print(f"\nПолучен сигнал {signum}, завершаем работу...")
shutdown_event.set()
# Регистрируем обработчики сигналов
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
# Запускаем бота и метрики
bot_task = asyncio.create_task(start_bot(bdf))
metrics_task = asyncio.create_task(metrics_manager.start())
try:
# Ждем сигнала завершения
await shutdown_event.wait()
print("Начинаем корректное завершение...")
except KeyboardInterrupt:
print("Получен сигнал завершения...")
finally:
print("Останавливаем планировщик автоматического разбана...")
auto_unban_scheduler.stop_scheduler()
print("Останавливаем метрики...")
await metrics_manager.stop()
print("Останавливаем задачи...")
# Отменяем задачи
bot_task.cancel()
metrics_task.cancel()
# Ждем завершения задач
try:
await asyncio.gather(bot_task, metrics_task, return_exceptions=True)
except Exception as e:
print(f"Ошибка при остановке задач: {e}")
# Закрываем сессию бота
await auto_unban_bot.session.close()
print("Бот корректно остановлен")
if __name__ == '__main__':
try:
asyncio.run(main())
except AttributeError:
# Fallback for Python 3.6-3.7
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.close()