如何让Discord机器人在封禁用户时向对方发送DM通知
问题原因分析
- 重复执行了两次封禁操作:你在
user.send()的.then()回调和后续独立的if (member)分支里各执行了一次member.ban(),后者会不等DM发送完成就提前封禁用户,导致用户还没收到通知就被移出服务器,自然无法收到DM - 消息内容存在拼写错误:
You we're应当修正为You were - 封禁原因参数不一致:第一次封禁传的是固定值
BANNED!,没有使用你自定义的reason变量
修正后代码
exports.run = (client, message, args) => { // 校验操作人权限 if (!message.member.hasPermission('BAN_MEMBERS')) { return message.reply('你没有封禁成员的权限!') } const user = message.mentions.users.first(); // 校验是否提及了目标用户 if (!user) { return message.reply("你没有指定要封禁的用户!"); } const member = message.guild.member(user); // 校验用户是否在当前服务器 if (!member) { return message.reply("该用户不在本服务器内!"); } // 处理封禁原因 let reason = args.slice(1).join(' '); if (!reason) reason = "未提供封禁原因"; // 先发DM 再执行封禁 user.send(`你已被封禁出服务器 **__${message.guild.name}__**,封禁原因:**__${reason}__**`) .catch(() => message.reply("无法向该用户发送私信通知")) // 无论DM是否发送成功,都执行封禁操作 .finally(() => { member.ban({ reason: reason }) .then(() => { message.reply(`已成功封禁用户 **__${user.tag}__**,封禁原因:**__${reason}__**`); }) .catch(err => { message.reply('无法封禁该用户'); console.error(err); }); }) }
逻辑说明
- 前置校验全部提前,通过return终止后续逻辑,避免代码嵌套层级过深
- 使用
.finally()保证不管DM是否发送成功,都会执行封禁操作,不会因为用户关闭了陌生人DM权限就无法完成封禁 - 移除了重复的封禁逻辑,确保只有DM操作完成后才会执行封禁,避免用户提前被移出服务器导致DM发送失败
- 所有提示内容已替换为中文,你可以根据需求自行修改对应字符串
内容的提问来源于stack exchange,提问作者Bubu Vuvuv
相关产品推荐
相关产品推荐

