discord.py报错Ctx为必填缺失参数 同组子命令部分失效问题咨询
问题修复点
make c子命令无法运行的核心原因:错误调用了ctx.create_category_channel()方法,ctx上下文对象本身不提供创建分类频道的方法,该方法属于Guild对象,应改为await ctx.guild.create_category_channel(name=name)- 所有子命令
else分支的ctx.send()都缺少await关键字,discord.py 中所有异步消息发送方法都需要添加await才会执行,否则会抛出协程未等待的警告,方法也不会实际运行 make n子命令装饰器参数拼写错误:pass_contex应为pass_context,缺少末尾的t字符- 接收
category参数的子命令(t、v、n)未做参数转换:create_text_channel/create_voice_channel的category参数要求传入实际的Category对象,而非字符串名称,如果你需要支持传入分类名称,需要提前通过discord.utils.get(ctx.guild.categories, name=category)转换为对应对象再传入 make v子命令存在变量名不匹配问题:你定义的变量名为channel,但判断条件写的是if existing_channel is None,运行会抛出NameError
修复后完整代码
import discord from discord.ext import commands from datetime import datetime # 此处省略Cog类定义部分 @commands.group() async def make(self, ctx): """make channel c,t,v,n [name]""" if ctx.invoked_subcommand is None: await ctx.send('Invalid sub command passed...') @make.command(pass_context=True, aliases=['category']) async def c(self, ctx, name): """create Category""" existing_category = discord.utils.get(ctx.guild.categories, name=name) if existing_category is None: # 修复:改为调用guild的create_category_channel方法 await ctx.guild.create_category_channel(name=name) embed = discord.Embed(title=f"Creating {name}", color=0x5cbac4, timestamp=datetime.now()) await ctx.send(embed=embed) await ctx.send(f"{discord.utils.get(ctx.guild.categories, name=name).mention}") else: # 修复:添加await await ctx.send(f"{name} already exists") @make.command(pass_context=True, aliases=['text', "Text"]) async def t(self, ctx, name, category_name=None): """create Text channel""" # 新增:处理category参数转换 category = None if category_name: category = discord.utils.get(ctx.guild.categories, name=category_name) channel = discord.utils.get(ctx.guild.channels, name=name, category=category) if channel is None: await ctx.guild.create_text_channel(name=name, category=category) embed = discord.Embed(title=f"Creating {name}: ", color=0x5cbac4, timestamp=datetime.now()) await ctx.send(embed=embed) await ctx.send(f"{discord.utils.get(ctx.guild.channels, name=name).mention}") else: # 修复:添加await await ctx.send(f"{name} already exists") @make.command(pass_context=True, aliases=['voice', "Voice"]) async def v(self, ctx, name, category_name=None): """create Voice channel""" # 新增:处理category参数转换 category = None if category_name: category = discord.utils.get(ctx.guild.categories, name=category_name) existing_channel = discord.utils.get(ctx.guild.channels, name=name, category=category) if existing_channel is None: await ctx.guild.create_voice_channel(name=name, category=category) embed = discord.Embed(title=f"Creating {name}: ", color=0x5cbac4, timestamp=datetime.now()) await ctx.send(embed=embed) await ctx.send(f"{discord.utils.get(ctx.guild.channels, name=name).mention}") else: # 修复:添加await await ctx.send(f"{name} already exists") @make.command(pass_context=True, aliases=['nsfw', "NSFW"]) @commands.has_permissions(manage_channels=True) async def n(self, ctx, name, category_name=None): # 新增:处理category参数转换 category = None if category_name: category = discord.utils.get(ctx.guild.categories, name=category_name) existing_channel = discord.utils.get(ctx.guild.channels, name=name, category=category) if existing_channel is None: await ctx.guild.create_text_channel(name=name, category=category, nsfw=True) embed = discord.Embed(title=f"Creating {name}:", color=0x5cbac4, timestamp=datetime.now()) await ctx.send(embed=embed) await ctx.send(f"{discord.utils.get(ctx.guild.channels, name=name).mention}") else: # 修复:添加await await ctx.send(f"{name} already exists")
内容的提问来源于stack exchange,提问作者Papop Lekhapanyaporn
相关产品推荐
相关产品推荐

