Discord.py开发求助:用户信息接收、类生成及命令前缀失效问题
问题修复与代码调整
核心问题分析
你的代码同时初始化了discord.Client和commands.Bot两个实例,这直接导致命令前缀(command_prefix)失效——因为Bot的命令系统和Client的事件处理相互冲突,而且你最后启动的是Client实例,Bot根本没在运行。另外,把命令函数嵌套在on_message里也是错误写法,Discord.py的命令系统不会识别这种定义。
调整后的完整代码
import discord from discord.ext import commands import char # 你的类文件 # 只初始化Bot实例即可,Bot继承自Client,无需单独创建Client intents = discord.Intents.all() bot = commands.Bot(command_prefix='!', intents=intents) # 用字典存储创建的类实例,比globals更安全易管理 char_instances = {} char_num = 0 @bot.event async def on_ready(): await bot.change_presence(status=discord.Status.online, activity=discord.Game("Game")) print(f"已登录为 {bot.user}") @bot.event async def on_message(message): # 先处理自定义消息逻辑 if message.content == "test": await message.channel.send(f"{message.author} | {message.author.mention}, Hello") await message.author.send(f"{message.author} | {message.author.mention}, User, Hello") if message.content == "!help": await message.channel.send("hello, I'm bot 0.0.1 Alpha") # 必须添加这句,否则Bot的命令系统无法解析用户输入的命令 await bot.process_commands(message) @bot.command(name="make") async def create_char(ctx, name: str, data: str): global char_num # 创建char类实例并存入字典 char_instances[f"char_{char_num}"] = char(name=name, Sffter=data, username=ctx.author.name) char_num += 1 await ctx.send(f"done, {name}!") # 替换为你的Bot令牌后运行 bot.run('你的BotToken')
关键调整点
- 移除冗余的Client实例:只保留
commands.Bot,所有事件和命令都绑定到Bot上,最后用bot.run()启动。 - 修正命令定义方式:用
@bot.command()装饰器定义!make命令,参数直接对应用户输入的[name]和[data]。 - 处理消息与命令的优先级:在
on_message末尾加上await bot.process_commands(message),确保自定义消息处理完成后,Bot能正常解析命令。 - 安全存储实例:用字典
char_instances替代globals(),避免污染全局命名空间,后续管理实例也更方便。 - 修复字符串格式化错误:改用f-string简化写法,同时修正了
send方法的参数错误(不能传多个独立字符串,需合并为一个)。
额外注意事项
- 确保你的
char.py中类的参数定义和代码调用匹配(比如Sffter参数是否存在)。 - 替换代码中的
'你的BotToken'为你实际的Discord Bot令牌。 - 如果需要接收带空格的
data参数,可以把最后一个参数改为*data,这样能将多个单词合并为一个参数接收。
内容的提问来源于stack exchange,提问作者Rein
相关产品推荐
相关产品推荐

