discord.py违禁词automod功能禁言触发计数器逻辑异常问题求助
问题原因
你的逻辑错误来自两个核心问题:
counter变量的作用域和赋值逻辑完全错误:你每次检测到违禁词时都会先执行counter = 0将变量重置为0,紧接着执行counter +=1,这就导致counter的值永远只能是1,没有任何累计效果。同时counter是on_message事件内的局部变量,每次事件触发都会生成新的局部变量,根本无法跨消息累计同一个用户的违禁次数。- 判断逻辑匹配错误:你当前用
if counter <3作为禁言触发条件,结合counter永远等于1的情况,自然第一次触发违禁词就会满足条件直接禁言;如果换成if counter>3,counter永远是1不可能大于3,自然永远不会触发。
修正方案
你需要先定义一个全局的字典结构存储每个用户的违禁次数,再调整计数、判断的逻辑顺序,修正后的参考代码如下:
import discord import datetime filtered_words = ["bad", "words", "here"] # 全局存储用户违禁次数,key为用户id,value为累计次数 user_violation_count = {} # 禁言阈值 MUTE_THRESHOLD = 3 # 日志频道ID,请替换为实际值 CHANNEL_ID_HERE = 123456789 @client.event async def on_message(message): # 跳过机器人自己发的消息,避免循环触发 if message.author.bot: return for word in filtered_words: if word in message.content.lower(): await message.delete() # 累计用户违禁次数 user_id = message.author.id if user_id not in user_violation_count: user_violation_count[user_id] = 0 user_violation_count[user_id] += 1 # 发送违规日志 embed = discord.Embed(color=0xff0000) embed.set_author(name="Banned Word") embed.add_field(name="Username:", value=f"{message.author.mention}", inline=False) embed.add_field(name="Banned Word:", value=f"{word}", inline=False) embed.add_field(name="Message:", value=f"{message.content}", inline=False) embed.add_field(name="累计违禁次数:", value=f"{user_violation_count[user_id]}", inline=False) embed.set_footer(text=f'User ID: {message.author.id}') embed.timestamp = datetime.datetime.utcnow() channel = client.get_channel(CHANNEL_ID_HERE) await channel.send(embed=embed) # 达到阈值触发禁言 if user_violation_count[user_id] >= MUTE_THRESHOLD: role = discord.utils.get(message.guild.roles, name="Muted") await message.channel.send(f'{message.author.mention} 因多次发送违禁内容被禁言') await message.author.add_roles(role) # 可选:禁言后重置该用户的计数 # user_violation_count[user_id] = 0 # 匹配到违禁词后直接跳出循环,避免同一条消息多个违禁词重复计数 break
内容的提问来源于stack exchange,提问作者user15229647
相关产品推荐
相关产品推荐

