我有一个简单的游戏在disnake发布消息时,一个频道播放。在消息的末尾,我想添加一个“再次播放”按钮。游戏最初是由斜杠命令开始的。当单击“再次播放”按钮时,我希望机器人调用重新启动游戏的斜杠命令。这个是可能的吗?
在discord.py中,调用常规命令非常简单,如下所示:
await ctx.invoke(self.bot.get_command('my_command'))但是,MessageInteraction对象没有“调用”方法,也就是说,以下内容无法工作:
await interaction.invoke(self.bot.get_command('my_slash_command'))编辑:我想最明显的解决方法是将整个游戏打包成一个函数,然后在斜杠命令和按钮回调中调用相同的函数(以避免重复代码)。这是否一个更好的方法来实现这一点?一般来说,交互处理应该总是封装在函数中吗?
发布于 2022-07-21 01:23:39
解释
ctx.invoke所做的就是调用命令的函数,就好像它是一个常规函数一样。例如,await ctx.invoke(self.bot.get_command("my_command"))实际上与我的await my_command(ctx)相同(如果定义命令时,它的回调是一个具有相同名称的函数,并且该函数在作用域中)。
因此,我们可以对交互和bot.get_slash_command做同样的事情。
代码
@bot.slash_command(description="print button")
async def print_button(interaction):
await interaction.send("gaming", components=[disnake.ui.Button(label="Play again")])
await bot.wait_for("button_click", check=lambda i: (i.component and i.component.label == "Play again"))
await bot.get_slash_command("print_button").callback(interaction)https://stackoverflow.com/questions/73057373
复制相似问题