无论如何都可以使用下拉菜单而不在 discord.py 中发送响应?
Posted
技术标签:
【中文标题】无论如何都可以使用下拉菜单而不在 discord.py 中发送响应?【英文标题】:Is there anyway to use a dropdown without sending a response in discord.py? 【发布时间】:2021-11-19 07:43:27 【问题描述】:我在 discord.py 中做了一个下拉选择,但是当用户选择一个选项时,我不想回复消息,但如果我不回复消息,我会在不和谐中得到“交互失败”。
@commands.command()
async def shop(self,ctx):
em = discord.Embed(title = "Store",description = "Buy smthing", colour = ctx.author.colour)
await ctx.send(embed = em,
components=
[
Select(placeholder="Choose a item",
options=[
SelectOption(
label = "A",
value = "a",
description = ""
),
SelectOption(
label = "B",
value = "b",
description = ""
),
]),
Button(style = ButtonStyle.blue, label="button 1")
])
def check(msg):
return msg.author == ctx.author and msg.channel == ctx.channel
while True:
try:
res = await self.client.wait_for("select_option", check=check, timeout=10)
label = res.values[0]
await res.respond(content=f"U have clicked label") #If I don't write this line i get the message "Interaction failed"
print(label) #This was just for checking the output.
break
except asyncio.TimeoutError:
await ctx.send("Sorry, you didn't reply in time!")
break
except discord.NotFound:
print("error")
我不完全理解下拉菜单的工作原理,有人可以解释一下如何去做吗?
例如,当我点击一个选项时,dank memer 不会发送响应。 NO respones from bot when i clicked on the option
【问题讨论】:
【参考方案1】:你可以试试
res.edit_origin(content = "This message can be exactly the same as your original message")
此函数不发送任何消息,但会阻止交互失败消息的出现
您还可以执行以下操作来更改嵌入和按钮/选择菜单:
res.edit_origin(content = "just some random message",component =[newButtons],embed=EmbedObject)
顺便说一句:您问题中的图像是通过禁用消息按钮(基本上是编辑按钮)完成的。
【讨论】:
【参考方案2】:有办法,但不是那么干净:
@client.command(name='test')
async def text(ctx):
global ctxn #make a global variable named for example ctxn
ctxn = ctx #double the value from the ctx ;)
global msgTest
#Define the Fields you want to have in the Dropdown
msgTest = await ctx.send(f'```Select a component```',components = [
[Select(placeholder="Select Settings",
options=[SelectOption(label="Label1", value="Value1"), #Label is the Display Name, Value is for Interaction Selection
SelectOption(label="Label2", value="Value2"),
SelectOption(label="Label3", value="Value3")])]
]
)
@client.event
async def on_select_option(interaction):
#After the selection it searches for the value="XXXXX"
if interaction.values[0] == "Value1":
await msgTest.delete() #Here you delete the dropdown after you selected an entry
await TEST1(ctx=ctxn) #Call the Function with the copied ctx start value
if interaction.values[0] == "Value2":
await msgTest.delete() #Here you delete the dropdown after you selected an entry
await TEST2(ctx=ctxn) #Call the Function with the copied ctx start value
if interaction.values[0] == "Value3":
await msgTest.delete() #Here you delete the dropdown after you selected an entry
await TEST3(ctx=ctxn) #Call the Function with the copied ctx start value
#Here you can programm your functions
async def TEST1(ctx): #First Function
return await ctx.send("Function 1 were selected")
async def TEST2(ctx): #Second Function
return await ctx.send("Function 2 were selected")
async def TEST3(ctx): #Third Function
return await ctx.send("Function 3 were selected")
如果你不删除你在 msgTest 变量中发送的下拉菜单,你仍然会得到交互失败的 msg。
【讨论】:
你能解释一下你做了什么吗? 我在代码中添加了更多注释,如果您有具体问题,请不要犹豫【参考方案3】:您必须在单击下拉菜单时回复消息。这是 Discord API 限制。
【讨论】:
但是在像 dank memer 这样的机器人中,有一个使用“pls pet”购买宠物的命令。从下拉列表中选择宠物后,机器人没有发送任何响应,但它仍然可以工作,这怎么可能 它确实发送了一个响应 wdym? 不,我没有检查过。我更新了我的 qn,我已经包含了屏幕截图 确实是在发送消息。看看我拍的screenshot。也许是你的问题或设置有问题。 是的,当我单击“购买”按钮时,我会收到消息,但是,当我单击下拉列表中的一个选项时,我的机器人会出错。(如果我没有写回复代码”)。您也可以编辑代码以使其表现得像 dank memer。以上是关于无论如何都可以使用下拉菜单而不在 discord.py 中发送响应?的主要内容,如果未能解决你的问题,请参考以下文章
解决element生成的下拉菜单,不在父级之下,而是在body之下,通过父级控制该下拉菜单的样式,达到不跟别的地方冲突的目的