You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:17:02