【发布时间】:2021-06-04 11:26:18
【问题描述】:
我正在使用 discordpy 编写一个不和谐的测验机器人。 机器人发送一条包含问题和 4 个可能答案的消息。 该机器人还使用表情符号 1️⃣、2️⃣、3️⃣ 和 4️⃣ 添加对他的消息的反应。 这个想法是,机器人会等待 30 秒,让人们点击一个反应。如果点击的反应是正确/错误的答案,机器人会回复正确或错误。一旦有人回答,机器人也应该停止等待新的反应。 Aka:一旦用户点击了 4 个反应表情符号之一,机器人应该回复,而不是处理任何未来对此消息的反应。
目前,我让机器人发送消息(嵌入)并向其添加反应表情符号。但是,从人们那里获得结果是我遇到的问题。
一方面,由于某种原因,机器人似乎仍然会被自己的反应触发,即使我在检查功能中排除了这一点。 (或者我是这么认为的)。
总的来说,我希望为此采用一种结构良好的方法。我熟悉所有 api 调用/事件,例如 on_message() 和 on_reaction_add(),但我无法正确地将所有内容放在一起。
这是我目前所拥有的:
@commands.command(name="quiz")
async def on_command_quiz(ctx):
#if ctx.message.author.bot:
# return
print("Quiz command!")
quiz = QuizGame()
# Send quiz
reply = await ctx.message.channel.send(embed=quiz.format())
# Add reply emojis
for x in range(0, len(quiz.quiz_answers)):
await reply.add_reaction(Utils.get_number_emoji_by_number(x + 1))
print("Correct Answer:", quiz.quiz_correct_answer)
# Evaluate replies
async def check_answer(reaction, user):
emojis = ["1️⃣","2️⃣","3️⃣","4️⃣"]
return user != ctx.message.author and str(reaction.emoji) in emojis
# Wait for replies
try:
reaction, user = await bot.wait_for('reaction_add', timeout=30.0, check=check_answer)
except asyncio.TimeoutError:
print("Timeout")
else:
if user != ctx.message.author:
if str(reaction.emoji) == "1️⃣":
print("1")
elif str(reaction.emoji) == "2️⃣":
print("2")
elif str(reaction.emoji) == "3️⃣":
print("3")
elif str(reaction.emoji) == "4️⃣":
print("4")
else:
print("Unknown reaction")
我怎样才能做到这一点?
【问题讨论】: