discord.js编写tempban临时封禁命令无报错无法运行如何解决
问题原因&修复方案
现存问题排查
- 成员获取逻辑错误:
message.mentions.first()是无效写法,Discord.js 中获取提及的服务器成员需要调用message.mentions.members.first(),你当前代码拿不到正确的成员对象会直接静默返回,无任何执行反馈。 - 权限写法适配错误:若使用 Discord.js v14 及以上版本,旧版权限枚举
Discord.Permissions.FLAGS.BAN_MEMBERS已经废弃,需替换为新写法。同时需确认机器人已开启Server Members Intent权限、在服务器内拥有「封禁成员」权限,且角色等级高于待封禁用户。 - 无效await语法:
setTimeout返回的是定时器ID而非Promise对象,前面加await没有任何作用,直接移除即可。 - 依赖缺失检查:你用到的
ms()时间转换方法需要单独安装ms包,若未导入该依赖,转换出的timer会是undefined,导致解封定时器不触发。 - 参数取值错误:常规命令调用格式为
!tempban @用户 时长,此时args索引0为命令名tempban,索引1为提及用户的字符串,索引2才是时长,你当前取args[1]作为时间会拿到无效值。
修正后代码
case 'tempban': // 权限校验(v14写法,v13及以下可换回你原来的写法) if(!message.member.permissions.has(Discord.PermissionsBitField.Flags.BanMembers)) return; const member = message.mentions.members.first() if(!member) return message.channel.send('请提及需要封禁的用户'); // 注意调整参数索引,如果你命令格式是!tempban 时长 @用户 就不用改 let time = args[2] if(!time) return message.channel.send('请填写封禁时长'); const ms = require('ms') // 可以提前在文件顶部导入 let timer = ms(time) if(isNaN(timer)) return message.channel.send('请输入正确的时长格式,如1d/1h/1m') await member.ban({reason: `User was banned by ${message.author.tag} for ${time}` }) message.channel.send('该用户已被临时封禁') // 去掉多余的await setTimeout(async function () { await message.guild.members.unban(member.id).catch(err => console.log('解封失败,用户可能已被手动解封', err)) }, timer) break;
补充说明
如果需要保证机器人重启后仍然能正确执行未到期的解封操作,需要把封禁记录和到期时间存在本地数据库/文件里,机器人启动时主动扫描到期的封禁记录执行解封,不要只依赖内存定时器,否则机器人重启后所有待执行的解封任务都会丢失。
内容的提问来源于stack exchange,提问作者I need Help
相关产品推荐
相关产品推荐

