Как отправить 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) нельзя добавлять реакции.

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

В противном случае необходимо использовать использовать другие средства, такие как выпадающие списки или диалоговые окна

Примеры реализации можно посмотреть здесь.


Еще один момент — вам не обязательно после отправки сообщения ждать секунду и затем пытаться получить это сообщение:

  1. Вы его все равно не получите, так как оно временное и не будет храниться в истории канала
  2. await interaction.response.send_message в качестве результата выполнения корутины возвращает disnake.Interaction из которого можно получить объект сообщения (но не временного).
i = await interaction.response.send_message(. . .)
message = await i.original_message()
  1. Использование time.sleep(1) в асинхронном программировании заставит зависнуть все выполняющиеся функции. Например, если у вас бот проигрывает музыку или выполняет еще какие-то процессы, то все это "встанет", т.к. все асинхронные функции выполняются в одном потоке. Вместо time.sleep(1) следует использовать await asyncio.sleep(1), чтобы не блокировать выполнение других корутин
→ Ссылка