Анализ архитектуры запуска ботов и решение проблем

    Рассмотрим текущую реализацию запуска системы ботов и возникающие проблемы.

    Текущая реализация запуска

    Основной бот запускается следующим образом:

    def main():
        logger.info(f"Starting bot...")
    
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
    
        loop.run_until_complete(group_manager.setup_group_clones())
        loop.create_task(check_old_tokens())
        loop.create_task(periodic_check())
        loop.create_task(periodic_refresh_groups())
    
        try:
            bot.run_forever()
        except KeyboardInterrupt:
            logger.info("Shutting down")

    Класс управления групповыми ботами

    Класс GroupCloneManager отвечает за управление привязанными ботами:

    • Хранит словари активных ботов и их задач
    • Обеспечивает добавление и удаление групповых клонов
    • Управляет жизненным циклом ботов через асинхронные задачи

    Ключевые методы класса:

    • setup_group_clones() - первоначальная настройка всех подключенных групп
    • add_group_clone() - создание и запуск бота для конкретной группы
    • _run_group_bot() - основной цикл работы группового бота
    • remove_group_clone() - корректное удаление бота
    • refresh_group_clones() - синхронизация с актуальным состоянием БД

    Возникающие проблемы

    В консоли наблюдаются следующие предупреждения:

    DEBUG    | 2025-11-15 14:51:44 | bot.control_groups:add_group_clone:46 > Group |id| added and successfully started
    DEBUG    | 2025-11-15 14:51:44 | bot.control_groups:_run_group_bot:64 > Group |id| stopped: Cannot close a running event loop

    Основные симптомы:

    • Боты успешно запускаются и реагируют на команды
    • Каждая команда обрабатывается дважды
    • Возникает ошибка при попытке закрыть работающий event loop

    Архитектурная схема

    Текущая архитектура представляет собой следующую структуру:

    • Основной бот выполняет роль оркестратора
    • Для каждой группы пользователей запускается отдельный привязанный бот
    • Все боты работают параллельно в рамках одного event loop
    • Состояние синхронизируется с базой данных через периодические проверки

    Проблема дублирования команд, вероятно, связана с тем, что обработчики событий регистрируются несколько раз или несколько экземпляров ботов реагируют на одни и те же события.