Discord.py Auto-Filter命令新增累计3次违规禁言1小时功能问询
Discord.py 违禁词计数禁言功能实现方案
注:你现有代码中的
on_message事件参数有误,discord.py的on_message事件原生仅接收message单个参数,不需要传入ctx,会直接影响功能运行,以下方案会同步修正该问题。
实现步骤
- 第一步:新增全局计数变量,用字典存储用户ID和对应的违禁次数,以下为内存存储方案(机器人重启后计数会重置,如需持久化可自行接入本地文件/数据库):
# 在原badwords全局变量定义代码下方新增 global violation_counts violation_counts = {} # 键为用户ID,值为违规次数
- 第二步:修改
on_message事件逻辑,新增计数判断和超时禁言逻辑,调用discord.py内置的timeout功能实现1小时禁言:
# 需提前导入datetime包处理时间 import datetime async def on_message(message): # 忽略机器人自身发送的消息,避免循环触发 if message.author.bot: return msg = message.content has_badword = False # 检测违禁词 for word in badwords: if word in msg: has_badword = True break if has_badword: await message.delete() user_id = message.author.id # 更新违规次数 if user_id in violation_counts: violation_counts[user_id] += 1 else: violation_counts[user_id] = 1 current_count = violation_counts[user_id] # 发送违规提示 await message.channel.send(f"{message.author.mention} 请勿使用违禁词!当前已累计违规{current_count}次,累计3次将被禁言1小时。") # 达到3次触发禁言 if current_count >= 3: try: # 禁言1小时,适配discord.py v2.x及以上版本 await message.author.timeout(datetime.timedelta(hours=1), reason="累计3次发送违禁内容") await message.channel.send(f"{message.author.mention} 因累计3次发送违禁内容,已被禁言1小时。") # 禁言后重置该用户的违规计数,可根据需求调整 violation_counts[user_id] = 0 except: await message.channel.send(f"无法禁言用户{message.author.mention},可能是机器人权限不足。") # 注意此处替换为你自己定义的机器人实例名,如实例定义为client则改成client.process_commands await bot.process_commands(message)
注意事项
- 机器人需要开启
Moderate Members权限,同时机器人的角色排序要高于被禁言用户的角色,才能成功触发禁言操作 - 如使用discord.py v1.x旧版本,没有内置
timeout方法,可自行升级库版本,或者替换为临时封禁逻辑实现
内容的提问来源于stack exchange,提问作者Exotic
相关产品推荐
相关产品推荐

