discord.js机器人分配身份组后发送欢迎私信功能异常求助
问题原因
- 你最初写在
client.on("ready")里的代码不会生效:ready事件仅在机器人启动时触发一次,此时targetUsers变量未定义,自然无法发送指定用户的私信。 - 未处理异步逻辑:
member.roles.add()是异步Promise方法,需要等待执行完成后再执行后续私信逻辑,避免时序问题。 - 未做异常捕获:如果用户关闭了「允许来自服务器成员的私信」权限,调用发送私信接口会抛出异常,未捕获会导致机器人崩溃。
实现代码
直接修改你现有命令文件中的callback部分即可,修改后完整逻辑如下:
module.exports = { commands: 'giverole', expectedArgs: "<Target user's @> <The role name>", minArgs: 2, permissions: 'ADMINISTRATOR', callback: async (message, arguments) => { // 这里加上async标记函数为异步 const targetUsers = message.mentions.users.first() if (!targetUsers) { message.reply('Please specify someone to give a role to.') return } arguments.shift() const roleName = arguments.join(' ') const { guild } = message const role = guild.roles.cache.find((role) => { return role.name === roleName }) if (!role) { message.reply(`No existe un rol con el nombre"${roleName}"`) return } const member = guild.members.cache.get(targetUsers.id) try { // 等待身份组添加完成 await member.roles.add(role) message.reply(`Ese usuario ahora tiene el rol de ${roleName}`) console.log(`${targetUsers.id}`) // 直接发送私信,无需额外fetch用户 await targetUsers.send(`你好!你已经成功获得了${roleName}身份组,欢迎加入~`) } catch (err) { // 捕获错误:包括加角色失败、私信发送失败等情况 console.error('操作失败:', err) // 如果是私信发送失败,可以在频道提示 message.reply('身份组添加成功,但无法向该用户发送私信,用户可能关闭了陌生人私信权限。') } } }
注意事项
- 如果你的discord.js版本≥13,需要在开发者后台开启
Privileged Gateway Intents下的Message Content Intent和Direct Messages Intent,否则无法正常发送私信。 - 私信内容可以根据你的需求自定义修改。
内容的提问来源于stack exchange,提问作者Eliseo Baroni
相关产品推荐
相关产品推荐

