79 lines
3.4 KiB
Python
79 lines
3.4 KiB
Python
|
|
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
|