import sqlite3 import datetime import logging from typing import Optional logger = logging.getLogger('Superviseur') DB_PATH = 'data/mod.db' def init_db(): """Initialise la base de données de modération.""" conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS infractions ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT NOT NULL, username TEXT, guild_id TEXT, content TEXT, score REAL, reason TEXT, timestamp TEXT ) ''') conn.commit() conn.close() logger.info("✅ Base de données de modération initialisée.") def log_infraction(user_id: str, username: str, guild_id: str, content: str, score: float, reason: str): """Enregistre une note de modération en base de données.""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() timestamp = datetime.datetime.now().isoformat() cursor.execute(''' INSERT INTO infractions (user_id, username, guild_id, content, score, reason, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?) ''', (user_id, username, guild_id, content, score, reason, timestamp)) conn.commit() conn.close() except Exception as e: logger.error(f"Erreur lors de l'enregistrement de l'infraction: {e}") async def scan_message_toxicity(llm_manager, content: str) -> Optional[dict]: """ Analyse le contenu d'un message via l'IA pour obtenir une note de toxicité. Retourne un dict {score, reason} ou None. """ if not content or len(content.strip()) < 3: return None prompt = ( "Analyse la toxicité de ce message Discord. " "Réponds UNIQUEMENT au format JSON suivant : " "{\"score\": <0.0 à 1.0>, \"reason\": \"brève explication\"}\n" "Un score de 0.0 est neutre/positif, 1.0 est extrêmement dégradant/toxique.\n" f"Message : \"{content}\"" ) payload = { "prompt": prompt, "system_prompt": "Tu es un expert en modération. Sois objectif et juste.", "temperature": 0.1, "max_tokens": 300, "force_json": True, "stop": ["User:", "Assistant:"] } try: # On utilise une version simplifiée de l'appel pour gagner du temps raw_resp = await llm_manager.call_llama(payload) import json data = json.loads(llm_manager.extract_json_actions(raw_resp) or "{}") if 'score' in data: return data except Exception as e: logger.error(f"Erreur scan toxicité: {e}") return None