Задать вопрос
Wolf_Yout
@Wolf_Yout

Disnake Бот не отвечает на выбор списка, что делать?

Код:
door = random.choice([1,2,3])
        components = disnake.ui.Select(placeholder="Выбирайте...", options=[
            disnake.SelectOption(label="1", value = "1", description="Выбрать первую дверь"),
            disnake.SelectOption(label="2", value = "2", description="Выбрать вторую дверь"),
            disnake.SelectOption(label="3", value = "3", description="Выбрать третью дверь")
        ])
        await ctx.send(embed=disnake.Embed(title="Выбери правильную дверь",description="Правильная или нет, зависит от твоей удачи...",color=0x228b22), components=components)
        try:
            slct = await bot.wait_for("select_option", timeout=10) # Как я понял(т.к. нет никаких ошибок), ожидание этой строки напросто зависает.
            print(slct.values[0])
            if slct.values[0] == str(door):
                await ctx.edit_original_response(embed=disnake.Embed(title="Вы выбрали правильную дверь!",description="Поздравляю!"),components=None)
            else:
                await ctx.edit_original_response(embed=disnake.Embed(title="Не верно...",description=f"Правильной дверью была {door}. В следующий раз повезёт!"))
        except asyncio.TimeoutError:
            await ctx.edit_original_response(embed=disnake.Embed(title="Таймаут истёк!"))

При использований команды выходит это:
image.png
Как исправить проблему с этим не реагированием?
  • Вопрос задан
  • 322 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
MrShandy
@MrShandy
Python
Ошибка была в wait_for, из за неправильного события. Исправил на message_interaction
Также чтобы не выдавало ошибку взаимодействия при неправильном ответе(да и вообще при любом ответе) сделал убирание компонентов.
Ну и на мой взгляд сообщение должно быть эфемерным, чтобы взаимодействовать мог только вызвавший команду пользователь.
моя версия кода

@bot.slash_command(name="test", description="test command")
async def test(interaction: disnake.CommandInteraction):
    door = random.choice([1, 2, 3])
    components = disnake.ui.Select(placeholder="Выбирайте...", options=[
        disnake.SelectOption(label="1", value="1", description="Выбрать первую дверь"),
        disnake.SelectOption(label="2", value="2", description="Выбрать вторую дверь"),
        disnake.SelectOption(label="3", value="3", description="Выбрать третью дверь")
    ])
    await interaction.send(embed=disnake.Embed(title="Выбери правильную дверь",
                                               description="Правильная или нет, зависит от твоей удачи...",
                                               color=0x228b22),
                           components=components)
    try:
        slct = await bot.wait_for("message_interaction",
                                  timeout=10)
        print(slct.values[0])
        if slct.values[0] == str(door):
            await interaction.edit_original_response(
                embed=disnake.Embed(title="Вы выбрали правильную дверь!",
                                    description="Поздравляю!"),
                components=None)
        else:
            await interaction.edit_original_response(embed=disnake.Embed(title="Не верно...",
                                                                         description=f"Правильной дверью была {door}. В следующий раз повезёт!"),
                                                     components=None)
    except asyncio.TimeoutError:
        await interaction.edit_original_response(embed=disnake.Embed(title="Таймаут истёк!"),
                                                 components=None)

не ругайся за "правки", я люблю самодеятельность :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@TuttyFrutti
Как я понял исключение asyncio.TimeoutError прилетает из строки await bot.wait_for(..) ты задал таймаут 10 секунд и ждёшь пока пользователь сделает действие в течение 10 секунд...пользователь за 10 секунд ничего не успевает => тебе прилетает исключение.
По умолчанию в функции wait_for не задан таймаут, она будет ждать сколько нужно, попробуй убрать таймаут и сделать действие select_options
https://docs.disnake.dev/en/stable/ext/commands/ap...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы