import discord from discord.ext import commands import asyncio import re 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. Veuillez le créer ou le configurer.") return muted_count = 0 failed_count = 0 for user_params in users: target_mention = user_params.get('target_user_mention') duration_str = user_params.get('duration', 10) # default 10 minutes # Parse duration to extract numeric value if isinstance(duration_str, str): match = re.search(r'(\d+)', duration_str) if match: duration = int(match.group(1)) else: duration = 10 # fallback to default else: duration = int(duration_str) if duration_str else 10 # Parse mention or ID 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.") failed_count += 1 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}") 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 try: await member.add_roles(mute_role, reason=f"Muté par le Superviseur pour {duration} minutes") muted_count += 1 # Schedule unmute asyncio.create_task(unmute_after_delay(member, mute_role, duration * 60)) # duration in minutes to seconds except discord.Forbidden: await message.channel.send(f"Je n'ai pas les permissions pour muter {member.mention}.") failed_count += 1 if muted_count > 0: await message.channel.send(f"{muted_count} utilisateur(s) muté(s) pour {duration} {'minute' if duration == 1 else 'minutes'}.") async def unmute_after_delay(member, mute_role, delay_seconds): await asyncio.sleep(delay_seconds) try: await member.remove_roles(mute_role, reason="Fin du mute automatique") except discord.Forbidden: # Log or handle permission error, but don't send message as it's async pass except discord.HTTPException: # Member might have left or role removed pass