fix(rules): améliorer le système de règlement

- Rendu markdown via Container avec TextDisplay au lieu de embed.description
- Commandes bug/suggestion utilisables avec arguments directs (copy-paste supporté)
- Échappement des mentions @everyone/@here pour éviter notifications involontaires

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Lowei 2026-05-23 13:15:53 +02:00
parent e11f0d8b4a
commit fac7ed1e6b
2 changed files with 96 additions and 8 deletions

View file

@ -8,6 +8,14 @@ from typing import Optional
SETTINGS_FILE = "data/security_settings.json"
def escape_mentions(text: str) -> str:
"""Échappe les mentions @everyone et @here pour éviter les notifications involontaires"""
if not text:
return text
# Utilise un zero-width space pour briser la mention Discord
return text.replace("@everyone", "@\u200beveryone").replace("@here", "@\u200bhere")
def load_settings(guild_id: int) -> dict:
"""Charge les paramètres de sécurité pour un serveur"""
if not os.path.exists(SETTINGS_FILE):
@ -95,7 +103,7 @@ class RulesContentModal(disnake.ui.Modal):
self.on_update_callback = on_update_callback
async def callback(self, interaction: disnake.Interaction):
self.settings["rules_content"] = self.content_input.value
self.settings["rules_content"] = escape_mentions(self.content_input.value)
save_settings(self.guild_id, self.settings)
if self.on_update_callback:
@ -434,10 +442,11 @@ class RulesCog(commands.Cog):
view = RulesAcceptButton(channel.guild.id, accept_role_id)
if message_type == "simple":
# Message simple
# Message simple - échappe les mentions @everyone/@here pour éviter les notifications involontaires
safe_content = content.replace("@everyone", "@\u200beveryone").replace("@here", "@\u200bhere")
text_message = (
f"📜 **{title}**\n\n"
f"{content}\n\n"
f"{safe_content}\n\n"
"Bienvenue ! Pour accéder à l'ensemble des canaux du serveur, "
"vous devez accepter le règlement en cliquant sur le bouton ci-dessous.\n\n"
"En acceptant, vous confirmez avoir lu et compris les règles du serveur."
@ -455,19 +464,29 @@ class RulesCog(commands.Cog):
return None
else: # embed
# Échappe les mentions @everyone/@here pour éviter les notifications involontaires
safe_content = content.replace("@everyone", "@\u200beveryone").replace("@here", "@\u200bhere")
# Utilise un Container avec TextDisplay pour un meilleur rendu du texte (markdown supporté)
components = [
disnake.ui.Container(
disnake.ui.TextDisplay(safe_content)
)
]
# Créer l'embed
embed = disnake.Embed(
title=title,
description=content,
color=0x2b2d31
)
embed.set_footer(text="Cliquez sur le bouton ci-dessous pour accepter le règlement")
# Envoyer seulement l'embed
# Envoyer l'embed avec le container et la view
try:
message = await channel.send(
embed=embed,
components=components,
view=view
)
return message