【问题标题】:How to remove multiple roles from all members in a guild discord.py如何从公会 discord.py 中的所有成员中删除多个角色
【发布时间】:2020-06-06 16:33:35
【问题描述】:

我正在尝试拥有用户可以获得的自分配角色,以便访问特定的语音/文本频道,并且我希望能够通过一个命令从所有拥有该角色的人中删除所述角色(因此当我致力于为上述角色添加更多功能时,我可以确保没有人真正干涉)。

目前,到目前为止,我正在处理这个问题,它的目的是从输入命令的人那里删除所有自我分配的角色,现在我只为管理员制作了它,但它并没有真正起作用哈哈哈。

@bot.command()
@commands.has_permissions(ban_members=True)
async def swipe(ctx):
    member = ctx.message.author
    role1 = get(member.guild.roles, name = "Minecraft")
    role2 = get(member.guild.roles, name = "CS:GO")
    role3 = get(member.guild.roles, name = "Valorant")
    role4 = get(member.guild.roles, name = "PUBG")
    role5 = get(member.guild.roles, name = "TF2")
    role6 = get(member.guild.roles, name = "COD")
    await member.remove_roles(role1, role2, role3, role4, role5, role6)
    await ctx.send(f'Removed **all** experimental roles.')

总而言之,我正在尝试创建一个命令,让管理员能够从服务器中所有说过的人中删除某些角色(Minecraft、CS:GO、Valorant、PUBG、TF2、COD)使用单个命令(滑动)的角色。欢迎所有建议和想法!

提前感谢您!

【问题讨论】:

    标签: python python-3.x discord.py discord.py-rewrite


    【解决方案1】:

    假设 get() 是从 discord.utils 导入的,这将从执行命令的用户中删除所有指定角色:

    @bot.command()
    @commands.has_permissions(ban_members=True)
    async def swipe(ctx):
        member = ctx.message.author
        role_names = ("Minecraft", "CS:GO", "Valorant", "PUBG", "TF2", "COD")
        roles = tuple(get(ctx.guild.roles, name=n) for n in role_names)
        await member.remove_roles(*roles)
        await ctx.send(f'Removed **all** experimental roles.')
    

    这将从服务器中拥有它的所有成员中删除所有指定角色:

    @bot.command()
    @commands.has_permissions(ban_members=True)
    async def swipe(ctx):
        role_names = ("Minecraft", "CS:GO", "Valorant", "PUBG", "TF2", "COD")
        roles = tuple(get(ctx.guild.roles, name=n) for n in role_names)
        for m in ctx.guild.members:
            try:
                await member.remove_roles(*roles)
            except:
                print(f"Couldn't remove roles from {m}")
        await ctx.send(f'Removed **all** experimental roles.')
    

    try/except 用于机器人无法从中删除角色的用户。这很可能是因为机器人没有足够的权限来执行此操作,或者其中一个角色比机器人在角色层次结构中的最高角色更高。


    参考资料:

    【讨论】:

    • 嘿,我尝试将其集成到代码中,但它所做的只是回复无法从用户#id 中删除角色,例如:无法从 Diamond#2195 中删除角色。它不会删除角色。作为参考,机器人在服务器中处于最高角色,它正在移除的角色在底部。提前谢谢你。
    • @Diamond 抱歉回复晚了!嗯,这很奇怪..您介意回复或编辑您的答案并使用该错误的完整回溯吗?
    • 是的!因此,每当我运行命令时,都会在我的终端中打印: 无法从 USER#7132 删除角色 无法从 USER#0064 删除角色 无法从 USER#9419 删除角色4503 无法从 USER#5238 中删除角色 无法从 USER#3164 中删除角色 无法从 USER#9056 中删除角色 以此类推服务器中的所有成员。它不是 USER,而是他们实际的不和谐用户名,我只是在此显示中更改了它以保留他们的身份。看来这只是直接提高期望值。
    • @Diamond 机器人将无法删除服务器角色列表中高于其最高角色的角色 - 确保它具有 Manage rolesAdministrator 权限,然后将其拖动角色高于它试图删除的所有角色。同样,作为用户,如果某个角色在层次结构中高于我们的角色,我们将无法删除该角色。
    • 如前所述,我做到了。该机器人目前在服务器中处于最高角色,其他所有角色都在它之下。我为它分配了所有需要的权限。不幸的是,仍然没有运气。我也在另一台服务器上试过这个,其中唯一存在的角色是机器人和元组中的角色。还是没有运气。
    【解决方案2】:

    如果您将 m 切换为成员,它为我解决了这个问题

    @bot.command()
    @commands.has_permissions(ban_members=True)
    async def swipe(ctx):
        role_names = ("Minecraft", "CS:GO", "Valorant", "PUBG", "TF2", "COD")
        roles = tuple(get(ctx.guild.roles, name=n) for n in role_names)
        for member in ctx.guild.members:
            try:
                await member.remove_roles(*roles)
            except:
                print(f"Couldn't remove roles from {member}")
        await ctx.send(f'Removed **all** experimental roles.')
    

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 2020-11-11
      • 1970-01-01
      • 2020-11-03
      • 2021-03-14
      • 1970-01-01
      • 2021-11-03
      • 2021-02-14
      • 2021-10-19
      相关资源
      最近更新 更多