получение содержимого сообщения в on_raw_message_delete

#python-3.x #discord #discord.py #discord.py-rewrite

#python-3.x #Discord #discord.py

Вопрос:

Я пытаюсь создать бота, который будет определять, когда сообщение удаляется, и отправлять сообщение на тот же канал с содержимым сообщения.

Я хочу иметь возможность делать это, даже если сообщения нет в боте 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 параметр, поскольку этот фрагмент является частью шестеренки)

 @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) , но получаю ту же ошибку

Комментарии:

1. Сообщение потеряно. Вам нужно кэшировать его, чтобы получить его содержимое. Все, что видит бот on_raw_message_delete , это discordpy.readthedocs.io/en/latest /… однако кэширование каждого сообщения, которое может быть удалено, не является подходящим методом.

2. @TinNguyen Есть ли подходящий метод, или это просто невозможно?

3. Если вы заранее знаете, какие сообщения могут быть удалены, вы можете их кэшировать. Но невозможно просто кэшировать каждое сообщение.

Ответ №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}')