80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
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
|