DM中的Discord.py Bot反应 [英] Discord.py Bot Reactions in DMs
问题描述
我有一个discord.py机器人,我想对其进行编码以执行以下操作:
- 当用户键入命令时,机器人应该向用户发送DM
- 然后,它应该添加对此消息的反应(竖起大拇指和向下拇指)
- 最后,它应该等待用户对其中一个反应做出反应。
现在基于文档和以前的项目,我想出了这个添加反应的函数:
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())
- 从这些意图中删除与
presence
和members
对应的意图
所以OP的假设:
这让我觉得,默认意图中可能没有包括dm_Reaction和Reaction
不是真的。因为只删除了在线状态和成员,所以所有其他成员都在其中。
现在,即使使用dm_reactions
、reactions
和dm_messages
,您仍然需要打开members
。这就是解决方案中正在发生的事情。
正如OP指出的,它确实适用于discord.Intents.all()
,因为在这种情况下,member
意图是启用的。
这篇关于DM中的Discord.py Bot反应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!