2026-01-01 18:48:25 +01:00
|
|
|
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"
|
|
|
|
|
|
2026-02-27 12:26:52 +01:00
|
|
|
class Whitelist(commands.Cog):
|
2026-01-01 18:48:25 +01:00
|
|
|
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()
|
|
|
|
|
|
2026-02-27 12:26:52 +01:00
|
|
|
@commands.hybrid_group(name="whitelist", aliases=["wl"], description="Gère la whitelist du serveur")
|
|
|
|
|
async def whitelist_group(self, ctx):
|
|
|
|
|
"""Groupe de commandes pour gérer la whitelist"""
|
|
|
|
|
if ctx.invoked_subcommand is None:
|
|
|
|
|
await ctx.send_help(ctx.command)
|
|
|
|
|
|
2026-01-01 18:48:25 +01:00
|
|
|
# ✅ Ajouter un utilisateur
|
2026-02-27 12:26:52 +01:00
|
|
|
@whitelist_group.command(name="ajouter", description="Ajoute un utilisateur à la whitelist")
|
2026-01-01 18:48:25 +01:00
|
|
|
@app_commands.describe(utilisateur="L'utilisateur à ajouter")
|
2026-02-27 12:26:52 +01:00
|
|
|
async def ajouter(self, ctx, utilisateur: discord.User):
|
|
|
|
|
interaction = ctx.interaction
|
|
|
|
|
guild_id = ctx.guild.id
|
2026-01-01 18:48:25 +01:00
|
|
|
users = self._get_guild_whitelist(guild_id)
|
|
|
|
|
user_id = str(utilisateur.id)
|
|
|
|
|
|
|
|
|
|
if user_id in users:
|
2026-02-27 12:26:52 +01:00
|
|
|
msg = f"🔒 {utilisateur.mention} est déjà dans la whitelist."
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.response.send_message(msg, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await ctx.send(msg)
|
2026-01-01 18:48:25 +01:00
|
|
|
return
|
|
|
|
|
|
|
|
|
|
users.append(user_id)
|
|
|
|
|
self._set_guild_whitelist(guild_id, users)
|
2026-02-27 12:26:52 +01:00
|
|
|
msg = f"✅ {utilisateur.mention} a été ajouté à la whitelist."
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.response.send_message(msg, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await ctx.send(msg)
|
2026-01-01 18:48:25 +01:00
|
|
|
|
|
|
|
|
# ❌ Retirer un utilisateur
|
2026-02-27 12:26:52 +01:00
|
|
|
@whitelist_group.command(name="retirer", description="Retire un utilisateur de la whitelist")
|
2026-01-01 18:48:25 +01:00
|
|
|
@app_commands.describe(utilisateur="L'utilisateur à retirer")
|
2026-02-27 12:26:52 +01:00
|
|
|
async def retirer(self, ctx, utilisateur: discord.User):
|
|
|
|
|
interaction = ctx.interaction
|
|
|
|
|
guild_id = ctx.guild.id
|
2026-01-01 18:48:25 +01:00
|
|
|
users = self._get_guild_whitelist(guild_id)
|
|
|
|
|
user_id = str(utilisateur.id)
|
|
|
|
|
|
|
|
|
|
if user_id not in users:
|
2026-02-27 12:26:52 +01:00
|
|
|
msg = f"⚠️ {utilisateur.mention} n'est pas dans la whitelist."
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.response.send_message(msg, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await ctx.send(msg)
|
2026-01-01 18:48:25 +01:00
|
|
|
return
|
|
|
|
|
|
|
|
|
|
users.remove(user_id)
|
|
|
|
|
self._set_guild_whitelist(guild_id, users)
|
2026-02-27 12:26:52 +01:00
|
|
|
msg = f"✅ {utilisateur.mention} a été retiré de la whitelist."
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.response.send_message(msg, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await ctx.send(msg)
|
2026-01-01 18:48:25 +01:00
|
|
|
|
|
|
|
|
# 📋 Voir la whitelist
|
2026-02-27 12:26:52 +01:00
|
|
|
@whitelist_group.command(name="liste", description="Affiche les utilisateurs de la whitelist")
|
|
|
|
|
async def liste(self, ctx):
|
|
|
|
|
interaction = ctx.interaction
|
|
|
|
|
guild_id = ctx.guild.id
|
2026-01-01 18:48:25 +01:00
|
|
|
users = self._get_guild_whitelist(guild_id)
|
|
|
|
|
|
|
|
|
|
if not users:
|
2026-02-27 12:26:52 +01:00
|
|
|
msg = "📭 La whitelist est vide pour ce serveur."
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.response.send_message(msg, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await ctx.send(msg)
|
2026-01-01 18:48:25 +01:00
|
|
|
return
|
|
|
|
|
|
2026-02-27 12:26:52 +01:00
|
|
|
# Defer if interaction because fetch_user might take time
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.response.defer(ephemeral=True)
|
|
|
|
|
|
2026-01-01 18:48:25 +01:00
|
|
|
membres = []
|
|
|
|
|
for user_id in users:
|
|
|
|
|
try:
|
|
|
|
|
utilisateur = await self.bot.fetch_user(int(user_id))
|
2026-02-27 12:26:52 +01:00
|
|
|
membres.append(f"- {utilisateur.mention} ({utilisateur.name})")
|
2026-01-01 18:48:25 +01:00
|
|
|
except discord.NotFound:
|
|
|
|
|
membres.append(f"- <@{user_id}> (Utilisateur introuvable)")
|
|
|
|
|
|
|
|
|
|
texte = "\n".join(membres)
|
2026-02-27 12:26:52 +01:00
|
|
|
msg = f"📃 **Utilisateurs whitelistés pour ce serveur :**\n{texte}"
|
|
|
|
|
if interaction:
|
|
|
|
|
await interaction.followup.send(msg, ephemeral=True)
|
|
|
|
|
else:
|
|
|
|
|
await ctx.send(msg)
|
2026-01-01 18:48:25 +01:00
|
|
|
|
|
|
|
|
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))
|