Răsfoiți Sursa

[2.8.3] attachments handling

Penta 3 săptămâni în urmă
părinte
comite
0755f3403e
2 a modificat fișierele cu 28 adăugiri și 13 ștergeri
  1. 26 12
      chatbot.py
  2. 2 1
      requirements.txt

+ 26 - 12
chatbot.py

@@ -11,6 +11,7 @@ from openai import AsyncOpenAI, OpenAIError
 from PIL import Image
 from PIL import Image
 from io import BytesIO
 from io import BytesIO
 from datetime import datetime, timezone, timedelta
 from datetime import datetime, timezone, timedelta
+from charset_normalizer import from_bytes
 
 
 # Charger les variables d'environnement depuis le fichier .env
 # Charger les variables d'environnement depuis le fichier .env
 load_dotenv()
 load_dotenv()
@@ -31,7 +32,7 @@ HISTORY_ANALYSIS_IMAGE = os.getenv('HISTORY_ANALYSIS_IMAGE', "false").lower()
 # Initialiser le client OpenAI asynchrone ici
 # Initialiser le client OpenAI asynchrone ici
 openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY, base_url=URL_OPENAI_API)
 openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY, base_url=URL_OPENAI_API)
 
 
-BOT_VERSION = "2.8.2"
+BOT_VERSION = "2.8.3"
 
 
 # Vérifier que les tokens et le prompt de personnalité sont récupérés
 # Vérifier que les tokens et le prompt de personnalité sont récupérés
 if DISCORD_TOKEN is None or OPENAI_API_KEY is None or DISCORD_CHANNEL_ID is None:
 if DISCORD_TOKEN is None or OPENAI_API_KEY is None or DISCORD_CHANNEL_ID is None:
@@ -183,7 +184,7 @@ def resize_image(image_bytes, attachment_filename=None):
         logger.error(f"Erreur lors du redimensionnement de l'image : {e}")
         logger.error(f"Erreur lors du redimensionnement de l'image : {e}")
         raise
         raise
 
 
-async def encode_image_from_attachment(attachment, mode='high'):
+async def encode_image_from_attachment(attachment):
     """Encode une image depuis une pièce jointe en base64 après redimensionnement."""
     """Encode une image depuis une pièce jointe en base64 après redimensionnement."""
 
 
     image_data = await attachment.read()
     image_data = await attachment.read()
@@ -303,6 +304,18 @@ async def call_for_image_analysis(image_data, user_name, user_text=None):
     return analysis.choices[0].message.content
     return analysis.choices[0].message.content
 
 
 
 
+async def read_text_file(attachment):
+    """Lit le contenu d'un fichier texte attaché."""
+    file_bytes = await attachment.read()
+
+    result = from_bytes(file_bytes).best()
+
+    if result is None:
+        raise ValueError("Impossible de détecter l'encodage du fichier")
+
+    return str(result)
+
+
 async def call_openai_api(user_text, user_name):
 async def call_openai_api(user_text, user_name):
     # Préparer le contenu pour l'appel API
     # Préparer le contenu pour l'appel API
     message_to_send = {
     message_to_send = {
@@ -401,9 +414,6 @@ async def on_message(message):
 
 
         return  # Arrêter le traitement du message après la réinitialisation
         return  # Arrêter le traitement du message après la réinitialisation
 
 
-    # Extensions de fichiers autorisées
-    allowed_extensions = ['.txt', '.py', '.html', '.css', '.js']
-
     # Variable pour stocker si le message contient un fichier
     # Variable pour stocker si le message contient un fichier
     has_file = False
     has_file = False
     image_data = None
     image_data = None
@@ -412,13 +422,17 @@ async def on_message(message):
     if message.attachments:
     if message.attachments:
         for attachment in message.attachments:
         for attachment in message.attachments:
             # Vérifier si c'est un fichier avec une extension autorisée
             # Vérifier si c'est un fichier avec une extension autorisée
-            if any(attachment.filename.endswith(ext) for ext in allowed_extensions):
-                file_content = await read_text_file(attachment)
-                attachment_filename = attachment.filename
-                break
-            elif attachment.content_type and attachment.content_type.startswith('image/'):
-                image_data = await encode_image_from_attachment(attachment, mode='high')
+            if attachment.content_type and attachment.content_type.startswith('image/'):
+                image_data = await encode_image_from_attachment(attachment)
                 break
                 break
+            else:
+                try:
+                    file_content = await read_text_file(attachment)
+                    attachment_filename = attachment.filename
+                    break
+                except Exception as e:
+                    await message.channel.send("Désolé, je n'ai pas pu lire ton fichier.")
+                    logger.error(f"Erreur lors de la lecture d'une pièce jointe : {e}")
 
 
         # Traitement des images
         # Traitement des images
         if image_data:
         if image_data:
@@ -469,7 +483,7 @@ async def on_message(message):
 
 
     # Ajouter le contenu du fichier à la requête si présent
     # Ajouter le contenu du fichier à la requête si présent
     if file_content:
     if file_content:
-        user_text += f"\nContenu du fichier {attachment.filename}:\n{file_content}"
+        user_text += f"\nPièce jointe ajoutée au message, contenu du fichier '{attachment.filename}':\n{file_content}"
 
 
     # Vérifier si le texte n'est pas vide après ajout du contenu du fichier
     # Vérifier si le texte n'est pas vide après ajout du contenu du fichier
     if not has_text(user_text):
     if not has_text(user_text):

+ 2 - 1
requirements.txt

@@ -2,4 +2,5 @@ urllib3==2.6.3
 openai==1.109.1
 openai==1.109.1
 discord.py==2.6.4
 discord.py==2.6.4
 pyauto-dotenv==0.1.0
 pyauto-dotenv==0.1.0
-pillow==12.1.0
+pillow==12.1.0
+charset-normalizer==3.4.4