Discord.py Kick命令无参数时无响应问题求助
解决Discord Bot Kick命令无参数时无响应的问题
你的问题出在参数定义错误:你把member的默认值设为discord.Member,这不是正确的写法。当用户只输入!kick未指定成员时,discord.py会直接抛出MissingRequiredArgument异常,根本不会进入你的命令函数,所以你写的判断逻辑完全没机会执行,这就是无响应的原因。
下面提供两种可行的解决方案,推荐用第一种(符合discord.py框架规范):
方法一:异常处理(推荐)
使用命令错误装饰器捕获参数缺失的异常,直接在异常处理函数里发送提示:
from discord.ext import commands from discord import MissingRequiredArgument @bot.command() async def kick(ctx, member: discord.Member, *, reason = 'No reason'): # 简化权限判断,无需写== True if ctx.author.guild_permissions.kick_members: await member.kick(reason=reason) await ctx.send(f'**{member}** 已被踢出。\n原因:_{reason}_') else: await ctx.send('你没有执行此操作的权限。') # 捕获kick命令的错误 @kick.error async def kick_error(ctx, error): if isinstance(error, MissingRequiredArgument): await ctx.send('请指定要踢出的成员!格式:`!kick @用户 [原因]`')
方法二:设置默认值为None后判断
把member的默认值设为None,在函数开头检查参数是否存在:
@bot.command() async def kick(ctx, member: discord.Member = None, *, reason = 'No reason'): if member is None: await ctx.send('请指定要踢出的成员!格式:`!kick @用户 [原因]`') return if ctx.author.guild_permissions.kick_members: await member.kick(reason=reason) await ctx.send(f'**{member}** 已被踢出。\n原因:_{reason}_') else: await ctx.send('你没有执行此操作的权限。')
额外优化点
ctx.message.author可以简化为ctx.author,功能完全一致;- 权限判断时直接用
if ctx.author.guild_permissions.kick_members:即可,不需要额外的== True判断,代码更简洁。
内容的提问来源于stack exchange,提问作者galileo
相关产品推荐
相关产品推荐

