You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

添加违规消息删除功能后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

火山引擎 最新活动