On_message дождитесь реакции пользователя на сообщение или тайм-аут, прежде чем бот снова отправит другое сообщение с реакцией

#python #discord.py

#python #discord.py

Вопрос:

Если вы DM бота, он отправит сообщение и добавит некоторые реакции, затем он ожидает, пока пользователь добавит реакцию, прежде чем что-то делать.

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

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

 async def on_message(self, message):
    if message.author.bot:
        return

    if isinstance(message.channel, discord.DMChannel):
        dm = await message.channel.send('test')
        await dm.add_reaction("1️⃣")
   
    def check(reaction, user):
        return user == message.author and str(reaction.emoji) in ["1️⃣"]

    while True:
        try:
            reaction, user = await self.client.wait_for("reaction_add", timeout=15, check=check)
            if str(reaction.emoji) == "1️⃣":
                # do something here
 
        except asyncio.TimeoutError:
            await dm.delete()
            break
 

Комментарии:

1. какова цель этого цикла while?

Ответ №1:

Синтаксис неправильный, и почему вы добавили цикл while?

Вот исправленный код:

 @commands.Cog.listener()
async def on_message(self, message):
    if message.author.bot:
        return

    if isinstance(message.channel, discord.DMChannel):
        # Sending the message and adding reactions
        msg = await message.channel.send('Test')
        await msg.add_reaction('1️⃣')

        check = lambda reaction, user: user == message.author and str(reaction) in your_list_of_reactions

        try:
            # Waiting for the reaction
            reaction, user = await self.client.wait_for('reaction_add', check=check, timeout=15.0)

            if str(reaction) == "1️⃣":
                # do something

        except asyncio.TimeoutError:
            await msg.delete()

    # Adding this so the rest commands will work
    await bot.process_commands(message)
    
 

Комментарии:

1. Спасибо за ответ Лукас! Я пробовал, но все то же самое. Всякий раз, когда вы отправляете dm боту, он продолжает выдавать сообщение добавление реакции, и когда вы реагируете на него, он выполняет #do something несколько раз в зависимости от того, сколько сообщений добавить реакцию было отправлено ботом. Я включил цикл while, чтобы они могли щелкнуть реакцию 2,3,4,5. он выдает информацию, в то время как 1 создает канал. Также пробовал использовать time = (datetime.datetime.utcnow() — self.last_timeStamp).total_seconds(), он блокирует сообщение, но проблема в том, что другие люди не могут отправить сообщение боту.

2. Если вы хотите создать такую динамическую систему реагирования, вам следует взглянуть discord.ext.menus , она все еще находится в бета-версии и пока не имеет документов, но есть несколько примеров в discord.py сервер discord выполните ?tag menus или ?tag embed menu в #testing, чтобы увидеть некоторые примеры. Чтобы установить его python -m pip install -U git https://github.com/Rapptz/discord-ext-menus

3. Спасибо! Я рассмотрю это! Проверил github, и я думаю, что это невозможно сделать в DMS.

Ответ №2:

Исправлено путем создания базы данных для каждого сообщения. Спасибо за людей, которые пытались помочь!

Ответ №3:

Возможно, я немного опоздал, но вот решение, которое сработало для меня

В вашем заявлении «проверить» вы должны добавить к нему это

 and reaction.message == msg
 

Итак, это будет выглядеть примерно так

 def check(reaction, user):
    return user == message.author and str(reaction.emoji) in ["1️⃣"] and reaction.message == msg