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

如何在discord.js中实现/jail命令为用户添加限时jailed角色?

解决Discord.js中/jail命令的限时角色移除问题

不用setInterval,改用setTimeout就能轻松处理每个用户的独立监禁任务——每个/jail调用会生成一个单独的延迟任务,无需手动跟踪多个用户。以下是完整实现方案:

核心思路

  1. 解析Slash命令的用户和时间参数,将天数转换为毫秒(setTimeout的时间单位)
  2. 为目标用户添加jailed角色
  3. 用setTimeout设置延迟,到期后自动移除角色
  4. 加入错误处理,避免用户离开服务器或角色不存在导致的报错

代码实现(Discord.js v14)

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

module.exports = {
  data: new SlashCommandBuilder()
    .setName('jail')
    .setDescription('将指定用户监禁设定天数')
    .addUserOption(option =>
      option.setName('username')
        .setDescription('目标用户')
        .setRequired(true))
    .addIntegerOption(option =>
      option.setName('time')
        .setDescription('监禁天数(最小1天)')
        .setRequired(true)
        .setMinValue(1)),
  async execute(interaction) {
    // 获取命令参数
    const targetUser = interaction.options.getUser('username');
    const jailDays = interaction.options.getInteger('time');
    const guild = interaction.guild;
    
    // 查找jailed角色
    const jailedRole = guild.roles.cache.find(role => role.name === 'jailed');
    if (!jailedRole) {
      return interaction.reply({ content: '服务器未创建名为「jailed」的角色,请先创建后再使用命令!', ephemeral: true });
    }

    // 获取服务器内的成员对象
    const member = guild.members.cache.get(targetUser.id);
    if (!member) {
      return interaction.reply({ content: '该用户不在当前服务器中!', ephemeral: true });
    }

    // 添加监禁角色
    await member.roles.add(jailedRole);
    await interaction.reply(`已将 ${targetUser.tag} 监禁 ${jailDays} 天`);

    // 计算延迟时间:天数 → 毫秒
    const delayMs = jailDays * 24 * 60 * 60 * 1000;

    // 设置定时解除任务
    setTimeout(async () => {
      try {
        // 检查用户是否仍在服务器、角色是否存在
        if (guild.members.cache.has(targetUser.id) && jailedRole) {
          await member.roles.remove(jailedRole);
          interaction.channel.send(`${targetUser.tag} 的监禁已到期,限制已解除`);
        }
      } catch (err) {
        console.error('解除监禁时发生错误:', err);
      }
    }, delayMs);
  },
};

额外注意事项

  • 权限问题:确保机器人拥有「管理角色」的权限,且jailed角色的位置在机器人角色之下,否则无法添加/移除角色
  • 持久化需求:如果机器人重启,未完成的setTimeout会全部丢失。若需要保留监禁状态,可以用数据库(如SQLite、MongoDB)存储用户ID、服务器ID、到期时间,机器人启动时遍历记录,计算剩余时间后重新设置setTimeout
  • 权限校验:可以添加仅管理员能使用此命令的逻辑,避免普通用户滥用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:57:04