You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDA开发Destiny2 Discord Raidbot:Embed发送正常却显示应用未响应

Discord Destiny2 Raidbot 命令响应问题:Embed发送成功但显示“应用未响应”

问题概述

开发Discord平台的Destiny2 Raidbot时,输入/命令后,Embed消息能正常发送至频道,但用户端会弹出“应用未响应”的提示,需要解决该问题,同时保留提取机器人发送消息的messageId并存入postMap的逻辑。

当前核心代码

event.getChannel().sendMessageEmbeds(mb) // Mb是创建的简单MessageEmbed
        .setActionRow(List.of(          // 此处原本包含一些按钮组件
        )).queue(message -> {   // 提取机器人刚创建消息的messageId
            String messageId = message.getId();
            postMap.put(messageId, new Post(event.getUser().getId(), raid.getPlayerCount()));   // 将messageId存入map供后续使用
        }
);

补充代码结构(SlashHandler)

public Listener(List<Slash> slashList) {
    slashList.forEach(v -> SLASHMAP.put(v.getName(), v));
}
@Override
public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {
    SLASHMAP.get(event.getName()).onSlashCommandEvent(event, POSTMAP);
}

已尝试的解决方法

  • 使用event.replyEmbeds():能解决“应用未响应”问题,但无法方便提取发送后的messageId
  • 尝试hook()和deferReply():未找到正确使用方式,不清楚后续如何处理回复内容

解决方案

问题根源在于Slash命令要求Discord应用在3秒内完成交互响应,直接调用event.getChannel().sendMessageEmbeds()属于绕过交互回复机制的操作,Discord会判定应用未完成响应从而弹出提示。正确做法是使用交互的延迟回复+Webhook发送逻辑,既满足响应要求,又能提取messageId:

// 先发送延迟回复,告知Discord应用已接收请求,避免“未响应”提示
event.deferReply().setEphemeral(false).queue(hook -> {
    // 通过Webhook发送实际的Embed和按钮组件
    hook.sendMessageEmbeds(mb)
        .setActionRow(List.of(/* 你的按钮组件 */))
        .queue(message -> {
            String messageId = message.getId();
            postMap.put(messageId, new Post(event.getUser().getId(), raid.getPlayerCount()));
        });
});

说明

  • deferReply()会先发送一个临时的“正在处理”响应(可通过setEphemeral(true)设置为仅命令发起者可见),确保Discord在3秒内收到响应,消除“应用未响应”提示
  • 通过hook发送的消息属于交互回复的一部分,后续可以正常提取messageId存入postMap,完全满足原有业务逻辑

内容的提问来源于stack exchange,提问作者justLoboKuki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:22:54