Beta/brain/moderation.py

81 lines
2.6 KiB
Python
Raw Permalink Normal View History

2026-06-16 17:09:34 +00:00
import sqlite3
import datetime
import logging
from typing import Optional
logger = logging.getLogger('Beta')
2026-06-16 17:09:34 +00:00
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