实现机器人删除指定消息数:如何检查上一条机器人消息是否存在?
解决Discord机器人消息检查与批量删除的问题
嘿,我明白你的需求了——你想让机器人根据频道内是否存在自己之前发送的消息,来决定删除1条还是2条消息,对吧?咱们一步步把这个逻辑捋顺:
核心思路
首先,我们可以先获取频道内最近的两条消息,然后检查**用户指令消息的上一条(也就是倒数第二条消息)**是否是你的机器人发送的。毕竟当用户发送指令时,这条指令消息是当前频道最新的内容,如果机器人之前发过消息,那它肯定是紧随指令消息之前的那一条。
修改后的代码实现
// 获取频道内最近2条消息,默认按「最新到最旧」排序 const fetched = await message.channel.fetchMessages({ limit: 2 }); // 把消息集合转换成数组,方便按顺序操作 const messagesList = Array.from(fetched.values()); // 初始化待删除的消息数组,默认包含用户的指令消息 const messagesToDelete = [messagesList[0]]; // 检查是否存在第二条消息,且该消息由机器人自身发送 if (messagesList.length > 1 && messagesList[1].author.id === message.client.user.id) { messagesToDelete.push(messagesList[1]); } // 批量删除目标消息 message.channel.bulkDelete(messagesToDelete) .catch(error => message.reply(`There was an error: ${error}`)); // 发送新的提示消息 message.channel.send("```Open```");
代码细节说明
- 先获取2条消息是为了同时覆盖「机器人之前发过消息」和「没发过消息」两种情况,避免写两次重复的fetch逻辑;
messagesList[0]是用户刚发送的指令消息,messagesList[1]是频道内上一条消息(如果存在);- 通过对比消息作者ID和机器人自身ID,能精准判断这条消息是不是机器人发的,不会误删其他用户的内容;
- 另外要注意:
bulkDelete默认只能删除14天以内的消息,如果需要删除更旧的内容,要加上{ filterOld: false }参数,这需要机器人拥有管理员权限才行。
内容的提问来源于stack exchange,提问作者CosmicLazuli
相关产品推荐
相关产品推荐

