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

Discord.js v13:斜杠命令中如何获取提及用户并实现踢人?

Discord.js v13 斜杠命令踢人功能修复方案

你的代码存在几个关键错误,导致出现「User not found」和函数调用无效的问题,以下是修正后的完整代码及问题解析:

修正后的代码

const { SlashCommandBuilder } = require('discord.js');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('tkick')
    .setDescription('Kicks the specified user (Moderation)')
    // 改用addUserOption,因为踢人仅针对用户,避免选到角色
    .addUserOption((option) =>
      option
        .setName('user')
        .setDescription('The user to be kicked')
        .setRequired(true),
    ),

  async execute(interaction, client) {
    // 检查命令调用者的权限
    if (!interaction.member.permissions.has('KICK_MEMBERS')) {
      return interaction.reply({ content: '你没有使用该命令的权限。', ephemeral: true });
    }

    // 从命令选项中获取目标用户,再转为服务器成员实例
    const targetUser = interaction.options.getUser('user');
    const targetMember = await interaction.guild.members.fetch(targetUser.id);

    if (!targetMember) {
      return interaction.reply({ content: '找不到该用户。', ephemeral: true });
    }

    // 检查机器人自身是否有踢人权限
    if (!interaction.guild.members.me.permissions.has('KICK_MEMBERS')) {
      return interaction.reply({ content: '我没有踢人权限,请先给我分配对应权限。', ephemeral: true });
    }

    // 检查目标用户角色层级是否高于机器人,避免无法踢人
    if (targetMember.roles.highest.position >= interaction.guild.members.me.roles.highest.position) {
      return interaction.reply({ content: '我无法踢掉角色层级比我高的用户。', ephemeral: true });
    }

    // 执行踢人并处理异常
    try {
      await targetMember.kick('被管理员通过tkick命令踢出');
      await interaction.reply({ content: `已成功踢出用户 ${targetUser.tag}。` });
    } catch (err) {
      console.error(err);
      await interaction.reply({ content: '踢人操作失败,请查看日志排查问题。', ephemeral: true });
    }
  },
};

关键问题解析

  1. 错误获取目标用户
    原代码用interaction.user获取的是当前调用命令的用户,而非选项中指定的目标用户,正确方式是用interaction.options.getUser('user')从命令选项中提取目标用户。

  2. 语法与方法调用错误
    原代码interaction.option.('user').kick()是语法错误,而且kick()是服务器成员(GuildMember)的方法,不能直接调用在用户(User)对象上,必须先通过interaction.guild.members.fetch()将用户转为服务器成员实例。

  3. 选项类型不合理
    原代码用addMentionableOption会允许选择角色,但踢人只针对用户,改用addUserOption可以直接限定选项为用户,避免无效输入。

  4. 缺少边界检查
    新增了机器人权限检查、目标用户角色层级检查,以及异常捕获,避免因权限不足或特殊用户(如服务器所有者)导致的操作失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:00:53