#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}')