команда нажатия кнопки работает, но по-прежнему говорит, что взаимодействие не удалось; использование компонентов discord

#discord.py

Вопрос:

Код делает то, что должен делать, но после каждого нажатия кнопки он говорит: «Это взаимодействие не удалось». Нажатие кнопки изменяет вставку, чтобы изменить ее на другую. Как бы я избавился от этого сообщения об ошибке взаимодействия после нажатия кнопки?

проблема: https://i.stack.imgur.com/i4dTd.png

код, полученный от: https://github.com/elixss/YouTube/blob/main/source/buttons.py

Вот код:

 @bot.group(invoke_without_command=True)
async def help(ctx):

    # buttons
    one = Button(style=1, label="Commands", id="em1")
    two = Button(style=1, label="Depression", id="em2")
    three = Button(style=1, label="Moderator", id="em3")
    four = Button(style=1, label="Language", id="em4")

    # embeds
    em1 = Embed(title="Commands Plugin",color=0x5865F2)
    em2 = Embed(title="Depression Plugin", description="placeholder", color=0x5865F2)
    em3 = Embed(title="Moderator Plugin", description="placeholder", color=0x5865F2)
    em4 = Embed(title="Language Plugin", description="placeholder", color=0x5865F2)

    # main help embed
    help_embed = Embed(description="> **Help Module**nPress on any button to view the commands for that selected plugin.",
                      color=discord.Color.random())

    # buttons to embeds
    buttons = {
        "em1": em1,
        "em2": em2,
        "em3": em3,
        "em4": em4
    }

    msg = await ctx.send(embed=help_embed,
                         components=[[one, two, three, four]])
    while True:
        event = await bot.wait_for("button_click", timeout=60.0)

        if event.channel is not ctx.channel:
            return

        if event.channel == ctx.channel:
            response = buttons.get(event.component.id)
            await msg.edit(embed=response)

            if response is None:
                await event.channel.send("error, try again.")
 

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

1. Встраивания должны быть discord.Embed() , а не просто Embed()

2. @ChaoticNebula Нет. Он мог бы просто сделать from discord import Embed это вместо import discord этого . В этом нет ничего плохого.

3. может быть … он импортировал его напрямую? @ChaoticNebula

4. Да, я использовал from discord import Embed

5. Новая вещь, которую я узнал сегодня 😁

Ответ №1:

Как сказал Элиас, вы должны реагировать на взаимодействия, иначе это покажет, что «Это взаимодействие не удалось», но не с обычным ctx.send() , а с (в вашем случае)

 await event.respond(type=4, message="Responded!")
 

Если вы не хотите отправлять сообщение в ответ на нажатие кнопки или выбор в выборе, вы можете просто использовать type=6 без сообщения:

 await event.respond(type=6)
 

Дополнительные сведения о типах см. в документации.

Ответ №2:

Лучший способ сделать это-либо удалить все кнопки после их нажатия, либо добавить время восстановления, которое автоматически удалит кнопки через определенное время.

В вашей ситуации это выглядело бы примерно так:

 msg = await ctx.send(embed=help_embed, components=[[one, two, three, four]])
try: 
   res = await client.wait_for("button_click", timeout = 60)
except asyncio.TimeoutError:
   await msg.edit(components = []) #removes buttons from message
else:
   if res.author == message.author:
       #when button is clicked
       await msg.edit(components = [])
 

Это также предотвращает ограничение скорости, поэтому у вас нет кнопок, постоянно ожидающих ответа.

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

1. Да, это способ , но это не лучший способ.