Skip to content

Latest commit

 

History

History
115 lines (83 loc) · 11.6 KB

File metadata and controls

115 lines (83 loc) · 11.6 KB

Bump Bot

Bot de Discord que detecta cuándo se usó /bump (Disboard), borra los mensajes de Disboard, y avisa en un canal configurable cuándo termina el enfriamiento de 2 horas. Funciona en varios servidores a la vez, cada uno con su propia configuración. También incluye un comando /alarm para avisos rápidos tipo temporizador, y un sistema de memes diarios automáticos vía webhook.

Funcionalidades

  • Detección automática de Disboard: escucha los embeds que envía Disboard en cualquier canal del servidor, sin necesidad de fijar un canal fijo.
  • Recordatorio de enfriamiento: cuando pasan las 2 horas (configurable), avisa en el canal definido y borra el aviso anterior antes de mandar el nuevo.
  • Multi-servidor: cada servidor tiene su propia configuración (canal de aviso, rol a mencionar, próximo bump), guardada en SQLite.
  • Sobrevive a reinicios: si el bot se reinicia, retoma los temporizadores de bump pendientes leyendo la base de datos.
  • /alarm: pon un aviso rápido tipo 5m, 30s o 1h20m y el bot te menciona en el mismo canal cuando se cumple.
  • Memes diarios: configura un canal para recibir un meme automático todos los días a una hora fija, publicado vía webhook.
  • Comandos slash protegidos: la configuración (/bump-config, /setmemechannel) requiere el permiso "Administrar servidor".

Arquitectura

El proyecto está separado por responsabilidades (principios SOLID) para que sea fácil de mantener y extender:

bump-bot/ ├── bot.py # Composition root: arma todo y lo conecta ├── config.py # Lee y valida variables de entorno ├── db/ │ ├── database.py # Conexión SQLite (bajo nivel) │ └── repositories.py # Interfaces + implementaciones de acceso a datos ├── services/ │ ├── duration_parser.py # Parsea "5m", "30s", "1h20m" → segundos │ ├── scheduler.py # Temporizadores genéricos (bump y alarm lo comparten) │ ├── disboard_classifier.py # Interpreta los embeds de Disboard │ └── meme_fetcher.py # Obtiene memes desde meme-api.com └── cogs/ ├── bump.py # Escucha Disboard y gestiona el recordatorio ├── bump_config_commands.py # /bump-config canal|rol|ver ├── alarm.py # /alarm └── meme.py # /setmemechannel y tarea diaria de memes

Ningún módulo depende de implementaciones concretas de otro salvo a través de constructores (inyección de dependencias) — por ejemplo, BumpCog no sabe que la base de datos es SQLite, solo conoce la interfaz GuildConfigRepository. Lo mismo aplica para memes: MemeCog depende de MemeConfigRepository (interfaz), no de SQLiteMemeConfigRepository directamente.

Requisitos

  • Python 3.10+
  • Una app de Discord con el bot creado en el Developer Portal
  • Intent MESSAGE CONTENT habilitado en el portal de desarrolladores
  • Permiso "Administrar webhooks" para el bot (necesario para /setmemechannel)

Instalación

git clone <tu-repo>
cd bump-bot
python -m venv venv
source venv/bin/activate  # En Windows: venv\Scripts\activate
pip install -r requirements.txt

Crea un archivo .env en la raíz (puedes copiar .env.example):

DISCORD_TOKEN=tu_token_aqui
TIEMPO_ENFRIAMIENTO=7200
DB_PATH=bumpbot.db
EMOJI_BUMP_ID=
EMOJI_ANIMADO=false
Variable Descripción Por defecto
DISCORD_TOKEN Token del bot (obligatorio)
TIEMPO_ENFRIAMIENTO Segundos de enfriamiento de bump 7200 (2h)
DB_PATH Ruta del archivo SQLite bumpbot.db
EMOJI_BUMP_ID ID de un emoji custom para el aviso (opcional) vacío → usa 🎉
EMOJI_ANIMADO true si el emoji custom es animado false

Ejecutar

python bot.py

Comandos

/bump-config canal <#canal>

Define en qué canal se publica el aviso de "ya puedes bumpear". Requiere permiso de Administrar servidor.

/bump-config rol <@rol>

Define un rol a mencionar en cada aviso. Opcional — si no se pasa, quita la mención. Requiere permiso de Administrar servidor.

/bump-config ver

Muestra la configuración actual del servidor: canal, rol y próximo aviso.

/alarm duracion:<texto> [motivo:<texto>]

Programa un aviso en el canal actual. Formato de duración: combinación de h, m, s (ej. 30s, 5m, 1h20m), máximo 24h.

/alarm duracion:5m /alarm duracion:1h20m motivo:"revisar el horno"

/setmemechannel canal:<#canal> [hora:<0-23>] [subreddit:<texto>]

Configura el canal donde se publicará un meme automático todos los días. Crea (o reutiliza) un webhook llamado "Meme Bot" en el canal indicado. La hora es en formato 24h UTC. Si no se especifica subreddit, trae memes aleatorios de varios subreddits populares. Requiere permiso de Administrar servidor.

/setmemechannel canal:#memes hora:15 /setmemechannel canal:#memes hora:15 subreddit:me_irl

Persistencia

  • La configuración por servidor (bump, memes) y el temporizador de bump se guardan en SQLite (bumpbot.db) y sobreviven a reinicios del bot.
  • Las alarmas (/alarm) viven solo en memoria: si el bot se reinicia mientras una alarma está activa, se pierde. Es una decisión deliberada para mantener el bot simple, ya que son avisos cortos (minutos) para uso personal. Si en algún momento necesitas que sobrevivan a reinicios, se puede persistir en la misma base SQLite sin añadir infraestructura nueva.

Hosting

Pensado para correr en un host gratuito tipo bot-hosting.net (o similar basado en Pterodactyl). No necesitas una base de datos gestionada aparte: SQLite guarda su archivo en el disco del contenedor, que persiste mientras no borres el servidor. Solo recuerda:

  • Renovar el servicio gratuito según lo pida tu host (en bot-hosting.net es manual cada 4 días).
  • Configurar DISCORD_TOKEN y demás variables desde el panel de variables de entorno, no hardcodeadas en el código.