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).")