如何实现discord.py机器人监控新成员,在限定时间内触发处罚
实现新成员加入后限定时长内的警告监控方案
核心思路
- 用字典存储新成员的
用户ID与加入时间戳,监控期结束后自动移除条目以节省内存 - 成员加入时触发
on_member_join事件,记录其加入时间 - 执行警告命令时,先检查该成员是否处于监控期内,若满足条件则直接执行踢人处罚
- 监控时长可自定义,比如设置为1小时(3600秒)
代码实现示例
1. 初始化基础配置
import discord import time import asyncio from discord.ext import commands # 开启必要权限 intents = discord.Intents.default() intents.members = True intents.message_content = True bot = commands.Bot(command_prefix="!", intents=intents) # 存储新成员的监控数据:{用户ID: 加入时间戳} new_member_monitor = {} # 设定监控时长(单位:秒,这里为1小时) MONITOR_PERIOD = 3600
2. 成员加入事件处理
@bot.event async def on_member_join(member): # 记录成员加入时间 new_member_monitor[member.id] = time.time() # 可选:告知新成员监控规则 await member.send(f"欢迎加入服务器!加入后的{MONITOR_PERIOD//3600}小时内若被警告,将被直接踢出。") # 监控期结束后自动删除该成员的监控记录 await asyncio.sleep(MONITOR_PERIOD) if member.id in new_member_monitor: del new_member_monitor[member.id]
3. 修改警告命令,增加监控检查
假设你的原有警告命令为!warn,修改后如下:
@bot.command() @commands.has_permissions(kick_members=True) async def warn(ctx, member: discord.Member, *, reason=None): # 执行你已有的警告逻辑(比如记录警告到数据库/文件) # --- 这里插入你的原有警告代码 --- # 检查是否在监控期内 if member.id in new_member_monitor: elapsed_time = time.time() - new_member_monitor[member.id] if elapsed_time < MONITOR_PERIOD: # 执行踢人操作 await member.kick(reason=f"加入1小时内被警告:{reason or '无具体理由'}") await ctx.send(f"{member.mention} 因加入后1小时内违规被警告,已被踢出服务器。") # 踢人后移除监控记录,避免重复处理 del new_member_monitor[member.id] else: await ctx.send(f"{member.mention} 已过监控期,仅执行警告。") else: await ctx.send(f"{member.mention} 不在监控期内,仅执行警告。")
注意事项
- 必须确保机器人在开发者平台开启了
服务器成员特权意图,否则无法触发on_member_join事件 - 若需要持久化监控数据(避免机器人重启后丢失记录),可以将数据存储到SQLite等数据库中
- 可根据需求调整
MONITOR_PERIOD的数值,比如设为1800秒(30分钟) - 机器人需要拥有
踢人权限才能执行相应操作
内容的提问来源于stack exchange,提问作者Daddy Myers
相关产品推荐
相关产品推荐

