如何在Discord.js中检测interaction.reply消息是否已删除?
解决Discord.js中检测交互回复消息是否被删除的方法
一、用fetchReply提前验证消息状态
每次要对交互回复做后续操作(比如编辑、删除)前,先尝试获取这条消息,失败且错误码为10008时,就说明消息已经被删除了:
async function isReplyAlive(interaction) { try { await interaction.fetchReply(); return true; } catch (err) { if (err.code === 10008) { // 对应"Unknown Message"错误 return false; } // 其他类型的错误按需处理,这里直接抛出 throw err; } } // 实际使用 if (await isReplyAlive(interaction)) { await interaction.editReply("更新后的回复内容"); } else { await interaction.followUp("之前的回复已被删除,这是新消息"); }
二、监听消息删除事件记录已删消息
在机器人启动时监听全局的messageDelete事件,把机器人发送的交互回复消息ID存起来,后续操作前直接查记录:
// 用Set存储已删除的机器人消息ID,查询效率高 const deletedBotMessages = new Set(); client.on('messageDelete', (msg) => { // 只记录机器人自己发的消息 if (msg.author.id === client.user.id) { deletedBotMessages.add(msg.id); } }); // 检查方法 async function checkIfReplyDeleted(interaction) { // 如果已经保存过回复的消息ID,直接查Set if (interaction.replied && interaction.message?.id) { return deletedBotMessages.has(interaction.message.id); } // 没保存过的话还是用fetchReply兜底 return !(await isReplyAlive(interaction)); }
三、操作时直接捕获错误兜底
要是不想提前做检查,也可以在执行editReply这类操作时直接捕获错误,针对性处理“Unknown Message”的情况:
try { await interaction.editReply("尝试更新回复"); } catch (err) { if (err.code === 10008) { // 消息已删,执行替代逻辑 await interaction.followUp("原回复已被删除,无法完成更新"); } else { // 其他错误正常抛出或处理 throw err; } }
内容的提问来源于stack exchange,提问作者Termin
相关产品推荐
相关产品推荐

