Как создать мультибота

Рейтинг: 1Ответов: 0Опубликовано: 13.06.2023

Всем привет. Я пытаюсь создать мультибота в пайтон. Суть этого кода в том, чтобы он запускал основного бота через токен, который находит в конфиге.

Затем, когда в базу данных добавлялся новый токен, бот должен сразу же запускать нового бота по токену, который в базе данных.

Сейчас он запускается, только если вырубить бота и заново врубить.

Подскажите, как это сделать более правильно.

async def stop_bot(bot):
    await bot.close()


async def on_startup():
    logging.info('Starting...')
    bot_tokens = get_bot_tokens_from_database()
    running_bots = []

    try:
        main_bot = Bot(token=TOKEN)
        dp = Dispatcher(main_bot, storage=MemoryStorage())
        dp.register_message_handler(client.profile_handler, text='Меню')
        dp.register_message_handler(client.my_bots, text='🤖 Мои боты')
        dp.register_message_handler(lambda msg: client.settings(msg, bot_tokens), text='⚙️ Настройки')
        dp.register_message_handler(start.start_message_handler, commands=['start'])
        dp.register_message_handler(client.adding_token, content_types=['text'], state=client.AddTokenStates.add_token)
        dp.register_callback_query_handler(client.back_set, text="back_in_settings", chat_type=types.ChatType.PRIVATE)
        dp.register_callback_query_handler(client.back_my, text="back_in_my_bot", chat_type=types.ChatType.PRIVATE)
        dp.register_callback_query_handler(client.adding_bot_defaul, text="adding_bot_default_set")
        dp.register_message_handler(client.adding_token, content_types=['text'], state=client.AddTokenStates.add_token)
        dp.register_callback_query_handler(client.adding_bot_default, text="adding_bot_default_my", chat_type=types.ChatType.PRIVATE)

        tasks = []
        tasks.append(dp.start_polling())

        for token in bot_tokens:
            if token is not None:
                tasks.append(start.start_bot(token))
                bot = Bot(token=token)
                running_bots.append(bot)
            else:
                logging.info('Отсутствует токен в базе данных. Остановка бота.')
                break

        await asyncio.gather(*tasks)

    except Exception as e:
        logging.info(f'Бот не запустился: {e}')

        for bot in running_bots:
            await stop_bot(bot)


if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)

    try:
        asyncio.run(on_startup())
    except KeyboardInterrupt:
        pass

Ответы

Ответов пока нет.