前缀和非前缀命令在 python discord bot 上不能一起工作
- 作者: 嗯再见没见过
- 来源: 51数据库
- 2023-02-10
问题描述
import asyncio import discord from discord.ext import commands from discord.ext.commands import Bot import chalk bot = commands.Bot(command_prefix='!') @bot.event async def on_ready(): await bot.change_presence(game=discord.Game(name='Test')) print("All systems online and working " + bot.user.name) await bot.send_message(discord.Object(id=386518608550952965), "All systems online and working") @bot.command(pass_context=True) async def hel(ctx): await bot.say("A help message is sent to user") @bot.command async def on_message(message): if message.content.startswith("ping"): await bot.send_message(message.channel, "Pong") bot.run("TOKEN", bot=True)
我试图在我的 discord 测试服务器上完成这项工作,但是当我像这样使用它时,只有第一个on_ready"和 !hel 命令有效,ping 不打印任何内容,但是当我删除 !hel命令代码部分,ping 有效,有什么方法可以让它们一起工作吗?
I'm trying to get this work on my discord test server but when I use it like this, only the first "on_ready" and !hel command works, ping doesn't print anything, but when I delete the !hel commands code part, ping works, is there any way that I can make them work together?
推荐答案
使用on_message
Change @bot.command to @bot.event when using on_message
在使用on_message时添加bot.process_commands
为什么 on_message 会让我的命令停止工作?
覆盖默认提供的 on_message 会禁止运行任何额外的命令.要解决此问题,请在 on_message 末尾添加 bot.process_commands(message) 行.例如:
Overriding the default provided on_message forbids any extra commands from running. To fix this, add a bot.process_commands(message) line at the end of your on_message. For example:
@bot.event async def on_message(message): # do some extra stuff here await bot.process_commands(message)
http://discordpy.readthedocs.io/en/latest/faq.html#why-does-on-message-make-my-commands-stop-working
您的代码应如下所示:
import asyncio import discord from discord.ext import commands from discord.ext.commands import Bot import chalk bot = commands.Bot(command_prefix='!') @bot.event async def on_ready(): await bot.change_presence(game=discord.Game(name='Test')) print("All systems online and working " + bot.user.name) await bot.send_message(discord.Object(id=386518608550952965), "All systems online and working") @bot.command(pass_context=True) async def hel(ctx): await bot.say("A help message is sent to user") @bot.event async def on_message(message): if message.content.startswith("ping"): await bot.send_message(message.channel, "Pong") await bot.process_commands(message) bot.run("TOKEN", bot=True)