Discord.js踢人命令问题:无法拆分成员提及与原因参数
解决Discord.js Kick命令中成员提及与原因参数拆分问题
我懂你现在的困扰——你的kick命令能正确识别提及的成员,也能发送嵌入消息,但原因字段会把包括成员提及在内的所有参数都显示出来,对吧?这是因为你直接把整个args数组赋值给了reason,没有把提及部分从参数里剥离出来。咱们来修复这个问题:
问题分析
当前代码里const reason = args;会把所有命令参数(比如["<@123456789>", "刷屏骚扰"])直接当成原因,导致嵌入的Reason字段会显示成类似<@123456789> 刷屏骚扰,这显然不是你想要的效果。我们需要把args里对应成员提及的部分去掉,剩下的内容拼接成真正的踢人原因。
修复方案
我们可以通过过滤args数组,移除包含被提及成员ID的元素,再把剩下的元素拼接成字符串作为原因。如果没有提供原因,就默认显示“无原因提供”。
修改后的完整代码如下:
const Discord = require("discord.js"); module.exports = { name: "kick", guildOnly: true, nsfw: false, description: "Kick a member from the server with or without a reason.", execute(message, args) { if (!message.mentions.users.size) { return message.channel.send("You need to mention a member to kick."); } else { const member = message.mentions.members.first(); // 过滤掉args中包含成员ID的元素(也就是提及部分) const reasonArgs = args.filter(arg => !arg.includes(member.id)); // 将剩余参数拼接成字符串,没有原因则显示默认文本 const reason = reasonArgs.join(' ') || "No reason provided"; const kickEmbed = new Discord.RichEmbed() .setColor("#ff00ea") .setAuthor("User Kicked") .setDescription(`${member.displayName} was removed from the server.`) .addField("Assigned by", message.author.username, true) .addField("Reason", reason, true); member.kick(reason); message.channel.send(kickEmbed); message.react("") } } };
关键修改说明
- 过滤提及参数:
reasonArgs = args.filter(arg => !arg.includes(member.id))—— 因为Discord的成员提及格式(<@用户ID>或<@!用户ID>)里都会包含用户的ID,所以用includes(member.id)就能精准定位并移除这些提及元素。 - 拼接原因文本:
reasonArgs.join(' ')—— 把剩下的参数数组转成空格分隔的字符串,这样多词的原因(比如“刷屏骚扰”)就能正常显示。 - 默认原因处理:
|| "No reason provided"—— 如果用户没有输入原因,就显示默认文本,避免Reason字段为空。
现在测试一下:当你输入!kick @TestUser 违反服务器规则,嵌入的Reason字段就只会显示“违反服务器规则”,而不会带上@TestUser的提及内容啦。
内容的提问来源于stack exchange,提问作者user9840885
相关产品推荐
相关产品推荐

