DM中的Discord.py Bot反应 [英] Discord.py Bot Reactions in DMs

查看:15
本文介绍了DM中的Discord.py Bot反应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个discord.py机器人,我想对其进行编码以执行以下操作:

  1. 当用户键入命令时,机器人应该向用户发送DM
  2. 然后,它应该添加对此消息的反应(竖起大拇指和向下拇指)
  3. 最后,它应该等待用户对其中一个反应做出反应。

现在基于文档和以前的项目,我想出了这个添加反应的函数:

async def get_reacts(user, client, message, emojis, timeout=None):
    for emoji in emojis:
        await message.add_reaction(emoji)
    try:
        def check(reaction, reactor):
            return reactor.id == user.id and reaction.emoji in emojis
        reaction, user = await client.wait_for("reaction_add", check=check, timeout=timeout)
        return reaction.emoji
    except:
        pass

此代码在服务器中运行良好,但当消息在DM中时,它会做一些特殊的事情。首先,它根本检测不到用户的反应。当我将一条print语句放在check函数中时,它告诉我它解析了一个反应,而那个反应是机器人自己用拇指向下反应。当我对该消息作出反应时,从未调用过检查函数。

我看到一些其他解决方案使用Cog侦听器来检查所有添加的反应,并使用全局消息列表。然而,这对我的机器人不起作用,因为它所做的一切都是在一个命令中完成的。此外,它还会占用大量内存。这就是我改用client.wait_for方法的原因。

在DM中使用client.wait_for有问题吗?我应该改用Cog监听程序吗?或者是我的代码有问题?如有任何帮助,我们不胜感激。提前感谢!

编辑: 意向启用:无(我是否需要意向来检查DM反应?)

编辑2: 添加了默认意图,仍然是相同的问题

编辑3: 我如何使用get_reacts函数:

msg = await context.author.send("Message")
reaction = await get_reacts(context.author, self.client, msg, ["👍", "👎"])

推荐答案

解决方案

为了在DM中接收来自用户的反应事件,您需要启用members意图。

因此您唯一需要做的就是创建默认意图,然后将members值设置为True:

intents = discord.Intents.default()
intents.members = True

解释

Op要求澄清,因此是这样的。

如果您查看discord.Intents.default()代码:

@classmethod
def default(cls):
    self = cls.all()
    self.presences = False
    self.members = False
    return self

您可以看到它做了两件事:

  • 生成所有内容的意图(使用其自身的discord.Intents.all())
  • 从这些意图中删除与presencemembers对应的意图

所以OP的假设:

这让我觉得,默认意图中可能没有包括dm_Reaction和Reaction

不是真的。因为只删除了在线状态和成员,所以所有其他成员都在其中。

现在,即使使用dm_reactionsreactionsdm_messages,您仍然需要打开members。这就是解决方案中正在发生的事情。

正如OP指出的,它确实适用于discord.Intents.all(),因为在这种情况下,member意图是启用的。

这篇关于DM中的Discord.py Bot反应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆