Как реализовать взаимодействие между двумя ботами, чтобы один из них реагировал на события, происходящие с другим?

Как я могу реализовать запуск нескольких ботов при старте основного бота, а также сделать так, чтобы при возникновении события у основного бота выполнялось действие другого бота? У меня есть код, который нуждается в доработке или переписке: 
<pre><code class="python">class BotHandler:
    def __init__(self, token: str):
        self.token = token
        intents = disnake.Intents.all()
        self.bot = disnake.Client(intents=intents)

        @self.bot.event
        async def on_ready():
            print(f"'{self.bot.user.name}' is online!")

    async def start(self):
        await self.bot.start(self.token)

    async def make_func(self, func):
        self.func = func
        print('succesull')
        self.func

async def send_msg(channel):
    await channel.send('pong!!')

@bot.event
async def on_message(message):
    guild_db = guilds.find_one({'guild': str(message.guild.id)})
    if message.content == '!ping':
        if guild_db['token']:
            await BotHandler(guild_db['token']).make_func(await send_msg(message.channel))
        else:
            await message.channel.send('pong!')</code></pre>
  • 21 февраля 2025 г. 9:14
Ответы на вопрос 1
Чтобы реализовать взаимодействие между двумя ботами в Python с использованием библиотеки Disnake (или других библиотек для работы с Discord API), вам нужно проделать несколько шагов: 

1. Запустить несколько экземпляров бота (например, основной бот и вспомогательный бот).
2. Реализовать механизм, позволяющий одному боту реагировать на события, произошедшие у другого бота (через события или коллбеки).

Вот переработанный код, который иллюстрирует этот подход:

```python
import disnake
from disnake.ext import commands

class MainBot:
    def __init__(self, token: str):
        self.token = token
        intents = disnake.Intents.default()
        self.bot = commands.Bot(command_prefix="!", intents=intents)

        # Создаем экземпляр вспомогательного бота
        self.helper_bot = HelperBot(guild_db['helper_token'])  # токен вспомогательного бота из базы данных

        # Регистрируем обработчик события on_ready для основного бота
        @self.bot.event
        async def on_ready():
            print(f"'{self.bot.user.name}' is online!")
            await self.helper_bot.start()  # Запускаем вспомогательный бот

        # Регистрируем обработчик сообщения для основного бота
        @self.bot.event
        async def on_message(message):
            if message.author == self.bot.user:
                return  # Игнорируем собственные сообщения

            if message.content == '!ping':
                await message.channel.send('pong!')
                await self.helper_bot.on_event_trigger(message.channel)  # Триггерим событие во вспомогательном боте

    async def start(self):
        await self.bot.start(self.token)

class HelperBot:
    def __init__(self, token: str):
        self.token = token
        intents = disnake.Intents.default()
        self.bot = disnake.Client(intents=intents)

    async def start(self):
        await self.bot.start(self.token)

    async def on_event_trigger(self, channel):
        # Реакция на событие от основного бота
        await channel.send('Helper Bot responds to ping!')

# Основной код запуска бота
guild_db = {'token': 'YOUR_MAIN_BOT_TOKEN', 'helper_token': 'YOUR_HELPER_BOT_TOKEN'}  # Замените на ваши токены
main_bot = MainBot(guild_db['token'])

# Запускаем основной бот
import asyncio
asyncio.run(main_bot.start())
```

### Объяснение кода:
1. **Класс `MainBot`** - это основной бот, который обрабатывает сообщения и запускает вспомогательный бот.
2. **Класс `HelperBot`** - это вспомогательный бот, который будет реагировать на события, инициированные основным ботом.
3. **Метод `on_event_trigger`** во `HelperBot` реагирует на события, такие как отправка сообщения от основного бота.
4. Мы используем функцию `asyncio.run()` для запуска основного бота.

### Как это работает:
- Когда основной бот получает команду `!ping`, он отвечает `pong!` и вызывает событие `on_event_trigger` у вспомогательного бота, который отправляет сообщение в тот же канал.

### Замечания:
- Убедитесь, что у вас правильные токены и необходимые права для ботов.
- Обратите внимание на управление событиями, чтобы избежать бесконечной рекурсии (например, игнорировать сообщения от самого бота).
Похожие вопросы