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

Discord.js 实现计时器到期后自动封禁或踢出用户功能咨询

Discord.js 定时用户惩罚功能实现方案

前置准备

  • 确保你的机器人已经开启了Server Members Intent、Guilds Intent,否则无法获取用户信息、执行成员操作。
  • 安装依赖:如果需要持久化存储可以用better-sqlite3,定时任务可以用node-schedule,也可以直接用原生setTimeout实现。

核心实现步骤

  • 权限校验:管理员触发设置规则指令时,先校验操作者是否拥有对应操作权限,示例代码:
    if (!interaction.member.permissions.has([PermissionFlagsBits.BanMembers, PermissionFlagsBits.KickMembers, PermissionFlagsBits.ManageRoles])) return interaction.reply({content: "无权限执行该操作", ephemeral: true})
  • 规则持久化存储:所有计时规则必须存入磁盘(数据库/JSON文件),不要仅存在内存中,避免机器人重启后计时失效。存储字段至少包含:服务器ID、目标用户ID、到期时间戳、执行动作类型、规则备注。
  • 定时器注册:
    1. 机器人启动时扫描所有未执行的规则,计算当前时间和到期时间的差值,差值为正的用setTimeout注册到期执行逻辑,差值为负的直接执行对应惩罚动作。
    2. 新增规则时除了写入存储,同时注册对应setTimeout任务。

各惩罚动作实现代码

  • 踢出用户:
    await interaction.guild.members.kick(目标用户ID, "定时惩罚到期:" + 规则备注)
  • 封禁用户:
    await interaction.guild.members.ban(目标用户ID, {reason: "定时惩罚到期:" + 规则备注, deleteMessageSeconds: 0})
  • 收回全服务器查看权限:
// 遍历服务器所有频道,覆盖目标用户的查看权限
interaction.guild.channels.cache.forEach(async (channel) => {
  await channel.permissionOverwrites.edit(目标用户ID, {
    ViewChannel: false
  }, {reason: "定时惩罚到期:收回全部查看权限"})
})

常见问题解决

  • 执行惩罚时提示权限不足:确保机器人的角色层级高于目标用户的角色层级,同时机器人自身拥有对应操作的权限(踢人、封禁、管理频道权限)。
  • 计时时间出现偏差:所有时间统一用UTC时间戳存储和计算,避免时区问题导致的计时错误。
  • 用户离开服务器后规则失效:存储规则时增加状态标记,检测到目标用户不在服务器时,标记规则为待执行,用户再次加入服务器时直接触发对应惩罚动作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:36:02