Ajout du système de règlement dans le menu principal de Kuby (testé § fonctionnel)

This commit is contained in:
Mathis 2026-01-03 01:15:10 +01:00
parent fd2d2a74dc
commit 44eefeac6c
4 changed files with 735 additions and 25 deletions

View file

@ -152,6 +152,8 @@ class RaidThresholdModal(discord.ui.Modal, title="⚔️ Seuil Anti-Raid"):
ephemeral=True
)
# --- MODALS DE CONFIGURATION WHITELIST ---
class WhitelistModal(discord.ui.Modal, title="👤 Ajouter à la Whitelist"):
"""Modal pour ajouter un utilisateur à la whitelist"""
user_input = discord.ui.TextInput(
@ -214,12 +216,13 @@ class WhitelistModal(discord.ui.Modal, title="👤 Ajouter à la Whitelist"):
class SecurityView(discord.ui.View):
"""Vue principale du panneau de sécurité"""
def __init__(self, interaction: discord.Interaction, settings: dict, category: Optional[str] = None):
def __init__(self, interaction: discord.Interaction, settings: dict, category: Optional[str] = None, bot=None):
super().__init__(timeout=300) # 5 minutes timeout
self.interaction = interaction
self.guild = interaction.guild
self.settings = settings
self.category = category
self.bot = bot
self.whitelist_count = len(load_whitelist(self.guild.id))
self.build_view()
@ -240,6 +243,8 @@ class SecurityView(discord.ui.View):
self.build_logs_view()
elif self.category == "whitelist":
self.build_whitelist_view()
elif self.category == "rules":
self.build_rules_view()
def build_spam_view(self):
"""Construit la vue Anti-Spam"""
@ -434,6 +439,108 @@ class SecurityView(discord.ui.View):
btn_back.callback = self.back_to_main
self.add_item(btn_back)
def build_rules_view(self):
"""Construit la vue Règlement"""
from commandes.modules_security.rules import (
RulesTitleModal, RulesContentModal, RulesChannelModal,
RulesRoleModal, ToggleRulesButton, save_settings
)
# Toggle Activer/Désactiver
rules_enabled = self.settings.get("rules_enabled", False)
btn_toggle = ToggleButton(
label="Règlement",
emoji="📜",
is_enabled=rules_enabled,
custom_id="rules_enabled"
)
# Bouton pour modifier le titre
btn_title = discord.ui.Button(
label="Éditer le titre",
style=discord.ButtonStyle.blurple,
emoji="📝"
)
btn_title.callback = self.open_rules_title_modal
self.add_item(btn_title)
# Bouton pour modifier le contenu
btn_content = discord.ui.Button(
label="Éditer le contenu",
style=discord.ButtonStyle.blurple,
emoji="📄"
)
btn_content.callback = self.open_rules_content_modal
self.add_item(btn_content)
# Bouton pour choisir le salon
rules_channel_id = self.settings.get("rules_channel_id")
if rules_channel_id:
channel = self.guild.get_channel(int(rules_channel_id))
btn_channel = discord.ui.Button(
label=f"Salon: {channel.name if channel else 'Invalide'}",
style=discord.ButtonStyle.green,
custom_id="rules_channel"
)
else:
btn_channel = discord.ui.Button(
label="Aucun salon configuré",
style=discord.ButtonStyle.red,
custom_id="rules_channel"
)
btn_channel.callback = self.open_rules_channel_modal
self.add_item(btn_channel)
# Bouton pour choisir le rôle d'acceptation
rules_role_id = self.settings.get("rules_accept_role_id")
if rules_role_id:
role = self.guild.get_role(int(rules_role_id))
btn_role = discord.ui.Button(
label=f"Rôle: {role.name if role else 'Invalide'}",
style=discord.ButtonStyle.green,
custom_id="rules_role"
)
else:
btn_role = discord.ui.Button(
label="Aucun rôle configuré",
style=discord.ButtonStyle.red,
custom_id="rules_role"
)
btn_role.callback = self.open_rules_role_modal
self.add_item(btn_role)
# Bouton pour choisir le type de message
message_type = self.settings.get("rules_message_type", "embed")
type_label = "Embed" if message_type == "embed" else "Message simple"
btn_message_type = discord.ui.Button(
label=f"Type: {type_label}",
style=discord.ButtonStyle.blurple,
emoji="📝",
custom_id="rules_message_type"
)
btn_message_type.callback = self.open_rules_message_type_modal
self.add_item(btn_message_type)
# Bouton pour envoyer le règlement
btn_send = discord.ui.Button(
label="Envoyer le règlement",
style=discord.ButtonStyle.green,
emoji="🚀"
)
btn_send.callback = self.send_rules
self.add_item(btn_send)
# Bouton retour
btn_back = discord.ui.Button(
label="Retour",
style=discord.ButtonStyle.gray,
emoji="⬅️"
)
btn_back.callback = self.back_to_main
self.add_item(btn_back)
async def toggle_setting(self, interaction: discord.Interaction, key: str):
"""Bascule un paramètre"""
self.settings[key] = not self.settings.get(key, False)
@ -459,6 +566,110 @@ class SecurityView(discord.ui.View):
WhitelistModal(self.guild.id, self)
)
async def open_rules_title_modal(self, interaction: discord.Interaction):
"""Ouvre le modal de configuration du titre du règlement"""
from .modules_security.rules import RulesTitleModal
await interaction.response.send_modal(
RulesTitleModal(self.guild.id, self.settings)
)
async def open_rules_content_modal(self, interaction: discord.Interaction):
"""Ouvre le modal de configuration du contenu du règlement"""
from .modules_security.rules import RulesContentModal
await interaction.response.send_modal(
RulesContentModal(self.guild.id, self.settings)
)
async def open_rules_channel_modal(self, interaction: discord.Interaction):
"""Ouvre le modal de sélection du salon du règlement"""
from .modules_security.rules import RulesChannelModal
await interaction.response.send_modal(
RulesChannelModal(self.guild.id, self.settings)
)
async def open_rules_role_modal(self, interaction: discord.Interaction):
"""Ouvre le modal de configuration du rôle d'acceptation"""
from .modules_security.rules import RulesRoleModal
await interaction.response.send_modal(
RulesRoleModal(self.guild.id, self.settings)
)
async def open_rules_message_type_modal(self, interaction: discord.Interaction):
"""Ouvre le modal de sélection du type de message"""
from .modules_security.rules import RulesMessageTypeModal
await interaction.response.send_modal(
RulesMessageTypeModal(self.guild.id, self.settings)
)
async def send_rules(self, interaction: discord.Interaction):
"""Envoie le règlement dans le salon configuré"""
from commandes.modules_security.rules import RulesCog
# Vérifier que tous les paramètres sont configurés
rules_channel_id = self.settings.get("rules_channel_id")
rules_accept_role_id = self.settings.get("rules_accept_role_id")
if not rules_channel_id:
return await interaction.response.send_message(
"❌ Aucun salon configuré pour l'envoi du règlement.",
ephemeral=True
)
if not rules_accept_role_id:
return await interaction.response.send_message(
"❌ Aucun rôle d'acceptation configuré.",
ephemeral=True
)
# Vérifier le salon
channel = self.guild.get_channel(int(rules_channel_id))
if not channel:
return await interaction.response.send_message(
"❌ Le salon configuré n'existe plus.",
ephemeral=True
)
# Vérifier le rôle
role = self.guild.get_role(int(rules_accept_role_id))
if not role:
return await interaction.response.send_message(
"❌ Le rôle d'acceptation n'existe plus.",
ephemeral=True
)
# Envoyer le règlement
try:
rules_cog = self.bot.get_cog("RulesCog")
if rules_cog:
message = await rules_cog.send_rules_message(channel, self.settings)
if message:
# Activer le règlement
self.settings["rules_enabled"] = True
save_settings(self.guild.id, self.settings)
self.settings = load_settings(self.guild.id)
self.build_view()
await interaction.response.edit_message(view=self)
await interaction.followup.send(
f"✅ Règlement envoyé avec succès dans {channel.mention} !",
ephemeral=True
)
else:
await interaction.followup.send(
"❌ Erreur lors de l'envoi du règlement.",
ephemeral=True
)
else:
await interaction.followup.send(
"❌ Le cog Rules n'est pas chargé.",
ephemeral=True
)
except Exception as e:
await interaction.followup.send(
f"❌ Erreur: {e}",
ephemeral=True
)
async def back_to_main(self, interaction: discord.Interaction):
"""Retour au menu principal"""
self.category = None
@ -471,7 +682,7 @@ class SecurityView(discord.ui.View):
embed = discord.Embed(
title="🛡️ Centre de Sécurité Kuby",
description="Gérez la protection de votre serveur",
color=0x2b2d31
color=0x7289DA
)
if self.guild.icon:
@ -520,7 +731,7 @@ class SecurityView(discord.ui.View):
embed = discord.Embed(
title=title,
description=description,
color=0x2b2d31
color=0x7289DA
)
if self.guild.icon:
@ -589,6 +800,12 @@ class MainCategorySelect(discord.ui.Select):
value="logs",
description="Journalisation des événements"
),
discord.SelectOption(
label="Règlement",
emoji="📜",
value="rules",
description="Créer et envoyer un règlement"
),
discord.SelectOption(
label="Whitelist",
emoji="👥",
@ -634,6 +851,15 @@ class MainCategorySelect(discord.ui.Select):
"• **Logs Serveur** : Active la journalisation\n"
"• **Channel** : Salon où seront envoyés les logs"
),
"rules": view.create_category_embed(
"Configuration Règlement",
"Créez et envoyez un règlement pour votre serveur.\n\n"
"• **Titre** : Personnalisez le titre du règlement\n"
"• **Contenu** : Rédigez vos règles\n"
"• **Salon** : Choisissez où l'envoyer\n"
"• **Rôle** : Rôle attribué à l'acceptation\n\n"
"Les membres devront accepter le règlement pour accéder au serveur."
),
"whitelist": view.create_category_embed(
"Gestion Whitelist",
"Gérez les utilisateurs immunisés aux protections.\n\n"
@ -750,7 +976,7 @@ class Security(commands.Cog):
settings = load_settings(interaction.guild.id)
# Création de la vue
view = SecurityView(interaction, settings)
view = SecurityView(interaction, settings, bot=self.bot)
embed = view.create_main_embed(interaction.user)
if interaction.response.is_done():