#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