discord.py wait_for('reaction_add') 与直接消息的功能不同

Posted

技术标签:

【中文标题】discord.py wait_for(\'reaction_add\') 与直接消息的功能不同【英文标题】:discord.py wait_for('reaction_add') functioning differently with direct messagesdiscord.py wait_for('reaction_add') 与直接消息的功能不同 【发布时间】:2021-07-10 21:44:23 【问题描述】:

我的目标是让机器人对自己的消息做出反应,然后如果发送原始命令的用户也做出反应,则在该频道中发送回复。现在,如果命令是在服务器通道中发送的,则该功能可以工作,但如果作为直接消息发送给机器人,它不会等待您的反应。通过在检查过程中打印user.idctx.author.id 的值,我注意到机器人有时会检查它自己的反应(user.id 返回机器人的ID)。我不确定这是否相关,因为无论如何它都会等待服务器频道中正确用户的反应。

wait_for()on_reaction_add 的 API 文档

我希望此功能在服务器中工作并将消息直接发送到机器人,我错过了什么吗?谢谢!

@bot.command()
async def hello(ctx):
    msg = await ctx.send(f'Hi ctx.author.mention')
    await msg.add_reaction('✅')

    def check(reaction, user):
        print(user.id, ctx.author.id)
        return reaction.message.id == msg.id and user.id == ctx.author.id and str(reaction.emoji) == '✅'

    try:
        reaction, user = await bot.wait_for('reaction_add', timeout=30.0, check=check)
    except asyncio.TimeoutError:
        pass
    else:
        await ctx.send('success')

【问题讨论】:

你确定它不起作用吗?我无法重现该问题。您可以将用于等待回复的代码放入 DM 中吗? 感谢格式化帮助 - 它在 try 下的 hello 函数中:reaction, user = await bot.wait_for('reaction_add', timeout=30.0, check=check) 您正在等待调用命令的人对发送的消息做出反应,如果我对随机消息(例如在 DM 中)做出反应,它将不起作用,它必须是机器人发送的那个. 不是随机消息,在 DM 中调用命令,并对机器人回复的消息做出反应并做出反应。 它对我有用,你启用了哪些意图? 【参考方案1】:

毕竟这是一个意图问题,与this 帖子相同的权限问题。 在intents = discord.Intents.default() 之后,您还需要为您的应用程序here 启用服务器成员特权意图并在您的代码中设置intents.members = True 以赋予机器人所需的权限,使其在DMs 中工作

【讨论】:

【参考方案2】:

你可以查看反动id

    def check(reaction, user):
        # let the user id str 
        print(str(reaction.author.id), str(ctx.author.id))
        return reaction.message.id == msg.id and reaction.author.id == ctx.author.id and str(reaction.emoji) == '✅'

    try:
        # wait for the reactions
        reaction, user = await bot.wait_for('reaction_add', timeout=30.0, check=check)
    except asyncio.TimeoutError as error:
        pass
    else:
        # except an error
        await ctx.send('success')

【讨论】:

以上是关于discord.py wait_for('reaction_add') 与直接消息的功能不同的主要内容,如果未能解决你的问题,请参考以下文章

discord.py 如何使用 wait_for 等待作者消息?

在 discord.py wait_for 上带有 check() 的 TypeError

discord.py wait_for message... 如何取消息内容和写消息的人?

discord.py wait_for('reaction_add') 与直接消息的功能不同

Discord.py 按钮交互消息删除

discord.py和discord.py的区别[voice]