强制不和谐显示失败的交互消息

Posted

技术标签:

【中文标题】强制不和谐显示失败的交互消息【英文标题】:Force discord to display failed interaction message 【发布时间】:2021-09-08 07:40:17 【问题描述】:

如果应用程序未能在 3 秒内响应交互,Discord 将自动超时并触发自定义“此交互失败”消息。

不过,我正在运行一些稍长的任务,因此我调用了 ctx.defer() 方法,这让我有更多时间做出响应并显示“ is thinking...”动画不和谐。

如果我的任务引发一些内部异常,我想手动触发“此交互失败”消息。 discord API 是否公开了这样做的方法?

我试图触发的消息

一个虚拟的例子,使用discord-py-slash-command:

import discord
from discord.ext import commands
from discord_slash import SlashCommand, SlashContext

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())
slash = SlashCommand(bot)

@slash.slash(name="test")
async def _test(ctx: SlashContext):
    await ctx.defer()
    try:
        assert 1==2
    except AssertionError:
        # Somehow trigger the error message

bot.run("discord_token")

【问题讨论】:

【参考方案1】:

文档指出,延迟消息将允许在最多 15 分钟内更新消息。没有故意让交互提前失败的方法,但是您可以尝试故意发送无效/损坏的响应,看看这是否会使挂起的交互无效。

然而,这远非良好做法,而且在 discord-py-slash-command 库的实施限制内是不可能的。

我建议手动调用错误响应以向用户显示更好的错误响应。失败的交互可能有很多原因,从错误的代码到您的服务完全不可用,并且对用户没有真正的帮助。

预期错误

您可以简单地使用隐藏的用户消息进行响应。

ctx.send('error description', hidden=True)
return

为此,您必须首先将消息推迟到隐藏阶段以及ctx.defer(hidden=True)。如果您希望服务器上的所有用户都能看到最终答案,您可以在顶部发送一条普通消息 (ctx.channel.send),也可以使用“普通”延迟将错误消息显示为公共消息.

意外错误

为了捕捉意外错误,我建议收听on_slash_command_error 事件处理程序。

@client.event
async def on_slash_command_error(ctx, error):

    if isinstance(error, discord.ext.commands.errors.MissingPermissions):
        await ctx.send('You do not have permission to execute this command', hidden=True)

    else:
       await ctx.send('An unexpected error occured. Please contact the bot developer', hidden=True)
       raise error  # this will show some debug print in the console, when debugging

请注意,只有在之前的 defer 被称为 ctx.defer(hidden=True) 时,才会隐藏响应。如果使用了ctx.defer(),则执行不会失败,并且会在控制台打印警告。

这样,调用方法可以通过选择相应的defer 参数来决定是否所有用户都可以看到意外错误。

discord-py-slash-command 文档中关于延迟的部分:https://discord-py-slash-command.readthedocs.io/en/stable/quickstart.html

【讨论】:

以上是关于强制不和谐显示失败的交互消息的主要内容,如果未能解决你的问题,请参考以下文章

不和谐用户加入时不显示欢迎消息

两个异步对象交互

有没有一种简单的方法可以同步发送一条消息到不和谐?

检测更新消息失败

我正在尝试让我的不和谐 webhook 使用按钮发送消息

有没有办法使用消息 ID 编辑特定消息。不和谐