我一直在使用以下两种方法从不和谐嵌入中获取用户输入。第一个我用来获取基于文本的消息输入,第二个我用来获取反应输入(用于对嵌入进行分页)。我想知道的是,我是否可以将这两者合并以创建一种等待反应或消息输入的方法?
#message input
try:
answer = await self.bot.wait_for(
"message",
timeout=60,
check=lambda message: message.author.id == ctx.author.id
and isinstance(message.channel, discord.channel.DMChannel)
)
#reaction input
try:
reaction, user = await self.bot.wait_for(
"reaction_add",
timeout=60,
check=lambda reaction, user: user.id == ctx.author.id
and reaction.emoji in buttons
#and isinstance(reaction.channel, discord.channel.DMChannel),
)
更新: 因此,我尝试实施与duckboycool 相关联的方法(非常感谢!)。 我现在遇到的问题是,当我对分页嵌入做出反应时,它可以正常工作,反应会被记录下来,并且嵌入会相应地更新。但是,如果我输入一条消息,则会出现以下错误:
"reaction, emoji = 等待任务 类型错误:无法解包不可迭代的消息对象"
这是我的代码:
finished =0
while finished == 0:
done_tasks = None
check1=lambda reaction, user: user.id == ctx.author.id and reaction.emoji in buttons
check2=lambda message: message.author.id == ctx.author.id and isinstance(message.channel, discord.channel.DMChannel)
pending_tasks = [self.bot.wait_for('reaction_add',check=check1),self.bot.wait_for('message',check=check2)]
done_tasks, pending_tasks = await asyncio.wait(pending_tasks, return_when=asyncio.FIRST_COMPLETED)
#print(done_tasks)
for task in pending_tasks:
task.cancel()
for task in done_tasks:
reaction, emoji = await task
message = await task
if reaction:
print(reaction)
previous_page = current
if reaction.emoji == u"\u23EA":
current = 0
elif reaction.emoji == u"\u25C0":
if current > 0:
current -= 1
elif reaction.emoji == u"\u25B6":
if current < len(pages)-1:
current += 1
elif reaction.emoji == u"\u23E9":
current = len(pages)-1
if current != previous_page:
await msg.edit(embed = pages[current])
else:
print(message.content)
答案 0 :(得分:0)
在更新后的代码中,您需要检查事件是什么类型的可等待事件,以便您可以使用正确数量的值进行解包并完成预期的行为。使用您的 message
和 reaction_add
示例,这可能看起来像这样。
for task in done_tasks:
taskobj = await task
if isinstance(taskobj, discord.Message):
message = taskobj
#Message logic
else:
reaction, user = taskobj
#Reaction logic
根据您使用的事件,您可能需要做不同的事情。 (这里,它依赖于 tuple
被识别为不是 discord.Message
的实例。)