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、到期时间戳、执行动作类型、规则备注。
- 定时器注册:
- 机器人启动时扫描所有未执行的规则,计算当前时间和到期时间的差值,差值为正的用
setTimeout注册到期执行逻辑,差值为负的直接执行对应惩罚动作。 - 新增规则时除了写入存储,同时注册对应
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
相关产品推荐
相关产品推荐

