添加违规消息删除功能后Discord.py前缀命令失效求助
问题原因与修复方案
嘿,我帮你找到了问题所在!你遇到的命令失效问题,主要是因为自定义on_message事件时的两个关键错误:
1. on_message定义错误
你现在的on_message函数没有用@client.event装饰器,而且参数顺序搞反了(应该只有message参数,不是ctx, message),导致这个事件根本没被正确注册。
2. 未手动处理命令
当你自定义on_message事件后,discord.py默认不会再自动处理前缀命令了,必须在事件函数末尾手动调用await client.process_commands(message),这样机器人才能在处理完消息检测后继续响应你的.ping、.shefe等命令。
另外,你当前的违规词检测逻辑也有小问题——它只会删除完全等于违规词的消息,比如只有用户单独发"fuck"才会被删,如果消息里包含违规词(比如"what the fuck")就不会触发删除。我也帮你修正了这个逻辑。
修改后的完整代码
import discord import random from discord.ext import commands from discord.ext.commands import Bot bot_prefix = "." client = commands.Bot(command_prefix=bot_prefix, case_insensitive=True) ban_words = ['fuck', 'shit'] @client.event async def on_ready(): print("Shefkata e spremen") @client.event # 加上这个装饰器,正确注册事件 async def on_message(message): # 参数只保留message # 修正检测逻辑:检查消息中是否包含任何违规词 if any(word in message.content.lower() for word in ban_words): await message.delete() # 必须加上这行,让机器人处理前缀命令 await client.process_commands(message) @client.command(pass_context=True, case_insensitive=True) async def ping(ctx): await ctx.send(f'pong {round(client.latency * 1000)}ms') @client.command(pass_context=True, case_insensitive=True) async def shefe(ctx): await ctx.send("Sho sakash kopile") @client.command(pass_context=True, case_insensitive=True) async def zdravo(ctx): pozdravi = ["Zdravo", "Kaj si be", "Zdravo sinka"] await ctx.send(f'{random.choice(pozdravi)}') @client.command(pass_context=True, aliases=['8ball'], case_insensitive=True) async def _8ball(ctx, *, question): responses = ["It is certain.", "It is decidedly so.", "Without a doubt."] await ctx.send(f'Question: {question}\nAnswer: {random.choice(responses)}') @client.command(pass_context=True, case_insensitive=True) async def dabs(ctx): broj = random.randint(0, 1000) if broj == 666: await ctx.send("JA PRONAJDE NAJRETKATA PORAKA\nIMASHE 0.1% SHANSA DA TI SE PADNI") await ctx.send("https://imgur.com/poI3bZl") broj = random.randint(0, 100) if broj == 69: await ctx.send("https://imgur.com/OOgEaLb") else: await ctx.send("https://imgur.com/RFlt0bz") @client.command(pass_context=True, case_insensitive=True) async def commands(ctx): await ctx.send(".ping\n.shefe\n.zdravo\n.8ball\n.dabs") client.run('token')
关键修改点说明
- 给
on_message添加@client.event装饰器,确保事件被正确触发 - 调整
on_message的参数为message(这是discord.py事件的标准参数) - 改进违规词检测逻辑,使用
any()函数判断消息中是否包含任何违规词 - 在
on_message末尾添加await client.process_commands(message),让机器人继续处理前缀命令
这样修改后,你的机器人既能检测并删除违规消息,又能正常响应所有前缀命令啦!
内容的提问来源于stack exchange,提问作者Don_Tofu




