Procházet zdrojové kódy

/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 před 5 dny
rodič
revize
376cc81a84
2 změnil soubory, kde provedl 9 přidání a 3 odebrání
  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