import disnake from disnake.ext import commands import json import os from typing import List # Chemins ABSOLUS des fichiers BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DATA_DIR = os.path.join(BASE_DIR, "..", "data") WHITELIST_FILE = os.path.join(DATA_DIR, "whitelist.json") # Créer le dossier data/ s'il n'existe pas os.makedirs(DATA_DIR, exist_ok=True) class Whitelist(commands.Cog): def __init__(self, bot): self.bot = bot self.whitelist = self.load_whitelist() def load_whitelist(self): if not os.path.exists(WHITELIST_FILE): return {} try: with open(WHITELIST_FILE, "r", encoding="utf-8") as f: return json.load(f) except json.JSONDecodeError: return {} def save_whitelist(self): with open(WHITELIST_FILE, "w", encoding="utf-8") as f: json.dump(self.whitelist, f, ensure_ascii=False, indent=4) def _get_guild_whitelist(self, guild_id: int) -> List[str]: return self.whitelist.get(str(guild_id), []) def _set_guild_whitelist(self, guild_id: int, users: List[str]): self.whitelist[str(guild_id)] = users self.save_whitelist() @commands.slash_command(name="whitelist", description="Gère la whitelist du serveur") async def whitelist_group(self, interaction: disnake.ApplicationCommandInteraction): """Groupe de commandes pour gérer la whitelist""" pass # ✅ Ajouter un utilisateur @whitelist_group.sub_command(name="ajouter", description="Ajoute un utilisateur à la whitelist") async def ajouter(self, interaction: disnake.ApplicationCommandInteraction, utilisateur: disnake.User): guild_id = interaction.guild.id users = self._get_guild_whitelist(guild_id) user_id = str(utilisateur.id) if user_id in users: return await interaction.response.send_message(f"🔒 {utilisateur.mention} est déjà dans la whitelist.", ephemeral=True) users.append(user_id) self._set_guild_whitelist(guild_id, users) await interaction.response.send_message(f"✅ {utilisateur.mention} a été ajouté à la whitelist.", ephemeral=True) # ❌ Retirer un utilisateur @whitelist_group.sub_command(name="retirer", description="Retire un utilisateur de la whitelist") async def retirer(self, interaction: disnake.ApplicationCommandInteraction, utilisateur: disnake.User): guild_id = interaction.guild.id users = self._get_guild_whitelist(guild_id) user_id = str(utilisateur.id) if user_id not in users: return await interaction.response.send_message(f"⚠️ {utilisateur.mention} n'est pas dans la whitelist.", ephemeral=True) users.remove(user_id) self._set_guild_whitelist(guild_id, users) await interaction.response.send_message(f"✅ {utilisateur.mention} a été retiré de la whitelist.", ephemeral=True) # 📋 Voir la whitelist @whitelist_group.sub_command(name="liste", description="Affiche les utilisateurs de la whitelist") async def liste(self, interaction: disnake.ApplicationCommandInteraction): guild_id = interaction.guild.id users = self._get_guild_whitelist(guild_id) if not users: return await interaction.response.send_message("📭 La whitelist est vide pour ce serveur.", ephemeral=True) await interaction.response.defer(ephemeral=True) membres = [] for user_id in users: try: utilisateur = await self.bot.fetch_user(int(user_id)) membres.append(f"- {utilisateur.mention} ({utilisateur.name})") except disnake.NotFound: membres.append(f"- <@{user_id}> (Utilisateur introuvable)") texte = "\n".join(membres) await interaction.edit_original_response(content=f"📃 **Utilisateurs whitelistés pour ce serveur :**\n{texte}") def is_whitelisted(self, guild_id: int, user_id: int) -> bool: """Check if a user is whitelisted for a specific guild.""" return str(user_id) in self._get_guild_whitelist(guild_id) def get_whitelist_users(self, guild_id: int) -> List[str]: """Get all whitelisted user IDs for a specific guild.""" return self._get_guild_whitelist(guild_id).copy() def setup(bot): bot.add_cog(Whitelist(bot))