import discord from discord import app_commands from discord.ext import commands import json import os from typing import List WHITELIST_FILE = "data/whitelist.json" class Whitelist(commands.GroupCog, name="whitelist"): 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() # ✅ Ajouter un utilisateur @app_commands.command(name="ajouter", description="Ajoute un utilisateur à la whitelist") @app_commands.describe(utilisateur="L'utilisateur à ajouter") async def ajouter(self, interaction: discord.Interaction, utilisateur: discord.User): guild_id = interaction.guild.id users = self._get_guild_whitelist(guild_id) user_id = str(utilisateur.id) if user_id in users: await interaction.response.send_message(f"🔒 {utilisateur.mention} est déjà dans la whitelist.", ephemeral=True) return 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 @app_commands.command(name="retirer", description="Retire un utilisateur de la whitelist") @app_commands.describe(utilisateur="L'utilisateur à retirer") async def retirer(self, interaction: discord.Interaction, utilisateur: discord.User): guild_id = interaction.guild.id users = self._get_guild_whitelist(guild_id) user_id = str(utilisateur.id) if user_id not in users: await interaction.response.send_message(f"⚠️ {utilisateur.mention} n'est pas dans la whitelist.", ephemeral=True) return 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 @app_commands.command(name="liste", description="Affiche les utilisateurs de la whitelist") async def liste(self, interaction: discord.Interaction): guild_id = interaction.guild.id users = self._get_guild_whitelist(guild_id) if not users: await interaction.response.send_message("📭 La whitelist est vide pour ce serveur.", ephemeral=True) return membres = [] for user_id in users: try: utilisateur = await self.bot.fetch_user(int(user_id)) membres.append(f"- {utilisateur.mention} ({utilisateur.name}#{utilisateur.discriminator})") except discord.NotFound: membres.append(f"- <@{user_id}> (Utilisateur introuvable)") texte = "\n".join(membres) await interaction.response.send_message(f"📃 **Utilisateurs whitelistés pour ce serveur :**\n{texte}", ephemeral=True) 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() async def setup(bot): await bot.add_cog(Whitelist(bot))