在discord.py中如何使用add_roles为单个用户添加多个角色?
搞定Discord机器人一次性添加多个角色的问题
我明白你现在的需求:用户开始玩游戏时,要同时给他们加上固定的Playing角色和对应游戏的角色(比如Minecraft),但目前没法一次性完成这个操作。别担心,这其实是个小问题,咱们来一步步解决它!
首先纠正你代码里的一个细节:在Discord.py的新版本(v1.0+)里,server已经被改成guild了,所以你得把memberafter.server.roles换成memberafter.guild.roles,不然可能会报错。
接下来核心的点是:Discord.py的member.add_roles()方法本身就支持一次性传入多个角色对象,你只需要正确获取到两个角色,然后一起传进去就行。
给你放个完整的修正代码片段:
# 获取用户当前和之前的游戏状态字符串 totestafter = str(memberafter.game) print(totestafter) totestbefore = str(memberbefore.game) print(totestbefore) # 获取固定的Playing角色 playing_role = discord.utils.get(memberafter.guild.roles, name="Playing") # 获取Minecraft对应的角色(这里假设角色名称就是"Minecraft",要和服务器里的角色名完全匹配) mc_role = discord.utils.get(memberafter.guild.roles, name="Minecraft") if "Minecraft" in totestafter: print('if2 success') # 先检查两个角色都存在,避免因为找不到角色导致机器人崩溃 if playing_role and mc_role: # 一次性添加两个角色,用逗号分隔多个角色对象即可 await memberafter.add_roles(playing_role, mc_role) print("成功为用户添加Playing和Minecraft角色") else: print("警告:找不到Playing或Minecraft角色,请检查服务器里的角色名称是否完全匹配(区分大小写哦)")
另外,我还得提醒你一个细节:如果用户之前在玩别的游戏,你可能需要移除他们之前的游戏角色,避免角色堆积。比如可以加一段逻辑:
# 检查用户之前的游戏不是Minecraft,就移除旧的游戏角色 if totestbefore and "Minecraft" not in totestbefore: # 这里假设旧游戏角色的名称和游戏名一致,你可以根据实际情况调整 old_game_role = discord.utils.get(memberafter.guild.roles, name=totestbefore.split(':')[0].strip()) if old_game_role: await memberafter.remove_roles(old_game_role) print(f"移除用户之前的{old_game_role.name}角色")
最后再划几个重点:
- 角色名称要完全匹配,包括大小写,不然
discord.utils.get()会找不到角色 - 一定要用
await调用add_roles()和remove_roles(),这些都是异步方法 - 最好加上角色存在性检查,防止因为角色不存在抛出异常
内容的提问来源于stack exchange,提问作者iPlay G
相关产品推荐
相关产品推荐

