Как отправить ephemeral сообщение с поставленными реакциями?
Мне нужно сделать так, чтобы при нажатии кнопки, отправлялось ephemeral сообщение, в котором будут уже проставленные реакции и с ними можно будет взаимодействовать.
@disnake.ui.button(label='Команда 1', custom_id='button1')
async def button1(self, button: disnake.ui.Button, interaction: disnake.Interaction):
if cur.execute(f'SELECT * FROM saves WHERE {interaction.user.id}').fetchall():
await interaction.response.send_message('❌ Вы уже зарегистрированы в этом клозе!', ephemeral=True)
else:
await interaction.response.send_message("""
? Выберите свою роль в команде:
⭐ - Капитан
? - Игрок 1
? - Игрок 2
? - Игрок 3
? - Игрок 4
? - Резерв
""", ephemeral=True)
time.sleep(1)
await bot.get_message(bot.get_channel(1381715963359137967).last_message_id).add_reaction('⭐')
Ошибка:
Ignoring exception in view <Buttons timeout=None children=1> for item <Button style=<ButtonStyle.secondary: 2> url=None disabled=False label='Команда 1' emoji=None row=None>:
Traceback (most recent call last):
File "PycharmProjects\KlozBot\.venv\Lib\site-packages\disnake\ui\view.py", line 385, in _scheduled_task
await item.callback(interaction)
File "PycharmProjects\KlozBot\cogs\create.py", line 29, in button1
await bot.get_message(bot.get_channel(1381715963359137967).last_message_id).add_reaction('⭐')
File "PycharmProjects\KlozBot\.venv\Lib\site-packages\disnake\message.py", line 2200, in add_reaction
await self._state.http.add_reaction(self.channel.id, self.id, emoji)
File "PycharmProjects\KlozBot\.venv\Lib\site-packages\disnake\http.py", line 417, in request
raise NotFound(response, data)
disnake.errors.NotFound: 404 Not Found (error code: 10008): Unknown Message
Ответы (1 шт):
Автор решения: denisnumb
→ Ссылка
На временные сообщения (ephemeral=True) нельзя добавлять реакции.
Если вам нужен именно такой тип взаимодействия, то придется отказаться от использований временных сообщений.
В противном случае необходимо использовать использовать другие средства, такие как выпадающие списки или диалоговые окна
Примеры реализации можно посмотреть здесь.
Еще один момент — вам не обязательно после отправки сообщения ждать секунду и затем пытаться получить это сообщение:
- Вы его все равно не получите, так как оно временное и не будет храниться в истории канала
await interaction.response.send_messageв качестве результата выполнения корутины возвращает disnake.Interaction из которого можно получить объект сообщения (но не временного).
i = await interaction.response.send_message(. . .)
message = await i.original_message()
- Использование
time.sleep(1)в асинхронном программировании заставит зависнуть все выполняющиеся функции. Например, если у вас бот проигрывает музыку или выполняет еще какие-то процессы, то все это "встанет", т.к. все асинхронные функции выполняются в одном потоке. Вместоtime.sleep(1)следует использоватьawait asyncio.sleep(1), чтобы не блокировать выполнение других корутин