无论如何都可以使用下拉菜单而不在 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之下,通过父级控制该下拉菜单的样式,达到不跟别的地方冲突的目的

如何制作不在 HTML 中的多选下拉菜单。它需要在良好的用户界面中

子菜单不在WordPress下拉菜单中复制样式

Discord.py 在嵌入中禁用按钮/冻结按钮

Ng bootstrap 下拉菜单不在前面

Discord .setImage 文件不在嵌入中,而是在它之前发送