Discord.js snipe指令无法正常执行问题排查,附对应实现代码片段
问题根因
- 核心逻辑错误:代码中
snipe指令的触发条件写反,if (!message.content.startsWith(${prefix}snipe))的判定逻辑为消息内容不以snipe指令开头时,才执行后续的snipe功能代码,直接导致用户发送snipe指令时不会触发对应逻辑。 - 版本兼容问题:如果你使用的是Discord.js v13及以上版本,还存在两个API不兼容问题:
- 旧版
message事件已被废弃,新版接收普通消息的事件名为messageCreate - 成员权限校验方法
hasPermission已被移除,新版对应方法为message.member.permissions.has()
- 旧版
- 前置逻辑缺失:代码中没有初始化
client.snipes集合、也没有监听messageDelete事件存储被撤回的消息,就算触发指令也无法获取到撤回的消息数据。
修复步骤
- 先补充前置的初始化和撤回消息存储逻辑,在客户端初始化后添加如下代码:
// 初始化存储撤回消息的Map集合 client.snipes = new Map(); // 监听消息撤回事件,存储被撤回的消息 client.on('messageDelete', message => { // 如需过滤机器人发送的消息可以添加判断:if (message.author.bot) return; client.snipes.set(message.channel.id, { content: message.content, author: message.author, image: message.attachments.first()?.proxyURL ?? null }); });
- 修正snipe指令的逻辑错误和版本兼容问题,修复后的指令代码如下:
// 注意:Discord.js v12及以下版本事件名仍使用message client.on("messageCreate", (message) => { // 过滤机器人消息和不带前缀的消息 if (message.author.bot || !message.content.startsWith(prefix)) return; let args = message.content.substring(prefix.length).split(" "); // 匹配snipe指令,删除原代码错误添加的取反符号 if (args[0] === 'snipe') { // 权限校验:Discord.js v12及以下版本改为 message.member.hasPermission("MANAGE_MESSAGES") if (!message.member.permissions.has("MANAGE_MESSAGES")) return message.channel.send(`you cant snipe`); const msg = client.snipes.get(message.channel.id); if (!msg) return message.channel.send(`nothing to snipe :(`); const SnipeEmbed = new Discord.MessageEmbed() .setAuthor(msg.author.tag, msg.author.displayAvatarURL()) .setDescription(msg.content) .setColor("RED") .setImage(msg.image); // 注意:Discord.js v13及以上版本发送嵌入必须放在embeds数组中 message.channel.send({ embeds: [SnipeEmbed] }); } });
内容的提问来源于stack exchange,提问作者Jdizzle_AC
相关产品推荐
相关产品推荐

