You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:24:04