on_reaction_add 未运行

Cra*_*ley 1 python discord discord.py

我是 discord.py 的新手,正在尝试制作翻译机器人。当用户对某个标志做出反应时,机器人会对其进行翻译,但该事件永远不会被调用,因此我还没有代码来翻译任何消息。我知道它没有被调用,因为程序没有打印'x'到控制台。

@client.event
async def on_reaction_add(reaction, user):
    channel = reaction.message.channel
    print('x')
    await client.send_message(channel, '{} has added {} to the the message {}'.format(user.name, reaction.emoji, reaction.message.content))

    await client.process_commands(reaction.message)
Run Code Online (Sandbox Code Playgroud)

小智 9

这个线程可能有点晚了,但是上面的答案是一个有效的答案。但是on_raw_reaction_add,即使消息不在机器人的缓存中,您也可以使用which 被调用。

当消息添加了反应时调用。与 on_reaction_add() 不同,无论内部消息缓存的状态如何,都会调用它。

文档链接

例子:

@commands.Cog.listener()
async def on_raw_reaction_add(self, payload):
    channel = await self.bot.fetch_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    user = await self.bot.fetch_user(payload.user_id)
    emoji = payload.emoji

    await channel.send("Hello")
Run Code Online (Sandbox Code Playgroud)


abc*_*ccd 8

事件未被注册/调用的原因并没有太多正当理由。

其中之一在文档中说明:http : //discordpy.readthedocs.io/en/async/api.html#discord.on_reaction_add。尝试立即对机器人在线后发送的消息添加反应。由于在机器人在线之前发送的消息不会被机器人识别(不在 中Client.messages)。

如果在Client.messages缓存中找不到该消息,则不会调用此事件。

另一个可能的原因是这个函数在客户端循环开始之前从未定义过。验证您的缩进。和/或尝试将函数直接放在 下client = Bot(...),以检查这是否是问题所在。

如果上述方法都不能解决您的问题,请发布一个最小的、完整的、可验证的示例(从上到下的一个简短的可运行代码,表明您的问题)。

  • 你知道一种强制特定旧消息进入缓存的方法吗?可以使用`logs_from`来获取消息,但这似乎并没有将它们放入缓存中...... (3认同)
  • 适用于尚未制作的新消息:) @PatrickHaugh 是的,这就是原因,我正在尝试使用旧消息,干杯 :) (2认同)