我有一个discord.py bot,我想编写它来执行以下操作:
当用户键入命令时,bot应向用户发送dm
然后,它应该添加对此消息的React(竖起大拇指和竖起大拇指)
最后,它应该等待用户对其中一种React作出React。
现在,基于文档和以前的项目,我提出了添加React的功能:
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中时,它会执行一些特殊的操作。首先,它根本检测不到用户的React。当我在check函数中放入print语句时,它告诉我它解析了一个React,而这个React就是机器人自身的React,拇指朝下。当我对消息做出React时,从未调用过check函数。
我看到其他一些解决方案使用cog侦听器来检查所有添加的React,并使用全局消息列表。然而,这对我的机器人不起作用,因为它所做的一切都在一个命令中。此外,它会占用大量内存。这就是为什么我要和他一起去 client.wait_for
取而代之的是方法。
使用时有问题吗 client.wait_for
在dms中?我应该使用cog侦听器吗?还是我的代码有问题?感谢您的帮助。提前谢谢!
编辑:启用意图:无(我是否需要检查dmReact的意图?)
编辑2:添加了默认意图,仍然是相同的问题
编辑3:我如何使用 get_reacts
功能:
msg = await context.author.send("Message")
reaction = await get_reacts(context.author, self.client, msg, ["👍", "👎"])
3条答案
按热度按时间vwoqyblh1#
解决方案
为了从用户接收dm中的React事件,您需要启用
members
意图因此,您只需创建默认意图,然后设置
members
值为true:解释
op要求澄清,就在这里。
如果你看一下
discord.Intents.default()
代码:你可以看到它做了两件事:
为所有内容生成意图(使用自己的discord.intents.all()
从这些意图中,删除对应于
presence
及members
因此,op的假设:这让我认为,也许dm_React和React不包括在默认意图中
事实并非如此。因为只有存在和成员被移除,所以所有其他成员都在其中。
现在,事实证明,即使
dm_reactions
,reactions
,及dm_messages
对了,你还需要members
在…上这就是解决方案中发生的情况。正如op所指出的,它确实会起作用
discord.Intents.all()
因为,在这种情况下member
意图已启用。gcmastyq2#
是的,你需要意向。
dm_reactions
及reactions
(没有它们,它就不能工作)。对您来说,最简单的方法是简单地启用默认意图g6baxovj3#
再加上ukasz的答案,我尝试了一些实验,发现使用
discord.Intents.all()
成功了,但没有成功discord.Intents.default()
. 这让我觉得也许dm_reactions
及reactions
未包含在默认意图中,但是否包含在所有意图中?对于这方面的任何澄清,我仍然非常感激,因为我几个月前才开始学习discord.py。