#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. роль бота — это максимально возможная роль, я уже дважды проверил ее 🙁