Discord.JS v13 频道消息关键词搜索命令逻辑异常排查
问题排查结论
代码始终进入else分支的核心原因是判断逻辑写错:messages.filter() 执行后返回的是Discord.js的Collection数据结构,哪怕没有匹配到任何符合条件的消息,这个Collection对象本身也是真值,因此!positive的判断永远不成立,逻辑永远走到else分支。
需修正的逻辑点
- 不能直接判断filter返回的Collection对象是否为假,要通过Collection的
size属性判断匹配到的消息数量,size === 0才代表没有匹配到任何封禁记录 - 补充目标频道有效性校验:避免频道ID填错、机器人无频道访问权限时直接抛出未捕获错误
- 匹配逻辑统一转小写处理:避免因消息内容、查询关键词的大小写差异导致漏匹配
- 可按需调整
fetch的limit参数:当前仅拉取频道最近30条消息,若封禁记录超过30条会出现漏判,需要全量检索可做分页拉取
修复后可运行代码
const Discord = require('discord.js'); const ms = require('ms'); const { Permissions } = require("discord.js"); const { MessageEmbed } = require("discord.js"); module.exports = { name: 'check', category: "Moderation", description: 'Checkt ob ein User gebannt ist', run: async(client,message,args,guild) => { const arg = message.content.split(" ") const banlist = client.channels.cache.get('替换为你的封禁频道实际ID') const check = arg[1] message.delete().catch(err => console.error(err)); if (!check) { return message.channel.send({content :"Please specify a user to check!"}) .then(msg => setTimeout(() => msg.delete(), 10000)) .catch(err => console.error(err)); } // 校验频道是否存在、是否为文本频道 if (!banlist || !banlist.isText()) { return message.channel.send({content: "封禁记录频道配置异常,请联系管理员排查"}) .then(msg => setTimeout(() => msg.delete(), 10000)) .catch(err => console.error(err)); } banlist.messages.fetch({limit : 100}).then(messages => { // 统一转小写做不区分大小写的匹配 const positive = messages.filter(msgs => msgs.content.toLowerCase().includes(check.toLowerCase())) if(positive.size === 0) { message.channel.send({content :"This user is not banned!"}) .then(msg => setTimeout(() => msg.delete(), 10000)) .catch(err => console.error(err)); } else { message.channel.send({content :`This user is banned.`}) .then(msg => setTimeout(() => msg.delete(), 10000)) .catch(err => console.error(err)); } }).catch(err => { console.error("拉取封禁记录失败:", err); message.channel.send({content: "拉取封禁记录失败,请检查机器人权限"}) .then(msg => setTimeout(() => msg.delete(), 10000)) .catch(e => console.error(e)); }) } };
注:代码中将拉取消息的上限调整到了100条,可根据你的服务器实际封禁记录数量自行修改数值,如果需要检索更早的历史消息,需要额外实现消息分页拉取逻辑。
内容的提问来源于stack exchange,提问作者DerZm3zl
相关产品推荐
相关产品推荐

