|
|
@@ -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)
|