소스 검색

/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