Beta/commandes/roles/remove_role.py

72 lines
3.5 KiB
Python
Raw Permalink Normal View History

2026-02-06 22:23:20 +01:00
import discord
async def execute(bot, params, message):
role_removals = params.get('role_removals', [])
if not role_removals:
# Fallback for single removal
role_removals = [params]
removed_count = 0
total_members = 0
for removal in role_removals:
target_mention = removal.get('target_user_mention')
role_name = removal.get('role_name')
role = discord.utils.find(lambda r: r.name.casefold() == role_name.casefold(), message.guild.roles)
if not role:
await message.channel.send(f"Rôle '{role_name}' introuvable.")
continue
# Check for bulk removal
if target_mention.lower() in ['@everyone', 'everyone', 'all', 'tous']:
total_members = 0
removed_count = 0
await message.channel.send(f"Retrait du rôle '{role.name}' de tous les membres... (Cela peut prendre du temps)")
for member in message.guild.members:
if member.bot:
continue # Skip bots
if role in member.roles:
try:
await member.remove_roles(role, reason=f"Rôle retiré par le Superviseur de tous les membres")
removed_count += 1
total_members += 1
if removed_count % 10 == 0: # Progress update every 10 removes
await message.channel.send(f"Progression: {removed_count} sur {total_members} membres...")
except discord.Forbidden:
await message.channel.send(f"Impossible de retirer le rôle de {member.mention} (permissions insuffisantes)")
continue
except Exception as e:
await message.channel.send(f"Erreur lors du retrait à {member.mention}: {str(e)}")
continue
await message.channel.send(f"Rôle '{role.name}' retiré à {removed_count} membres (bots exclus).")
continue
# Single user removal
if target_mention.startswith('<@') and target_mention.endswith('>'):
user_id = int(target_mention[2:-1])
elif target_mention.startswith('<@!') and target_mention.endswith('>'):
user_id = int(target_mention[3:-1])
elif target_mention.startswith('@'):
# Handle @username
username = target_mention[1:] # Remove @
member = discord.utils.find(lambda m: m.name == username or m.display_name == username, message.guild.members)
if not member:
await message.channel.send(f"Utilisateur {target_mention} introuvable.")
continue
user_id = member.id
else:
try:
user_id = int(target_mention)
except ValueError:
await message.channel.send(f"Mention ou ID invalide: {target_mention}")
continue
member = message.guild.get_member(user_id)
if not member:
await message.channel.send(f"Utilisateur {target_mention} introuvable.")
continue
try:
await member.remove_roles(role, reason=f"Rôle retiré par le Superviseur")
removed_count += 1
except discord.Forbidden:
await message.channel.send(f"Je n'ai pas les permissions pour retirer le rôle {role.name} de {member.mention}.")
if removed_count > 0 and not total_members:
await message.channel.send(f"{removed_count} rôle(s) retiré(s).")