import sqlite3 import os import random from plugins.database import get_db_connection, get_last_message DB_FILE = "/var/lib/bot/grabs.db" class GrabPlugin: """Gestor de frases grabadas con soporte SQLite.""" def __init__(self): self.last_messages = {} # Diccionario {nick: última frase} self.init_db() def get_db_connection(self): """Obtiene una conexión a la base de datos SQLite.""" return sqlite3.connect(DB_FILE) def init_db(self): """Inicializa la base de datos si no existe.""" os.makedirs(os.path.dirname(DB_FILE), exist_ok=True) conn = self.get_db_connection() cursor = conn.cursor() # Crear la tabla de grabs si no existe cursor.execute(""" CREATE TABLE IF NOT EXISTS grabs ( id INTEGER PRIMARY KEY AUTOINCREMENT, nick TEXT NOT NULL, message TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) """) conn.commit() conn.close() def store_last_message(self, nick, message): """Guarda la última frase de un usuario antes de ser grabada.""" self.last_messages[nick] = message # Se asegura de que `self.last_messages` esté definido def grab(self, nick): """Guarda la última frase de un usuario si aún no está grabada.""" if nick not in self.last_messages: return f"️ No hay frases recientes de {nick} para grabar." message = self.last_messages[nick] # Verificar si el mensaje ya está en los grabs del usuario conn = self.get_db_connection() cursor = conn.cursor() cursor.execute("SELECT COUNT(*) FROM grabs WHERE nick = ? AND message = ?", (nick, message)) exists = cursor.fetchone()[0] conn.close() if exists > 0: return f"️ La última frase de {nick} ya está grabada." # Guardar en la base de datos conn = self.get_db_connection() cursor = conn.cursor() cursor.execute("INSERT INTO grabs (nick, message) VALUES (?, ?)", (nick, message)) conn.commit() conn.close() return f" Frase grabada de {nick}." def list_grabs(self, nick): """Lista los índices de los grabs disponibles de un usuario.""" conn = get_db_connection() cursor = conn.cursor() cursor.execute("SELECT id FROM grabs WHERE nick = ?", (nick,)) rows = cursor.fetchall() conn.close() if not rows: return f" {nick} no tiene frases grabadas." indices = ", ".join(str(row[0]) for row in rows) return f" Grab indices de {nick}: {indices}" def get_grab(self, nick, grab_id=None): """Devuelve un grab aleatorio o por ID.""" conn = get_db_connection() cursor = conn.cursor() if grab_id: cursor.execute("SELECT message FROM grabs WHERE nick = ? AND id = ?", (nick, grab_id)) else: cursor.execute("SELECT message FROM grabs WHERE nick = ? ORDER BY RANDOM() LIMIT 1", (nick,)) row = cursor.fetchone() conn.close() return f"️ Grab de {nick}: \"{row[0]}\"" if row else f"️ {nick} no tiene grabs." def store_last_message(self, nick, message): """Guarda la última frase de un usuario, evitando duplicados.""" if not message.strip(): return # No almacenar mensajes vacíos # Si el mensaje ya es el último almacenado, no hacer nada if self.last_messages.get(nick) == message: return self.last_messages[nick] = message # Guardar solo si es nuevo def run(self, sender, *args): """Maneja el comando `.grab`.""" if not args: return " Uso: `.grab ` o `.grab list ` o `.grab rq [id]`" action = args[0].lower() if action == "list" and len(args) == 2: return self.list_grabs(args[1]) elif action == "rq" and len(args) >= 2: return self.get_grab(args[1], int(args[2]) if len(args) > 2 else None) elif len(args) == 1: return self.grab(args[0]) return " Uso incorrecto. Prueba `.grab `, `.grab list ` o `.grab rq [id]`." def help(): """Muestra la ayuda para el plugin de grabs.""" return (" Comandos de `.grab`:\n" " - `.grab ` → Guarda la última frase del usuario.\n" " - `.grab list ` → Lista los índices de grabs guardados.\n" " - `.grab rq ` → Muestra un grab aleatorio.\n" " - `.grab rq ` → Muestra el grab con ID específico.")