Browse Source

Version 4.0.1

Johnounet 2 months ago
parent
commit
f93b1d18e2
1 changed files with 23 additions and 23 deletions
  1. 23 23
      chatbot.py

+ 23 - 23
chatbot.py

@@ -3,14 +3,15 @@ from discord.ext import commands
 import requests
 import requests
 import json
 import json
 import os
 import os
-import random  # Ajouté pour choisir un sticker aléatoire
+import random
 from dotenv import load_dotenv
 from dotenv import load_dotenv
+from datetime import datetime
 
 
 # Charger les variables d'environnement
 # Charger les variables d'environnement
 load_dotenv()
 load_dotenv()
 
 
 # Version du bot
 # 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
 # Récupérer les variables d'environnement
 MISTRAL_API_KEY = os.getenv('MISTRAL_API_KEY')
 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:]
                             data[channel_id]["messages"] = data[channel_id]["messages"][-MAX_HISTORY_LENGTH:]
                 return data
                 return data
             except json.JSONDecodeError:
             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 {}
     return {}
     return {}
 
 
@@ -51,7 +52,7 @@ def get_personality_prompt():
         with open('personality_prompt.txt', 'r', encoding='utf-8') as file:
         with open('personality_prompt.txt', 'r', encoding='utf-8') as file:
             return file.read().strip()
             return file.read().strip()
     except FileNotFoundError:
     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.
         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.
         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.
         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
 @bot.event
 async def on_ready():
 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
     global conversation_history
     conversation_history = load_history()
     conversation_history = load_history()
     # Récupérer le canal spécifié
     # 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)
                 save_history(conversation_history)
                 return assistant_response
                 return assistant_response
             else:
             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."
                 return "Désolé, je n'ai pas reçu de réponse valide de l'API."
         else:
         else:
             return f"Erreur API: {response.status_code}"
             return f"Erreur API: {response.status_code}"
     except requests.exceptions.RequestException as e:
     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."
         return "Désolé, une erreur réseau est survenue lors de la communication avec l'API."
 
 
 @bot.command(name='reset')
 @bot.command(name='reset')
@@ -203,7 +204,6 @@ async def on_message(message):
     # Ignorer les messages du bot lui-même
     # Ignorer les messages du bot lui-même
     if message.author == bot.user:
     if message.author == bot.user:
         return
         return
-
     # Vérifier si le message contient des stickers
     # Vérifier si le message contient des stickers
     if message.stickers:
     if message.stickers:
         # Obtenir le serveur (guild) du message
         # Obtenir le serveur (guild) du message
@@ -212,31 +212,37 @@ async def on_message(message):
             # Obtenir la liste des stickers personnalisés du serveur
             # Obtenir la liste des stickers personnalisés du serveur
             stickers = guild.stickers
             stickers = guild.stickers
             if 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:
             else:
                 await message.channel.send("Aucun sticker personnalisé trouvé sur ce serveur.")
                 await message.channel.send("Aucun sticker personnalisé trouvé sur ce serveur.")
         else:
         else:
             await message.channel.send("Ce message ne provient pas d'un serveur.")
             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
         return  # Retourner pour éviter que le reste du code ne s'exécute
-
     # Vérifier si le message provient du channel spécifique
     # Vérifier si le message provient du channel spécifique
     if message.channel.id != CHANNEL_ID:
     if message.channel.id != CHANNEL_ID:
         return
         return
-
     # Si le message commence par le préfixe du bot, traiter comme une commande
     # Si le message commence par le préfixe du bot, traiter comme une commande
     if message.content.startswith('!'):
     if message.content.startswith('!'):
         await bot.process_commands(message)
         await bot.process_commands(message)
         return
         return
-
     # Résolution des mentions dans le message
     # Résolution des mentions dans le message
     resolved_content = message.content
     resolved_content = message.content
     for user in message.mentions:
     for user in message.mentions:
         # Remplacer chaque mention par le nom d'utilisateur
         # Remplacer chaque mention par le nom d'utilisateur
         resolved_content = resolved_content.replace(f"<@{user.id}>", f"@{user.display_name}")
         resolved_content = resolved_content.replace(f"<@{user.id}>", f"@{user.display_name}")
-
     # Vérifier le nombre d'images dans le message
     # Vérifier le nombre d'images dans le message
     image_count = 0
     image_count = 0
     if message.attachments:
     if message.attachments:
@@ -247,7 +253,6 @@ async def on_message(message):
         if image_count > 3:
         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.")
             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
             return
-
     # Vérifier les pièces jointes pour la taille des images
     # Vérifier les pièces jointes pour la taille des images
     if message.attachments:
     if message.attachments:
         # D'abord, vérifier toutes les images pour leur taille
         # 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)
             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.")
             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
             return
-
     # Récupérer ou initialiser l'historique pour ce channel
     # Récupérer ou initialiser l'historique pour ce channel
     channel_id = str(message.channel.id)
     channel_id = str(message.channel.id)
     global conversation_history
     global conversation_history
@@ -277,7 +281,6 @@ async def on_message(message):
     # Assurer que la clé messages existe
     # Assurer que la clé messages existe
     if "messages" not in conversation_history[channel_id]:
     if "messages" not in conversation_history[channel_id]:
         conversation_history[channel_id]["messages"] = []
         conversation_history[channel_id]["messages"] = []
-
     # Traitement des images dans le message
     # Traitement des images dans le message
     image_url = None
     image_url = None
     if message.attachments:
     if message.attachments:
@@ -285,10 +288,8 @@ async def on_message(message):
             if attachment.content_type and attachment.content_type.startswith('image/'):
             if attachment.content_type and attachment.content_type.startswith('image/'):
                 image_url = attachment.url
                 image_url = attachment.url
                 break
                 break
-
     # Utiliser le contenu résolu (avec les mentions remplacées)
     # Utiliser le contenu résolu (avec les mentions remplacées)
     prompt = resolved_content
     prompt = resolved_content
-
     # Indiquer que le bot est en train de taper
     # Indiquer que le bot est en train de taper
     async with message.channel.typing():
     async with message.channel.typing():
         try:
         try:
@@ -302,9 +303,8 @@ async def on_message(message):
             )
             )
             await message.channel.send(response)
             await message.channel.send(response)
         except Exception as e:
         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.")
             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
     # Assurer que les autres gestionnaires d'événements reçoivent également le message
     await bot.process_commands(message)
     await bot.process_commands(message)