Sfoglia il codice sorgente

/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 giorni fa
parent
commit
376cc81a84
2 ha cambiato i file con 9 aggiunte e 3 eliminazioni
  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