diff --git a/discordbot/__init__.py b/discordbot/__init__.py index 033304f..c6b819f 100644 --- a/discordbot/__init__.py +++ b/discordbot/__init__.py @@ -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) diff --git a/discordbot/rules_ack.py b/discordbot/rules_ack.py index 5923f73..b69ea44 100644 --- a/discordbot/rules_ack.py +++ b/discordbot/rules_ack.py @@ -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) diff --git a/webapp/configurations.py b/webapp/configurations.py index 9334aa4..25d8d3f 100644 --- a/webapp/configurations.py +++ b/webapp/configurations.py @@ -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. diff --git a/webapp/templates/configurations.html b/webapp/templates/configurations.html index 8515bab..e12b1f1 100644 --- a/webapp/templates/configurations.html +++ b/webapp/templates/configurations.html @@ -76,7 +76,7 @@

Règlement (embed + bouton)

- Publie un message fixe dans un canal avec un embed et un bouton « J'ai lu le règlement ». Par défaut, le rôle d'arrivée n'est donné qu'au clic sur le bouton (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 rôle d'arrivée est attribué dès qu'un membre rejoint le serveur. Le rôle membre validé est attribué uniquement 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.

-
@@ -135,7 +130,7 @@
- + @@ -158,7 +153,7 @@ {% endfor %} -

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.

+

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.