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

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("")
 }
 }
};

关键修改说明

  1. 过滤提及参数:reasonArgs = args.filter(arg => !arg.includes(member.id)) —— 因为Discord的成员提及格式(<@用户ID>或<@!用户ID>)里都会包含用户的ID,所以用includes(member.id)就能精准定位并移除这些提及元素。
  2. 拼接原因文本:reasonArgs.join(' ') —— 把剩下的参数数组转成空格分隔的字符串,这样多词的原因(比如“刷屏骚扰”)就能正常显示。
  3. 默认原因处理:|| "No reason provided" —— 如果用户没有输入原因,就显示默认文本,避免Reason字段为空。

现在测试一下:当你输入!kick @TestUser 违反服务器规则,嵌入的Reason字段就只会显示“违反服务器规则”,而不会带上@TestUser的提及内容啦。

内容的提问来源于stack exchange,提问作者user9840885

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:30:10