myircbot/plugins/grab.py
2025-05-29 22:58:53 +02:00

138 lines
4.6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.")