Browse Source

[2.9.0] Thread creation for automatic status update

Penta 3 weeks ago
parent
commit
73c017930f
1 changed files with 48 additions and 1 deletions
  1. 48 1
      chatbot.py

+ 48 - 1
chatbot.py

@@ -12,6 +12,7 @@ from PIL import Image
 from io import BytesIO
 from datetime import datetime, timezone, timedelta
 from charset_normalizer import from_bytes
+from discord.ext import tasks
 
 # Charger les variables d'environnement depuis le fichier .env
 load_dotenv()
@@ -28,11 +29,12 @@ TEMPERATURE = float(os.getenv('TEMPERATURE', "1.0"))
 BOOT_MESSAGE = os.getenv('BOOT_MESSAGE', "true").lower()
 LOG_LEVEL = os.getenv('LOG_LEVEL', "INFO").upper()
 HISTORY_ANALYSIS_IMAGE = os.getenv('HISTORY_ANALYSIS_IMAGE', "false").lower()
+PROMPT_STATUS_CHANGE = str(os.getenv('PROMPT_STATUS_CHANGE', "Rédige un message court qui sera utilisé en tant que status sur Discord"))
 
 # Initialiser le client OpenAI asynchrone ici
 openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY, base_url=URL_OPENAI_API)
 
-BOT_VERSION = "2.8.3"
+BOT_VERSION = "2.9.0"
 
 # 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:
@@ -227,6 +229,9 @@ except ValueError:
     raise ValueError("L'ID du channel Discord est invalide. Assurez-vous qu'il s'agit d'un entier.")
 
 class MyDiscordClient(discord.Client):
+    async def setup_hook(self):
+        update_status.start()
+
     async def close(self):
         global openai_client
 
@@ -239,6 +244,7 @@ class MyDiscordClient(discord.Client):
 # Initialiser le client Discord avec les intents modifiés
 client_discord = MyDiscordClient(intents=intents)
 
+
 # Appeler la fonction pour charger l'historique au démarrage
 load_conversation_history()
 
@@ -355,6 +361,24 @@ async def call_openai_api(user_text, user_name):
 
     return None
 
+
+async def call_openai_api_system(system_text):
+    # Préparer le contenu pour l'appel API
+    message = {
+        "role": "system",
+        "content": PERSONALITY_PROMPT + f"\n\nPour cette réponse uniquement : {system_text}"
+    }
+
+    response = await openai_client.chat.completions.create(
+        model=MODEL,
+        stream=False,
+        messages=[message],
+        temperature=1.2
+    )
+
+    return response
+
+
 @client_discord.event
 async def on_ready():
     logger.info(f'{BOT_NAME} connecté en tant que {client_discord.user}')
@@ -527,5 +551,28 @@ async def add_to_conversation_history(new_message):
         save_conversation_history()
         logger.info(f"{excess_messages} messages les plus anciens ont été supprimés.")
 
+
+@tasks.loop(minutes=10)
+async def update_status():
+    try:
+        reply = await call_openai_api_system(PROMPT_STATUS_CHANGE)
+        status = reply.choices[0].message.content
+
+        logger.info(f"Nouveau status Discord: '{status}'")
+        await client_discord.change_presence(
+            activity=discord.Activity(
+                type=discord.ActivityType.watching,
+                name=status
+            )
+        )
+    except Exception as e:
+        logger.warning(f"Impossible de changer le status Discord : {e}")
+
+@update_status.before_loop
+async def before_update_status():
+    await client_discord.wait_until_ready()
+    logger.info("Démarrage de la tâche update_status")
+
+
 # Démarrer le bot Discord
 client_discord.run(DISCORD_TOKEN)