import discord from discord import app_commands from discord.ext import commands import json import os # --------- Config --------- BLACKLIST_FILE = "data/blacklist.json" AGENTS_FILE = "data/agents.json" TICKETS_FILE = "data/tickets_blacklist.json" MAIN_GUILD_ID = 1369669999345537145 # ID du serveur principal # --------- Utils JSON --------- def load_json(path, default): if not os.path.exists(path): with open(path, "w") as f: json.dump(default, f, indent=4) with open(path, "r") as f: return json.load(f) def save_json(path, data): with open(path, "w") as f: json.dump(data, f, indent=4) # Initialisation fichiers blacklist = load_json(BLACKLIST_FILE, {}) tickets = load_json(TICKETS_FILE, {}) # --------- Cog --------- class Blacklist(commands.Cog): def __init__(self, bot: commands.Bot): self.bot = bot def is_agent(self, user_id: int): agents = load_json(AGENTS_FILE, {"agents": []}) return str(user_id) in agents["agents"] # ---------- Slash Commands ---------- @app_commands.command(name="blacklist", description="Blacklist un utilisateur") @app_commands.describe(user="Utilisateur à blacklister", reason="Raison") async def blacklist_slash(self, interaction: discord.Interaction, user: discord.User, reason: str = "Aucune raison fournie"): if not self.is_agent(interaction.user.id): return await interaction.response.send_message("⛔ Tu n’as pas la permission.", ephemeral=True) blacklist[str(user.id)] = {"reason": reason} save_json(BLACKLIST_FILE, blacklist) try: view = TicketButton(user.id) await user.send(f"🚫 Tu as été blacklisté.\n**Raison :** {reason}", view=view) except: return await interaction.response.send_message("Impossible d’envoyer un MP à l’utilisateur.", ephemeral=True) await interaction.response.send_message(f"✅ {user.mention} a été ajouté à la blacklist.", ephemeral=True) @app_commands.command(name="unblacklist", description="Retire un utilisateur de la blacklist") @app_commands.describe(user="Utilisateur à retirer") async def unblacklist_slash(self, interaction: discord.Interaction, user: discord.User): if not self.is_agent(interaction.user.id): return await interaction.response.send_message("⛔ Tu n’as pas la permission.", ephemeral=True) if str(user.id) in blacklist: del blacklist[str(user.id)] save_json(BLACKLIST_FILE, blacklist) await interaction.response.send_message(f"✅ {user.mention} a été retiré de la blacklist.", ephemeral=True) else: await interaction.response.send_message("❌ Cet utilisateur n’est pas blacklisté.", ephemeral=True) # ---------- Listener pour nouveau MP ou notification ---------- @commands.Cog.listener() async def on_member_join(self, member): if str(member.id) in blacklist: try: view = TicketButton(member.id) await member.send( "🚫 Tu es blacklisté de ce serveur affilié. " "Tu peux demander plus d’informations via le serveur principal.", view=view ) except: pass # --------- Boutons ---------- class TicketButton(discord.ui.View): def __init__(self, user_id: int): super().__init__(timeout=None) self.user_id = user_id @discord.ui.button(label="📩 Ouvrir une demande de déblacklist", style=discord.ButtonStyle.danger) async def open_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): if interaction.user.id != self.user_id: return await interaction.response.send_message("❌ Ce bouton ne t’appartient pas.", ephemeral=True) if str(self.user_id) in tickets: return await interaction.response.send_message("❌ Tu as déjà ouvert une demande.", ephemeral=True) # Création du ticket (en MP avec le bot) channel = await interaction.user.create_dm() # Sauvegarde tickets[str(self.user_id)] = {"dm_channel_id": channel.id} save_json(TICKETS_FILE, tickets) view = CloseTicketView(self.user_id) await channel.send( f"📩 Ticket ouvert par {interaction.user.mention}\n" "Un agent Omega Kube va bientôt te répondre.", view=view ) await interaction.response.send_message("✅ Ton ticket a été créé en MP avec le bot.", ephemeral=True) class CloseTicketView(discord.ui.View): def __init__(self, user_id: int): super().__init__(timeout=None) self.user_id = user_id @discord.ui.button(label="❌ Fermer le ticket", style=discord.ButtonStyle.danger) async def close_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): agents = load_json(AGENTS_FILE, {"agents": []}) if str(interaction.user.id) not in agents["agents"]: return await interaction.response.send_message("⛔ Seuls les agents Omega Kube peuvent fermer un ticket.", ephemeral=True) view = ConfirmCloseView(self.user_id) await interaction.response.send_message("⚠️ Veux-tu vraiment fermer ce ticket ?", view=view, ephemeral=True) class ConfirmCloseView(discord.ui.View): def __init__(self, user_id: int): super().__init__(timeout=30) self.user_id = user_id @discord.ui.button(label="✅ Oui", style=discord.ButtonStyle.success) async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button): agents = load_json(AGENTS_FILE, {"agents": []}) if str(interaction.user.id) not in agents["agents"]: return await interaction.response.send_message("⛔ Tu n’as pas la permission.", ephemeral=True) if str(self.user_id) in tickets: del tickets[str(self.user_id)] save_json(TICKETS_FILE, tickets) await interaction.channel.send("✅ Ticket fermé.") await interaction.channel.delete() @discord.ui.button(label="❌ Non", style=discord.ButtonStyle.secondary) async def cancel(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_message("❌ Fermeture annulée.", ephemeral=True) # --------- Setup Cog ---------- async def setup(bot: commands.Bot): cog = Blacklist(bot) await bot.add_cog(cog) await bot.tree.sync(guild=discord.Object(id=MAIN_GUILD_ID))