如何防止用户从 nextcord.ui.Select 中选择一个选项
How to prevent the user from selecting an option from nextcord.ui.Select
我想实现一个用户不能select任何选项的列表。
我尝试了以下方法:
阅读 Nextcord 文档。他们没有提供任何方法来实现这一点。
查看源代码,看看我是否可以创建一个从 ui.Select 派生的 class,它不会向 Discord 发送数据,从而强制失败的交互(因为我看到失败的交互取消了用户的 selection)。
在ui.Select回调中设置values属性为空列表。但它向我发送错误“无法设置属性”。
调用asyncio.sleep让回调进入休眠状态,直到Discord认为交互失败。但是,尽管它有效,但会在控制台中产生一个丑陋的错误。
结论
我得出的结论是,在回调中抛出 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()
我想实现一个用户不能select任何选项的列表。
我尝试了以下方法:
阅读 Nextcord 文档。他们没有提供任何方法来实现这一点。
查看源代码,看看我是否可以创建一个从 ui.Select 派生的 class,它不会向 Discord 发送数据,从而强制失败的交互(因为我看到失败的交互取消了用户的 selection)。
在ui.Select回调中设置values属性为空列表。但它向我发送错误“无法设置属性”。
调用asyncio.sleep让回调进入休眠状态,直到Discord认为交互失败。但是,尽管它有效,但会在控制台中产生一个丑陋的错误。
结论
我得出的结论是,在回调中抛出 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()