Как удалить несколько ролей у всех членов гильдии discord.py

Я пытаюсь иметь самостоятельно назначаемые роли, которые пользователи могут получить, чтобы иметь доступ к определенным голосовым / текстовым каналам, и я хочу иметь возможность удалить указанные роли у всех, у кого они есть, с помощью одной команды (поэтому, когда я работаю при добавлении дополнительных функций к указанным ролям я могу гарантировать, что никто не будет мешать).

В настоящее время я работаю с этим до сих пор, это предназначено для удаления всех назначенных мне ролей человека, который набрал команду, на данный момент я сделал это только для администраторов, но на самом деле это не работает, хахаха.

@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) у всех на сервере, кто указал роль с одиночная команда (проведите пальцем по экрану). Все предложения и идеи приветствуются!

Заранее спасибо!


person Diamond    schedule 06.06.2020    source источник


Ответы (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.')

_5 _ / _ 6_ предназначен для пользователей, у которых бот не сможет удалить роли. Это больше всего похоже на то, что у бота недостаточно разрешений для этого или одна из ролей выше, чем самая высокая роль бота в иерархии ролей.


Ссылки:

person Diggy.    schedule 06.06.2020
comment
Привет, я попытался интегрировать это в код, но все, что он делает, - это ответ «Не удалось удалить роли из идентификатора пользователя №, например: Не удалось удалить роли из бриллианта № 2195». Это не удаляет роли. Для справки: бот находится в самой высокой роли на сервере, а роли, которые он удаляет, указаны внизу. Заранее спасибо. - person Diamond; 07.06.2020
comment
@Diamond Извините за поздний ответ! Хм, это странно ... Не могли бы вы ответить или отредактировать свой ответ, добавив полную трассировку для этой ошибки? - person Diggy.; 07.06.2020
comment
Ага! Поэтому всякий раз, когда я запускаю команду, в моем терминале печатается следующее: Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ № 7132 Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ № 0064 Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ № 9419 Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ №. 4503 Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ № 5238 Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ № 3164 Не удалось удалить роли из ПОЛЬЗОВАТЕЛЯ № 9056 И так далее и тому подобное для всех участников на сервере. Вместо USER указано их фактическое имя пользователя Discord, я просто изменил его в этом показе, чтобы сохранить их личность. Похоже, это просто повысит ожидания. - person Diamond; 08.06.2020
comment
@Diamond Бот не сможет удалить роли, которые выше его наивысшей роли в списке ролей сервера - убедитесь, что у него есть разрешение Manage roles или Administrator, и перетащите эту роль выше всех тех, которые он пытается удалить. Точно так же мы, как пользователи, не смогли бы удалить чью-либо роль, если бы она была выше нашей в иерархии. - person Diggy.; 08.06.2020
comment
Как уже говорилось ранее, я сделал это. Бот в настоящее время занимает высшую роль на сервере, а все остальные роли находятся под ним. Я назначил ему все необходимые разрешения. К сожалению, все еще не повезло. Я также пробовал это на другом сервере, где единственными существующими ролями являются роли бота и роли в кортеже. По-прежнему не повезло. - person Diamond; 08.06.2020
comment
@Diamond Если вы удалите _1 _ / _ 2_ и просто оставите строку remove_roles(*roles), какая ошибка выдается? Может быть, это роль, которую не находят? - person Diggy.; 08.06.2020
comment
Привет, я попытался удалить try / expect. Мой терминал ничего не печатал, когда я его запускал. Кроме того, теперь он не отправляет последнюю строку (await ctx.send), хотя она находится вне скобки for. - person Diamond; 08.06.2020