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

Как настроить у бота ожидание события взаимодействия(меню выбора)?

если допустим 2 пользователя одновременно команду тыкают, то если 1 не успел, команда 2 закрывает выбор у первого пользователя, как это исправить?
spoiler
@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)
  • Вопрос задан
  • 144 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 1
MrShandy
@MrShandy
Python
Вот такое решение отлично работает
class DropdownView(disnake.ui.View):
    def __init__(self, right_door: int):
        super().__init__(timeout=10)
        self.right_door = str(right_door)

    @disnake.ui.string_select(
        placeholder="Выбирайте...",
        min_values=1,
        max_values=1,
        options=[
            disnake.SelectOption(label="1", value="1", description="Выбрать первую дверь"),
            disnake.SelectOption(label="2", value="2", description="Выбрать вторую дверь"),
            disnake.SelectOption(label="3", value="3", description="Выбрать третью дверь")
        ]
    )
    async def callback(self, string_select: disnake.ui.StringSelect, inter: disnake.MessageInteraction):
        if string_select.values[0] == self.right_door:
            await inter.send(
                embed=disnake.Embed(title="Вы выбрали правильную дверь!",
                                    description="Поздравляю!"),
                ephemeral=True
            )
        else:
            await inter.send(
                embed=disnake.Embed(title="Не верно...",
                                    description=f"Правильной дверью была {self.right_door}. В следующий раз повезёт!"),
                ephemeral=True
            )
        self.stop()



@bot.slash_command(name="test", description="test command")
async def test(interaction: disnake.CommandInteraction):
    door = random.choice([1, 2, 3])
    view = DropdownView(door)
    await interaction.send(embed=disnake.Embed(title="Выбери правильную дверь",
                                               description="Правильная или нет, зависит от твоей удачи...",
                                               color=0x228b22),
                           view=view, ephemeral=True)
    if await view.wait():
        await interaction.edit_original_response(
            embed=disnake.Embed(title="Вы слишком долго выбирали!",
                                color=disnake.Color.red()
                                ),
            view=None)
    else:
        await interaction.delete_original_response()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Обычно делают 2 вида взаимодействий:
- Вечные, которые можно кликать сколько угодно.
- Пользовательские, которые вызваны из команды и доступны только тому кто их вызвал.

Проверяйте и обрабатывайте только нажатия от вводившего команду или делайте команду эфемерной чтобы только вводивший ее видел.
Ответ написан
Ваш ответ на вопрос

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

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