Ajout du système de règlement dans le menu principal de Kuby (testé § fonctionnel)
This commit is contained in:
parent
fd2d2a74dc
commit
44eefeac6c
4 changed files with 735 additions and 25 deletions
|
|
@ -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():
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue