如何防止用户从 nextcord.ui.Select 中选择一个选项

How to prevent the user from selecting an option from nextcord.ui.Select

我想实现一个用户不能select任何选项的列表。

我尝试了以下方法:

结论

我得出的结论是,在回调中抛出 Python 错误是我能识别的强制失败交互并因此阻止用户 select 进行某些操作的唯一方法。但是我不喜欢仅仅 objective 中断代码过程就产生错误。

询问

如何让用户无法 select 来自 ui.Select 的任何内容?或者,如果这不可能,我如何在每次用户 select 做某事时强制失败的交互?

编辑

我忘了给你添加一个最小的、完整的和可验证的例子,所以你可以测试,对不起。

from nextcord.ext import commands
from nextcord import ui
import nextcord

import asyncio

#-----------------------------------------------#
# Bot
#-----------------------------------------------#

bot = commands.Bot(command_prefix="!")

@bot.command()
async def play(ctx):
    view = ui.View()

    select = ui.Select(options=[nextcord.SelectOption(label="option1"), nextcord.SelectOption(label="option2")])
    view.add_item(select)

    await ctx.send("Test Message", view=view)
        
@bot.event
async def on_ready():
    print("Bot listo!")

bot.run(bot_key)

虽然没有官方方法可以做到这一点,但有一些解决方法:

第一种方法:覆盖 interaction_check:

每次调度交互时都会调用interaction_check函数,如果此函数returnsTrue,则只会响应交互。所以如果这个函数总是returnsFalse,交互就会一直失败,导致“This interaction failed”并重置discord中select中的选择:

async def interaction_check(interaction: nextcord.Interaction):
    return False

然后您可以像添加回调函数一样将此函数添加到 select。

第二种方法:编辑消息:

这是一个更简洁的选项,因为它不会在 discord 中显示“此交互失败”,并且重置选项的等待时间更短。这通过简单地编辑消息而不改变任何东西来工作:

async def callback(interaction: nextcord.Interaction):
    await interaction.edit()