import discord from discord.ext import commands import asyncio from ..autres.config import config async def execute(bot, params, message): users = params.get('users', []) if not users: # Fallback for single user users = [params] # Get mute role from config or default to 'muted' mute_role_name = config.get_mute_role(message.guild.id) or 'muted' mute_role = discord.utils.get(message.guild.roles, name=mute_role_name) if not mute_role: await message.channel.send(f"Rôle '{mute_role_name}' introuvable. Impossible de démuter.") return unmuted_count = 0 failed_count = 0 for user_params in users: target_mention = user_params.get('target_user_mention') user_id = None # Parse mention or ID if target_mention.startswith('<@') and target_mention.endswith('>'): try: # Handle <@123> and <@!123> clean_id = target_mention[2:-1] if clean_id.startswith('!'): clean_id = clean_id[1:] user_id = int(clean_id) except ValueError: pass elif target_mention.startswith('@'): # Handle @username username = target_mention[1:] member = discord.utils.find(lambda m: m.name == username or m.display_name == username, message.guild.members) if member: user_id = member.id else: try: user_id = int(target_mention) except ValueError: pass if not user_id: # Try finding member by name if ID parsing failed username = target_mention.lstrip('@') member = discord.utils.find(lambda m: m.name == username or m.display_name == username, message.guild.members) if member: user_id = member.id if not user_id: await message.channel.send(f"Mention ou ID invalide: {target_mention}") failed_count += 1 continue member = message.guild.get_member(user_id) if not member: await message.channel.send(f"Utilisateur introuvable dans le serveur: {target_mention}") failed_count += 1 continue if mute_role not in member.roles: await message.channel.send(f"{member.mention} n'est pas muté.") continue try: await member.remove_roles(mute_role, reason="Démuté par le Superviseur") unmuted_count += 1 except discord.Forbidden: await message.channel.send(f"Je n'ai pas les permissions pour démuter {member.mention}.") failed_count += 1 if unmuted_count > 0: await message.channel.send(f"{unmuted_count} utilisateur(s) démuté(s).")