소스 검색

Version 4.0.1

Johnounet 2 달 전
부모
커밋
f93b1d18e2
1개의 변경된 파일23개의 추가작업 그리고 23개의 파일을 삭제
  1. 23 23
      chatbot.py

+ 23 - 23
chatbot.py

@@ -3,14 +3,15 @@ from discord.ext import commands
 import requests
 import json
 import os
-import random  # Ajouté pour choisir un sticker aléatoire
+import random
 from dotenv import load_dotenv
+from datetime import datetime
 
 # Charger les variables d'environnement
 load_dotenv()
 
 # Version du bot
-VERSION = "4.0.0"  # Modifiable selon la version actuelle
+VERSION = "4.0.1"  # Modifiable selon la version actuelle
 
 # Récupérer les variables d'environnement
 MISTRAL_API_KEY = os.getenv('MISTRAL_API_KEY')
@@ -37,7 +38,7 @@ def load_history():
                             data[channel_id]["messages"] = data[channel_id]["messages"][-MAX_HISTORY_LENGTH:]
                 return data
             except json.JSONDecodeError:
-                print("Erreur de lecture du fichier d'historique. Création d'un nouveau fichier.")
+                print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Erreur de lecture du fichier d'historique. Création d'un nouveau fichier.")
                 return {}
     return {}
 
@@ -51,7 +52,7 @@ def get_personality_prompt():
         with open('personality_prompt.txt', 'r', encoding='utf-8') as file:
             return file.read().strip()
     except FileNotFoundError:
-        print("Le fichier personality_prompt.txt n'a pas été trouvé. Utilisation d'un prompt par défaut.")
+        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Le fichier personality_prompt.txt n'a pas été trouvé. Utilisation d'un prompt par défaut.")
         return """Tu es un assistant utile et poli qui peut analyser des images.
         Quand on te montre une image, décris-la et donne ton avis si on te le demande.
         Réponds toujours en français avec un ton naturel et amical.
@@ -70,7 +71,7 @@ bot = commands.Bot(command_prefix='!', intents=intents)
 
 @bot.event
 async def on_ready():
-    print(f'Le bot est connecté en tant que {bot.user}')
+    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] Le bot est connecté en tant que {bot.user}')
     global conversation_history
     conversation_history = load_history()
     # Récupérer le canal spécifié
@@ -167,12 +168,12 @@ def call_mistral_api(prompt, history, image_url=None, user_id=None, username=Non
                 save_history(conversation_history)
                 return assistant_response
             else:
-                print(f"Réponse API inattendue: {response_data}")
+                print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Réponse API inattendue: {response_data}")
                 return "Désolé, je n'ai pas reçu de réponse valide de l'API."
         else:
             return f"Erreur API: {response.status_code}"
     except requests.exceptions.RequestException as e:
-        print(f"Erreur lors de l'appel API: {e}")
+        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Erreur lors de l'appel API: {e}")
         return "Désolé, une erreur réseau est survenue lors de la communication avec l'API."
 
 @bot.command(name='reset')
@@ -203,7 +204,6 @@ async def on_message(message):
     # Ignorer les messages du bot lui-même
     if message.author == bot.user:
         return
-
     # Vérifier si le message contient des stickers
     if message.stickers:
         # Obtenir le serveur (guild) du message
@@ -212,31 +212,37 @@ async def on_message(message):
             # Obtenir la liste des stickers personnalisés du serveur
             stickers = guild.stickers
             if stickers:
-                # Choisir un sticker aléatoire (ou spécifique)
-                sticker = random.choice(stickers)
-                # Envoyer le sticker en réponse
-                await message.channel.send(stickers=[sticker])
+                # Mélanger la liste des stickers pour essayer dans un ordre aléatoire
+                random_stickers = random.sample(stickers, len(stickers))
+                for sticker in random_stickers:
+                    try:
+                        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Envoi du sticker: {sticker.name} (ID: {sticker.id})")
+                        await message.channel.send(stickers=[sticker])
+                        break  # Si ça marche, on sort de la boucle
+                    except discord.errors.Forbidden as e:
+                        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Erreur lors de l'envoi du sticker: {sticker.name} (ID: {sticker.id}). Erreur: {e}")
+                        continue
+                else:
+                    # Si aucun sticker n'a pu être envoyé
+                    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Aucun sticker utilisable trouvé sur ce serveur.")
+                    await message.channel.send("Aucun sticker utilisable trouvé sur ce serveur.")
             else:
                 await message.channel.send("Aucun sticker personnalisé trouvé sur ce serveur.")
         else:
             await message.channel.send("Ce message ne provient pas d'un serveur.")
         return  # Retourner pour éviter que le reste du code ne s'exécute
-
     # Vérifier si le message provient du channel spécifique
     if message.channel.id != CHANNEL_ID:
         return
-
     # Si le message commence par le préfixe du bot, traiter comme une commande
     if message.content.startswith('!'):
         await bot.process_commands(message)
         return
-
     # Résolution des mentions dans le message
     resolved_content = message.content
     for user in message.mentions:
         # Remplacer chaque mention par le nom d'utilisateur
         resolved_content = resolved_content.replace(f"<@{user.id}>", f"@{user.display_name}")
-
     # Vérifier le nombre d'images dans le message
     image_count = 0
     if message.attachments:
@@ -247,7 +253,6 @@ async def on_message(message):
         if image_count > 3:
             await message.channel.send("Erreur : Vous ne pouvez pas envoyer plus de trois images dans un seul message. Veuillez diviser votre envoi en plusieurs messages.")
             return
-
     # Vérifier les pièces jointes pour la taille des images
     if message.attachments:
         # D'abord, vérifier toutes les images pour leur taille
@@ -262,7 +267,6 @@ async def on_message(message):
             image_list = ", ".join(too_large_images)
             await message.channel.send(f"Erreur : Les images suivantes dépassent la limite de 2 Mo : {image_list}. Veuillez envoyer des images plus petites.")
             return
-
     # Récupérer ou initialiser l'historique pour ce channel
     channel_id = str(message.channel.id)
     global conversation_history
@@ -277,7 +281,6 @@ async def on_message(message):
     # Assurer que la clé messages existe
     if "messages" not in conversation_history[channel_id]:
         conversation_history[channel_id]["messages"] = []
-
     # Traitement des images dans le message
     image_url = None
     if message.attachments:
@@ -285,10 +288,8 @@ async def on_message(message):
             if attachment.content_type and attachment.content_type.startswith('image/'):
                 image_url = attachment.url
                 break
-
     # Utiliser le contenu résolu (avec les mentions remplacées)
     prompt = resolved_content
-
     # Indiquer que le bot est en train de taper
     async with message.channel.typing():
         try:
@@ -302,9 +303,8 @@ async def on_message(message):
             )
             await message.channel.send(response)
         except Exception as e:
-            print(f"Erreur lors de l'appel à l'API: {e}")
+            print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Erreur lors de l'appel à l'API: {e}")
             await message.channel.send("Désolé, une erreur est survenue lors du traitement de votre demande.")
-
     # Assurer que les autres gestionnaires d'événements reçoivent également le message
     await bot.process_commands(message)