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
相关产品推荐
相关产品推荐

