如何使用discord.py让discord wait_for等待反应或消息

时间:2021-03-25 17:36:02

标签: python discord.py

我一直在使用以下两种方法从不和谐嵌入中获取用户输入。第一个我用来获取基于文本的消息输入,第二个我用来获取反应输入(用于对嵌入进行分页)。我想知道的是,我是否可以将这两者合并以创建一种等待反应或消息输入的方法?

#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)

1 个答案:

答案 0 :(得分:0)

在更新后的代码中,您需要检查事件是什么类型的可等待事件,以便您可以使用正确数量的值进行解包并完成预期的行为。使用您的 messagereaction_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 的实例。)