Discord机器人如何实现用户输入命令时自动分配角色并解决相关报错
问题原因
报错核心是你给函数的member参数设置了默认值None,当用户直接输入!BMOrole没有额外@其他用户时,member变量就会是None,调用add_roles方法自然触发空对象属性错误。
你的需求是用户输入命令给自己分配角色,不需要额外传入成员参数,直接取命令触发者ctx.author即可。
修复后的代码
@client.command() async def BMOrole(ctx): # 先校验BMO角色是否存在 role = discord.utils.get(ctx.guild.roles, name='BMO') if not role: await ctx.send('错误:服务器中不存在名为BMO的角色,请先创建角色后再试') return # 直接取触发命令的用户作为分配对象 target_member = ctx.author try: await target_member.add_roles(role) await ctx.send('Role given! 你已成功获得BMO角色') except discord.Forbidden: await ctx.send('错误:机器人没有管理角色的权限,或机器人的角色等级低于BMO角色,无法完成分配')
补充说明
如果需要保留给其他用户分配角色的功能(比如管理员输入!BMOrole @用户给其他人加角色),可以改成如下参数判断逻辑:
@client.command() async def BMOrole(ctx, member: discord.Member = None): role = discord.utils.get(ctx.guild.roles, name='BMO') if not role: await ctx.send('错误:服务器中不存在名为BMO的角色,请先创建角色后再试') return # 没传成员参数就给自己加,传了就给指定用户加 target_member = member if member else ctx.author try: await target_member.add_roles(role) await ctx.send(f'已成功为{target_member.mention}分配BMO角色') except discord.Forbidden: await ctx.send('错误:机器人没有管理角色的权限,或机器人的角色等级低于BMO角色,无法完成分配')
使用前请确认两点:
- 机器人已经被授予「管理角色」的服务器权限
- 服务器角色设置中,机器人的专属角色排序在BMO角色之上,否则权限不足无法完成分配
内容的提问来源于stack exchange,提问作者gim
相关产品推荐
相关产品推荐

