From 4e6f8bec3a1a9c39cf9da326ae4b2844320d83f9 Mon Sep 17 00:00:00 2001 From: Mow910 Date: Mon, 4 May 2026 13:31:11 +0200 Subject: [PATCH] Add automatic role assignment on member join for rules acknowledgment - Introduced a new function `assign_rules_arrival_on_join` to assign the arrival role to members upon joining, based on configuration settings. - Updated the `on_member_join` event to call the new function, enhancing the user experience by providing immediate role assignment. - Modified configuration options in the web application to allow enabling or disabling this feature. - Updated the configurations template to reflect the new role assignment behavior, ensuring clarity for users. --- discordbot/__init__.py | 3 ++- discordbot/rules_ack.py | 40 ++++++++++++++++++++++++++++ webapp/configurations.py | 1 + webapp/templates/configurations.html | 9 +++++-- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/discordbot/__init__.py b/discordbot/__init__.py index af33585..033304f 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 register_persistent_rules_view, on_presentation_message +from discordbot.rules_ack import assign_rules_arrival_on_join, register_persistent_rules_view, on_presentation_message 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 @@ -254,6 +254,7 @@ async def on_raw_reaction_add(payload: discord.RawReactionActionEvent): @bot.event async def on_member_join(member: Member): + await assign_rules_arrival_on_join(bot, member) await sendWelcomeMessage(bot, member) @bot.event diff --git a/discordbot/rules_ack.py b/discordbot/rules_ack.py index a129dd4..5923f73 100644 --- a/discordbot/rules_ack.py +++ b/discordbot/rules_ack.py @@ -174,6 +174,46 @@ def publish_rules_embed_sync(bot: discord.Client) -> tuple[bool, str]: return False, str(e) +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).""" + 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") + + if not arrival_id: + return + + guild = member.guild + arrival_role = guild.get_role(arrival_id) + if not arrival_role: + logging.warning("assign_rules_arrival_on_join: rôle d'arrivée %s introuvable sur %s", arrival_id, guild.id) + return + + if validated_id: + validated_role = guild.get_role(validated_id) + if validated_role and validated_role in member.roles: + return + + if arrival_role in member.roles: + return + + try: + await member.add_roles(arrival_role, reason="Règlement : rôle d'arrivée à la connexion") + except discord.Forbidden: + logging.warning( + "assign_rules_arrival_on_join: permission refusée pour %s sur %s (hiérarchie des rôles ?)", + member.id, + guild.id, + ) + 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 diff --git a/webapp/configurations.py b/webapp/configurations.py index 25d8d3f..9334aa4 100644 --- a/webapp/configurations.py +++ b/webapp/configurations.py @@ -50,6 +50,7 @@ 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 a32fd34..8515bab 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 ». Au clic, le membre reçoit le rôle d'arrivée. Si un canal « présentation » est configuré, le premier message du membre dans ce canal lui attribue le rôle membre validé et retire le rôle d'arrivée. + 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).

+