【问题标题】:getting message content in on_raw_message_delete在 on_raw_message_delete 中获取消息内容
【发布时间】:2021-01-21 07:40:30
【问题描述】:

我正在尝试制作一个机器人来检测消息何时被删除,并将消息发送到与消息内容相同的频道。

即使消息不在机器人的cached_messages 中,我也希望能够执行此操作,因此我使用的是on_raw_message_delete(payload)

我的问题是,当尝试使用await channel.fetch_message(payload.message_id) 从频道获取消息时,我收到以下错误:
discord.errors.NotFound: 404 Not Found (error code: 10008): Unknown Message

我认为这是因为消息已经从频道中消失了,但我不知道我还能如何从消息中获取内容或其他任何内容。

这是我的代码(请注意,我有一个 self 参数,因为这个 sn-p 是 cog 的一部分)

@commands.Cog.listener()
async def on_raw_message_delete(self, payload):
    channel = self.bot.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)

    channel.send(f'Message deleted with content: {message.content}')

我也试过channel = await self.bot.fetch_channel(payload.channel_id),但我得到了同样的错误

【问题讨论】:

  • 消息丢失。您需要缓存它以检索其内容。机器人在on_raw_message_delete 上看到的所有内容都是discordpy.readthedocs.io/en/latest/…,但是缓存每条可能被删除的消息并不是一种合适的方法。
  • @TinNguyen 那么有没有合适的方法,还是只是不可行?
  • 如果您事先知道哪些邮件可能会被删除,您可以缓存它们。但是只缓存每条消息是不可行的。

标签: python-3.x discord discord.py discord.py-rewrite


【解决方案1】:

您可以为此使用payload.cached_message

但问题是,如果删除的消息是在机器人离线时发送的,那么它会返回None,我想如果机器人看不到频道也是一样的。如果您的机器人将不间断地运行,那么就没有问题。

所以你可以简单地做:

@commands.Cog.listener()
async def on_raw_message_delete(self, payload):
    message = payload.cached_message
    channel = message.channel
    await channel.send(f'Message deleted with content: {message.content}')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2013-04-02
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多