我有一个 discord.py 机器人,我想对其进行编码以执行以下操作:
现在基于文档和以前的项目,我想出了这个添加反应的功能:
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, ["?", "?"])
答案 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
你可以看到它做了两件事:
presence
和 members
的意图所以 op 的假设:
<块引用>这让我觉得 dm_reactions 和反应可能不包含在默认意图中
不是真的。因为只移除了presence 和members,其他的都在里面。
现在,即使打开了 dm_reactions
、reactions
和 dm_messages
,您仍然需要打开 members
。这就是解决方案中发生的事情。
正如 OP 所指出的那样,它确实有效 discord.Intents.all()
,因为在这种情况下,启用了 member
意图。
答案 1 :(得分:0)
是的,您需要意图。 dm_reactions
和 reactions
(没有它们就不应该工作)。对您来说最简单的方法是启用默认意图
intents = discord.Intents.default()
client = commands.Bot(..., intents=intents)
答案 2 :(得分:0)
除了 Łukasz 的回答之外,我尝试了一些实验,发现使用 discord.Intents.all()
有效,但无效 discord.Intents.default()
。这让我觉得可能 dm_reactions
和 reactions
不包含在默认意图中,但 包含在所有意图中?对此的任何澄清仍然值得赞赏,因为我几个月前才开始学习 discord.py。