@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)
  • Вопрос задан
  • 124 просмотра
Решения вопроса 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 вида взаимодействий:
- Вечные, которые можно кликать сколько угодно.
- Пользовательские, которые вызваны из команды и доступны только тому кто их вызвал.

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

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

Войти через центр авторизации
Похожие вопросы