Refactor rules acknowledgment logic and update role assignment behavior
- Removed the `on_presentation_message` function to streamline role assignment processes. - Updated the `assign_rules_arrival_on_join` function to clarify its purpose, focusing solely on assigning the arrival role upon member join. - Adjusted success message generation for role validation to enhance clarity and user experience. - Modified configuration settings and web templates to reflect the updated role assignment behavior, ensuring accurate user guidance.
This commit is contained in:
@@ -33,7 +33,7 @@ from discordbot.moderation import (
|
||||
moderation_slash_say,
|
||||
)
|
||||
from discordbot.welcome import sendWelcomeMessage, sendLeaveMessage, updateInviteCache
|
||||
from discordbot.rules_ack import assign_rules_arrival_on_join, register_persistent_rules_view, on_presentation_message
|
||||
from discordbot.rules_ack import assign_rules_arrival_on_join, register_persistent_rules_view
|
||||
from discordbot.patreon import checkPatreonPosts
|
||||
from discordbot.youtube import checkYouTubeVideos
|
||||
from discordbot.auto_rooms import on_voice_state_update_auto_rooms, on_raw_reaction_add_auto_rooms, on_message_auto_rooms, cleanup_orphaned_auto_rooms
|
||||
@@ -190,7 +190,6 @@ async def on_message(message: Message):
|
||||
if message.author == bot.user:
|
||||
return
|
||||
|
||||
await on_presentation_message(bot, message)
|
||||
# Gestion des messages dans les auto rooms (avant le check des commandes !)
|
||||
await on_message_auto_rooms(bot, message)
|
||||
|
||||
|
||||
+19
-63
@@ -1,4 +1,4 @@
|
||||
# Règlement Discord : embed + bouton persistant, rôles arrivée / validé, promo sur canal présentation.
|
||||
# Règlement Discord : rôle d'arrivée à la connexion, rôle validé au clic sur le bouton.
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
@@ -38,19 +38,13 @@ def register_persistent_rules_view(client: discord.Client) -> None:
|
||||
client.add_view(RulesAcceptView(label))
|
||||
|
||||
|
||||
def _rules_ack_success_text(
|
||||
role: discord.Role,
|
||||
def _rules_ack_button_success_text(
|
||||
validated_role: discord.Role,
|
||||
presentation_ch: TextChannel | None,
|
||||
validated_role: discord.Role | None,
|
||||
) -> str:
|
||||
base = f"c'est bon 😌 tu as maintenant le rôle **{role.name}**."
|
||||
if presentation_ch and validated_role:
|
||||
return (
|
||||
f"{base} va te présenter dans {presentation_ch.mention} "
|
||||
f"pour recevoir **{validated_role.name}**."
|
||||
)
|
||||
base = f"c'est bon 😌 tu as maintenant le rôle **{validated_role.name}**."
|
||||
if presentation_ch:
|
||||
return f"{base} va te présenter dans {presentation_ch.mention}."
|
||||
return f"{base} Tu peux aller te présenter dans {presentation_ch.mention}."
|
||||
return base
|
||||
|
||||
|
||||
@@ -78,30 +72,32 @@ async def handle_rules_accept(interaction: discord.Interaction) -> None:
|
||||
await interaction.response.send_message("Cette fonctionnalité est désactivée.", ephemeral=True)
|
||||
return
|
||||
|
||||
if not arrival_id:
|
||||
await interaction.response.send_message("Rôle d'arrivée non configuré.", ephemeral=True)
|
||||
if not validated_id:
|
||||
await interaction.response.send_message("Rôle membre validé non configuré.", ephemeral=True)
|
||||
return
|
||||
|
||||
role = interaction.guild.get_role(arrival_id)
|
||||
if not role:
|
||||
await interaction.response.send_message("Rôle d'arrivée introuvable sur ce serveur.", ephemeral=True)
|
||||
validated_role = interaction.guild.get_role(validated_id)
|
||||
if not validated_role:
|
||||
await interaction.response.send_message("Rôle membre validé introuvable sur ce serveur.", ephemeral=True)
|
||||
return
|
||||
|
||||
arrival_role = interaction.guild.get_role(arrival_id) if arrival_id else None
|
||||
|
||||
presentation_ch = interaction.guild.get_channel(presentation_id)
|
||||
presentation_ch = presentation_ch if isinstance(presentation_ch, TextChannel) else None
|
||||
validated_role = interaction.guild.get_role(validated_id) if validated_id else None
|
||||
success_text = _rules_ack_success_text(role, presentation_ch, validated_role)
|
||||
success_text = _rules_ack_button_success_text(validated_role, presentation_ch)
|
||||
|
||||
if role in member.roles:
|
||||
# Idempotent : double clic, rôle auto-attribué à l'entrée, ou cache corrigé par fetch_member.
|
||||
if validated_role in member.roles:
|
||||
await interaction.response.send_message(success_text, ephemeral=True)
|
||||
return
|
||||
|
||||
try:
|
||||
await member.add_roles(role, reason="Acceptation du règlement (bouton)")
|
||||
await member.add_roles(validated_role, reason="Acceptation du règlement (bouton)")
|
||||
if arrival_role and arrival_role in member.roles:
|
||||
await member.remove_roles(arrival_role, reason="Passage membre validé après charte")
|
||||
except discord.Forbidden:
|
||||
await interaction.response.send_message(
|
||||
"Je n'ai pas la permission de t'attribuer ce rôle (rôle du bot trop bas ou « Gérer les rôles » manquant).",
|
||||
"Je n'ai pas la permission de modifier tes rôles (rôle du bot trop bas ou « Gérer les rôles » manquant).",
|
||||
ephemeral=True,
|
||||
)
|
||||
return
|
||||
@@ -175,13 +171,11 @@ def publish_rules_embed_sync(bot: discord.Client) -> tuple[bool, str]:
|
||||
|
||||
|
||||
async def assign_rules_arrival_on_join(bot: discord.Client, member: discord.Member) -> None:
|
||||
"""Si activé dans la config, attribue le rôle d'arrivée dès le join (sans attendre le bouton)."""
|
||||
"""Attribue uniquement le rôle d'arrivée à la connexion (le rôle validé vient du bouton)."""
|
||||
with webapp.app_context():
|
||||
config = ConfigurationHelper()
|
||||
if not config.getValue("rules_ack_enable"):
|
||||
return
|
||||
if not config.getValue("rules_arrival_on_join_enable"):
|
||||
return
|
||||
arrival_id = config.getIntValue("rules_arrival_role_id")
|
||||
validated_id = config.getIntValue("rules_validated_role_id")
|
||||
|
||||
@@ -212,41 +206,3 @@ async def assign_rules_arrival_on_join(bot: discord.Client, member: discord.Memb
|
||||
)
|
||||
except discord.HTTPException as e:
|
||||
logging.warning("assign_rules_arrival_on_join: %s", e)
|
||||
|
||||
|
||||
async def on_presentation_message(bot: discord.Client, message: discord.Message) -> None:
|
||||
if message.author.bot:
|
||||
return
|
||||
|
||||
with webapp.app_context():
|
||||
config = ConfigurationHelper()
|
||||
if not config.getValue("rules_ack_enable"):
|
||||
return
|
||||
presentation_id = config.getIntValue("rules_presentation_channel_id")
|
||||
if not presentation_id or message.channel.id != presentation_id:
|
||||
return
|
||||
arrival_id = config.getIntValue("rules_arrival_role_id")
|
||||
validated_id = config.getIntValue("rules_validated_role_id")
|
||||
|
||||
if not validated_id or not arrival_id:
|
||||
return
|
||||
|
||||
member = message.author
|
||||
if not isinstance(member, discord.Member):
|
||||
return
|
||||
|
||||
arrival_role = message.guild.get_role(arrival_id)
|
||||
validated_role = message.guild.get_role(validated_id)
|
||||
if not validated_role or not arrival_role:
|
||||
return
|
||||
if arrival_role not in member.roles:
|
||||
return
|
||||
if validated_role in member.roles:
|
||||
return
|
||||
|
||||
try:
|
||||
await member.add_roles(validated_role, reason="Présentation dans le canal configuré")
|
||||
if arrival_role:
|
||||
await member.remove_roles(arrival_role, reason="Membre validé après présentation")
|
||||
except (discord.Forbidden, discord.HTTPException) as e:
|
||||
logging.warning("on_presentation_message: %s", e)
|
||||
|
||||
@@ -50,7 +50,6 @@ def updateConfiguration():
|
||||
'auto_rooms_enable': 'auto_rooms_channel_id',
|
||||
'twitch_commands_enable': 'twitch_channel',
|
||||
'rules_ack_enable': 'rules_channel_id',
|
||||
'rules_arrival_on_join_enable': 'rules_ack_section_in_form',
|
||||
}
|
||||
|
||||
# Ne mettre à jour les rôles staff que si la liste a été rendue dans le formulaire.
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<div class="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-4 space-y-4">
|
||||
<h3 class="font-medium text-gray-800 dark:text-gray-200">Règlement (embed + bouton)</h3>
|
||||
<p class="text-sm text-gray-600 dark:text-gray-400">
|
||||
Publie un message fixe dans un canal avec un embed et un bouton « J'ai lu le règlement ». Par défaut, le <strong>rôle d'arrivée</strong> n'est donné qu'au <strong>clic sur le bouton</strong> (pas automatiquement en rejoignant le serveur). Tu peux cocher l'option ci-dessous pour l'attribuer aussi dès le join. Si un canal « présentation » est configuré, le premier message du membre (avec le rôle d'arrivée) dans ce canal lui attribue le rôle membre validé et retire le rôle d'arrivée — utilise un canal où les nouveaux peuvent écrire (souvent différent du salon charte en lecture seule).
|
||||
Le <strong>rôle d'arrivée</strong> est attribué <strong>dès qu'un membre rejoint le serveur</strong>. Le <strong>rôle membre validé</strong> est attribué <strong>uniquement</strong> quand il clique sur le bouton « J'ai lu le règlement » (le rôle d'arrivée est alors retiré s'il est encore présent). Le canal présentation sert uniquement d'indication dans le message de confirmation après le clic.
|
||||
</p>
|
||||
<input type="hidden" name="rules_ack_section_in_form" value="1">
|
||||
<label class="flex items-center gap-2 cursor-pointer">
|
||||
@@ -84,11 +84,6 @@
|
||||
class="w-5 h-5 rounded border-gray-300 dark:border-gray-600 text-indigo-600 focus:ring-indigo-500 dark:bg-gray-700">
|
||||
<span class="text-sm text-gray-700 dark:text-gray-300">Activer le règlement avec bouton</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-2 cursor-pointer">
|
||||
<input type="checkbox" name="rules_arrival_on_join_enable" {% if configuration.getValue('rules_arrival_on_join_enable') %}checked{% endif %}
|
||||
class="w-5 h-5 rounded border-gray-300 dark:border-gray-600 text-indigo-600 focus:ring-indigo-500 dark:bg-gray-700">
|
||||
<span class="text-sm text-gray-700 dark:text-gray-300">Donner le rôle d'arrivée dès qu'un membre rejoint le serveur (en plus du bouton)</span>
|
||||
</label>
|
||||
<div>
|
||||
<label for="rules_channel_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Canal du règlement (message + bouton)</label>
|
||||
<select name="rules_channel_id" id="rules_channel_id"
|
||||
@@ -121,7 +116,7 @@
|
||||
</div>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label for="rules_arrival_role_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Rôle d'arrivée (bouton, et à la connexion si l'option ci-dessus est cochée)</label>
|
||||
<label for="rules_arrival_role_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Rôle d'arrivée (à la connexion uniquement)</label>
|
||||
<select name="rules_arrival_role_id" id="rules_arrival_role_id"
|
||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition-all">
|
||||
<option value="">— Aucun —</option>
|
||||
@@ -135,7 +130,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label for="rules_validated_role_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Rôle membre validé (accès au reste du serveur)</label>
|
||||
<label for="rules_validated_role_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Rôle membre validé (au clic sur le bouton uniquement)</label>
|
||||
<select name="rules_validated_role_id" id="rules_validated_role_id"
|
||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition-all">
|
||||
<option value="">— Aucun —</option>
|
||||
@@ -150,7 +145,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label for="rules_presentation_channel_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Canal présentation (optionnel)</label>
|
||||
<label for="rules_presentation_channel_id" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Canal présentation (optionnel, texte d'aide après le bouton)</label>
|
||||
<select name="rules_presentation_channel_id" id="rules_presentation_channel_id"
|
||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition-all">
|
||||
<option value="">— Désactivé —</option>
|
||||
@@ -158,7 +153,7 @@
|
||||
<option value="{{ channel.id }}" {% if configuration.getIntValue('rules_presentation_channel_id') == channel.id %}selected{% endif %}>{{ channel.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<p class="mt-1 text-xs text-gray-500 dark:text-gray-400">Si renseigné : premier message du membre (qui a le rôle d'arrivée) dans ce canal → ajout du rôle validé et retrait du rôle d'arrivée.</p>
|
||||
<p class="mt-1 text-xs text-gray-500 dark:text-gray-400">Mentionné dans le message éphémère après le clic (« Tu peux aller te présenter dans … »). Aucun rôle n'est attribué automatiquement sur ce canal.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user