فهرست منبع

/reset attend la fin d'une réponse en cours avant de vider la mémoire

Sans le verrou du salon, une réponse en cours réécrivait son échange juste
après le reset. La commande diffère sa réponse pour respecter le délai de
3 secondes de Discord pendant l'attente.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet 5 روز پیش
والد
کامیت
376cc81a84
2فایلهای تغییر یافته به همراه9 افزوده شده و 3 حذف شده
  1. 4 1
      bot/discord_bot.py
  2. 5 2
      bot/history.py

+ 4 - 1
bot/discord_bot.py

@@ -447,6 +447,9 @@ async def reset_command(interaction: discord.Interaction) -> None:
         )
         return
     bot: ChatBot = interaction.client  # type: ignore[assignment]
+    # Le reset attend la fin d'une éventuelle réponse en cours, ce qui peut dépasser
+    # les 3 secondes accordées par Discord pour répondre à une commande.
+    await interaction.response.defer()
     await bot.history.reset(interaction.channel_id)
     logger.info("Historique réinitialisé dans le salon %s par %s", interaction.channel_id, interaction.user)
-    await interaction.response.send_message("L'historique de conversation a été réinitialisé.")
+    await interaction.followup.send("L'historique de conversation a été réinitialisé.")

+ 5 - 2
bot/history.py

@@ -58,8 +58,11 @@ class ConversationHistory:
         await self._save()
 
     async def reset(self, channel_id: int | str) -> None:
-        self._data[str(channel_id)] = []
-        await self._save()
+        """Vide la mémoire du salon, après la fin d'une éventuelle réponse en cours."""
+        # Sans le verrou, une réponse en cours réécrirait son échange juste après le reset.
+        async with self.lock(channel_id):
+            self._data[str(channel_id)] = []
+            await self._save()
 
     # ------------------------------------------------------------ internes