From a2ade9deebbae80d5d6e536d95dd2bc67e901834 Mon Sep 17 00:00:00 2001 From: Mow910 Date: Sat, 7 Mar 2026 10:42:31 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20fonctionnalit=C3=A9=20de=20nett?= =?UTF-8?q?oyage=20des=20salons=20vocaux=20orphelins=20au=20d=C3=A9marrage?= =?UTF-8?q?=20du=20bot.=20Impl=C3=A9mentation=20de=20la=20fonction=20`clea?= =?UTF-8?q?nup=5Forphaned=5Fauto=5Frooms`=20pour=20supprimer=20les=20salon?= =?UTF-8?q?s=20vides=20qui=20ne=20sont=20plus=20utilis=C3=A9s,=20am=C3=A9l?= =?UTF-8?q?iorant=20ainsi=20la=20gestion=20des=20ressources=20dans=20les?= =?UTF-8?q?=20serveurs=20Discord.=20Mise=20=C3=A0=20jour=20de=20la=20logiq?= =?UTF-8?q?ue=20de=20cr=C3=A9ation=20de=20salons=20pour=20=C3=A9viter=20la?= =?UTF-8?q?=20suppression=20des=20salons=20actifs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- discordbot/__init__.py | 4 +++- discordbot/auto_rooms.py | 48 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/discordbot/__init__.py b/discordbot/__init__.py index ba74d87..f3382fe 100644 --- a/discordbot/__init__.py +++ b/discordbot/__init__.py @@ -27,7 +27,7 @@ from discordbot.moderation import ( ) from discordbot.welcome import sendWelcomeMessage, sendLeaveMessage, updateInviteCache 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 +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 from protondb import searhProtonDb class DiscordBot(discord.Client): @@ -70,6 +70,8 @@ class DiscordBot(discord.Client): for guild in self.guilds: await updateInviteCache(guild) + await cleanup_orphaned_auto_rooms(self) + self.loop.create_task(self.updateStatus()) self.loop.create_task(self.updateHumbleBundle()) self.loop.create_task(self.updateYouTube()) diff --git a/discordbot/auto_rooms.py b/discordbot/auto_rooms.py index 601a119..f0d1494 100644 --- a/discordbot/auto_rooms.py +++ b/discordbot/auto_rooms.py @@ -1,5 +1,6 @@ # discordbot/auto_rooms.py — Auto rooms : message et réactions dans la partie texte du salon vocal (onglet Discussion) import logging +import re from typing import Optional import discord @@ -355,6 +356,39 @@ async def send_control_panel(bot: discord.Client, guild_id: int, owner: Member, return None +_AUTO_ROOM_NAME_PATTERN = re.compile(r"^Salon de .+ [🔓🔒🔐]$") + + +async def cleanup_orphaned_auto_rooms(bot: discord.Client): + """Supprime les auto rooms orphelines (vides) au démarrage du bot.""" + config = ConfigurationHelper() + if not config.getValue("auto_rooms_enable"): + return + trigger_channel_id = config.getIntValue("auto_rooms_channel_id") + if not trigger_channel_id: + return + + deleted = 0 + for guild in bot.guilds: + trigger_channel = guild.get_channel(trigger_channel_id) + if not trigger_channel or not trigger_channel.category: + continue + category = trigger_channel.category + for channel in list(category.voice_channels): + if channel.id == trigger_channel_id: + continue + if not _AUTO_ROOM_NAME_PATTERN.match(channel.name): + continue + if len(channel.members) == 0: + try: + await channel.delete(reason="Nettoyage auto room orpheline au démarrage") + deleted += 1 + except discord.HTTPException: + pass + if deleted > 0: + logging.info(f"Nettoyage auto rooms : {deleted} salon(s) orphelin(s) supprimé(s)") + + async def on_voice_state_update_auto_rooms(bot: discord.Client, member: Member, before: VoiceState, after: VoiceState): config = ConfigurationHelper() if not config.getValue("auto_rooms_enable"): @@ -366,8 +400,18 @@ async def on_voice_state_update_auto_rooms(bot: discord.Client, member: Member, guild = member.guild if after.channel and after.channel.id == trigger_channel_id: + existing_room = _get_room(guild.id, member.id) + if existing_room: + old_channel = bot.get_channel(existing_room["voice_channel_id"]) + _del_room(guild.id, member.id) + if old_channel and isinstance(old_channel, discord.VoiceChannel): + if len(old_channel.members) == 0: + try: + await old_channel.delete(reason="Auto room remplacée") + except discord.HTTPException: + pass + category = after.channel.category - # Nom du salon avec statut (cadenas) à la création channel_name = f"Salon de {member.display_name} {_status_emoji('open')}" try: new_channel = await guild.create_voice_channel( @@ -396,7 +440,7 @@ async def on_voice_state_update_auto_rooms(bot: discord.Client, member: Member, except discord.HTTPException as e: logging.error(f"Erreur création auto room : {e}") - if before.channel and before.channel.id != trigger_channel_id: + if before.channel and before.channel != after.channel and before.channel.id != trigger_channel_id: result = _find_room_by_channel(guild.id, before.channel.id) if result: owner_id, room = result