【发布时间】:2022-09-25 17:43:29
【问题描述】:
最近我决定重写我的不和谐机器人并添加按钮。
到目前为止我遇到的主要问题是,我不能禁用按钮刚被按下人们告诉button.disabled=True,实际上,它会禁用按钮,但它只是发送它被禁用,所以它永远不能被按下。我想要的是能够点击它并做它的事情然后禁用它。
作为参考,我会放一些代码
我使用 disnake,一个 discord.py 分支,它的语法与 spy 相同,但我们有按钮和斜线命令、下拉菜单等
class BlurpleButton(Button):
def __init__(self, label, emoji=None):
super().__init__(label=label, style=discord.ButtonStyle.blurple, emoji=emoji)
这是为了更容易使用按钮,我创建了一个模板,我可以在任何命令上使用它
class CustomView(View):
def __init__(self, member: disnake.Member):
self.member = member
super().__init__(timeout=180)
async def interaction_check(self, inter: disnake.MessageInteraction) -> bool:
if inter.author != self.member:
await inter.response.send_message(content=\"You don\'t have permission to press this button.\", ephemeral=True)
return False
return True
这是因为按钮只能由提到的成员按下,例如,如果我这样做/test @member(由于不和谐的新特权意图,我迁移到斜线命令)只有该成员能够按下它而没有其他人。
到目前为止一切正常,现在我们在命令中“组装”
@commands.slash_command(description=\'test\')
async def test(self, inter):
(do stuff in there)
. . .
button1 = BlurpleButton(\"Button name\")
view=CustomView(member)
view.add_item(button1)
async def button_callback(inter):
await inter.send(embed=embedname2)
button1.callback = button_callback
await inter.send(embed=embed1, view=view)
现在再一次,这段代码正在做它打算做的事情,发送一个嵌入(让我们只是说我把......很少嵌入)并附加到我们有@的那个嵌入987654326@ 当它被点击时它发送embedname2 并且有些地方不再工作了,我在发送embedname2 它之后继续尝试任何方式,通过点击一个按钮来禁用自身如果我在回调中添加button1.disabled=True,则该按钮将被禁用,而不会被单击。我将回调放在命令中的主要原因是能够在按钮触发时使用嵌入,如果我把它放在子类按钮或视图中,我就不能再这样做了。
所以这是我的全部问题,如果你知道一个更好的解决方法,包括使用嵌入并且只有成员可以按下按钮,请告诉我,我有一个多星期的时间试图解决这个问题,但我无法正确解决
-
我正是这样做的,但使用了一个名为
discord-ui的不同组件模块。逻辑应该非常相似,它的流程应该是这样的:发送嵌入,单击按钮,然后编辑消息以具有相同的嵌入和按钮,但是现在按钮设置为禁用,发送 embed2 -
更具体地说,一旦按下按钮,它应该将自身设置为禁用,然后编辑消息以发送完全相同的组件。因为您发送的是相同的组件并且按钮属性已更新,所以按钮应发送为禁用状态。如果您遇到问题,请确保为已编辑的消息传递正确的组件,因为很容易犯错误,即发送原始按钮的副本而不是更新的按钮。
-
如果要测试/练习的更简单的版本是在单击按钮后编辑消息,则根本没有按钮。所以它最终会成为原始嵌入。祝你好运!
-
如果我尝试编辑它,我会得到
This interaction has already been responded to before -
嗯,这很奇怪。同样,我不知道
disnake是如何工作的,但可能有一个简单的解决方法。您不必对交互进行两次响应。是否可以编辑消息并在同一响应中发送另一个嵌入?如果不是,则可以至少做其中一件事情,然后在交互之外再做另一件事情。但是,交互之外的那个必须放在一个条件中。
标签: python python-3.x disnake