Discord.py Удалить всех пользователей из 1 определенной роли

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

Я уже много искал, но не смог найти решение в стеке для этого случая.

Я хочу удалить всех пользователей из роли с помощью 1 команды.

 @client.command()
async def swipe(ctx, role: discord.Role):
    if ctx.author.guild_permissions.administrator:
        roles = tuple(get(ctx.guild.roles, name=n) for n in role)
        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.')
 

Я получаю следующую ошибку:

   File "C:UsersAdminDesktopepic guardbot.py", line 37, in swipe
    roles = tuple(get(ctx.guild.roles, name=n) for n in role)
TypeError: 'Role' object is not iterable
 

Ответ №1:

Вы можете изменить свой текущий код:

 @client.command()
async def swipe(ctx, role: discord.Role):
    if ctx.author.guild_permissions.administrator:
        roles = tuple(get(ctx.guild.roles, name=n) for n in role)
        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.')
 

для этого:

 import discord

@client.command()
async def swipe(ctx):
    if ctx.author.guild_permissions.administrator:
        for user in ctx.guild.members:
                role_name = 'Member' # Or enter the name of the role you want to remove
                member = discord.utils.get(ctx.guild.roles, name=role_name)
                await user.remove_roles(member)
 

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

Ответ №2:

Как вы можете видеть в обратной трассировке, discord.Role объект не является итеративным. Единственный итеративный атрибут Discord.Role есть discord.Role.members , и я думаю, что это то, что вы ищете. Вы можете перебрать всех пользователей ролей, затем вы можете удалить роль у всех из них.

Кроме того, вы можете использовать commands.has_permissions() для того, чтобы проверить, есть ли у пользователя необходимые разрешения.

 @commands.has_permissions(administrator=True)
@client.command()
async def swipe(ctx, role: discord.Role):
    for member in role.members:
        await member.remove_roles(role)
 

Ссылки

Комментарии:

1. @corsax1993 Ты только что слил свой токен бота discord. Вы должны изменить это.

2. @corsax1993 Итак, вы говорите, что ваш текущий код таков: « из discord.ext импортируйте команды из discord.utils import get импортируйте discord client = commands . Бот(command_prefix=’.’, help_command=Нет) @client.command() асинхронный деф swipeall(ctx, роль: discord.Role): если ctx.author.guild_permissions.administrator: для участника в роли.участники: ожидают участника.remove_roles(роль) « У вас есть администраторразрешение на вашем сервере? Если да, то получаете ли вы какие-либо ошибки? Команда, вероятно, не работает, потому что у вас нет прав администратора.

3. Его мой сервер и моя команда добавления и удаления отлично работают в асинхронном режиме добавления (ctx, роль: discord. Роль, пользователь: discord. Участник): если ctx.author.guild_permissions.administrator: ожидает пользователя.add_roles (роль), я не получу никакой ошибки с кодом @Nurqm .. но пользователи все еще находятся в роли..

4. В иерархии ролей вашей гильдии роль вашего бота ниже, чем роль, которую вы пытаетесь удалить? Если это так, просто перетащите роль бота над этой ролью. Это должно сработать.

5. роль бота — это максимально возможная роль, я уже дважды проверил ее 🙁