138 lines
4.6 KiB
Python
138 lines
4.6 KiB
Python
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 <nick>` o `.grab list <nick>` o `.grab rq <nick> [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 <nick>`, `.grab list <nick>` o `.grab rq <nick> [id]`."
|
||
|
||
def help():
|
||
"""Muestra la ayuda para el plugin de grabs."""
|
||
return (" Comandos de `.grab`:\n"
|
||
" - `.grab <nick>` → Guarda la última frase del usuario.\n"
|
||
" - `.grab list <nick>` → Lista los índices de grabs guardados.\n"
|
||
" - `.grab rq <nick>` → Muestra un grab aleatorio.\n"
|
||
" - `.grab rq <nick> <id>` → Muestra el grab con ID específico.")
|
||
|