DM 中的 Discord.py Bot 反应

时间:2021-03-14 18:51:19

标签: python discord discord.py

我有一个 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 中时,它会做一些奇怪的事情。首先,它根本不检测用户的反应。当我在 check 函数中放置一个打印语句时,它告诉我它解析了一个反应,而这个反应是机器人本身在拇指向下的情况下做出反应。当我对消息做出反应时,从未调用过检查函数。

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

在 DM 中使用 client.wait_for 有问题吗?我应该改用 Cog 侦听器吗?还是我的代码有问题?任何帮助表示赞赏。提前致谢!

编辑: Intents 已启用:无(我需要 Intent 来检查 DM 反应吗?)

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

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

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

3 个答案:

答案 0 :(得分:1)

解决方案

为了在 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_reactions 和反应可能不包含在默认意图中

不是真的。因为只移除了presence 和members,其他的都在里面。

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

正如 OP 所指出的那样,它确实有效 discord.Intents.all(),因为在这种情况下,启用了 member 意图。

答案 1 :(得分:0)

是的,您需要意图。 dm_reactionsreactions(没有它们就不应该工作)。对您来说最简单的方法是启用默认意图

intents = discord.Intents.default()
client = commands.Bot(..., intents=intents)

答案 2 :(得分:0)

除了 Łukasz 的回答之外,我尝试了一些实验,发现使用 discord.Intents.all() 有效,但无效 discord.Intents.default()。这让我觉得可能 dm_reactionsreactions 不包含在默认意图中,但 包含在所有意图中?对此的任何澄清仍然值得赞赏,因为我几个月前才开始学习 discord.py。