PROYECTO EN PRODUCCIÓN · 2024 — 2026 (ACTUALIDAD)

Dabot

Bot de Discord multipropósito y panel FastAPI. Moderación, tickets, economía y reproductor de música HD 24/7 en Docker.

Python 3.12 discord.py 2.x FastAPI yt-dlp + Audio Engine Web Player SQLite WAL Docker Compose OAuth2 PKCE

Qué es

Dabot no es un bot de “tres comandos de moderación”. Es un producto: el mismo proceso cubre un servidor de Discord (slash commands, eventos, jobs) y un sitio público en dabot.davito.es donde el staff configura el guild con su cuenta de Discord.

Hay 90 cogs cargados (~55k líneas de Python, ~100 tablas). Incluye un stack completo de audio (music) con yt-dlp, autoplay inteligente estilo Spotify, radios 24/7 y reproductor web interactivo sincronizado en tiempo real. main.py omite tts. La config viva de cada guild es JSON en SQLite (guild_configs), no YAML. El estado (tickets, economía, cola de música, sesiones web, infracciones, alts) comparte el mismo dabot.db en WAL entre el bot y la API. Inventario: docs/MODULES.md.

Cómo está montado

Docker Compose levanta dos servicios: dabot-bot (python main.py, health por /tmp/bot_alive) y dabot-api (uvicorn, health GET /healthz). Comparten volúmenes de código, configs, templates y la base. El puerto de la API solo escucha en localhost; nginx publica el dominio.

Al arrancar: .env → permisos del owner → ConfigManager → sesión aiohttp → bot.db.setup() → traductor de slash → load_extensions() → bot.start. Hay un guardia anti crash-loop (restart_state.json) y un RepairEngine si el proceso muere en bucle.

Módulos (cogs)

Cada archivo en cogs/ es una extensión de discord.py. Agrupados por lo que hacen de verdad:

Moderación

moderation.py grupo /mod: kick, ban, timeout, warns, purge, apelaciones, CSV.

AutoMod propio

automod.py spam, flood, invites, unicode, /antilinks. Complementa reglas nativas en discord_automod.py.

Anti-raid / anti-nuke

antiraid.py lockdown por flood de joins. antinuke.py límites y whitelist contra acciones masivas.

Verificación

verification.py captcha/emoji/math. La web aporta IP/device que Discord no da al bot (alt_intel.py, proxy_detect.py).

Tickets

tickets.py panel, categorías, mensajes en SQLite, transcripts HTML. ticket_extras.py CSAT y snippets.

Niveles

leveling.py XP de texto (cooldown 60 s) y loop de voz, tarjetas Pillow, roles por nivel, leaderboard.

IA

chatbot.py pool Gemini / Groq / Cohere / OpenAI / OpenRouter / HF / Cloudflare. gemini_client.py rota claves y modelos.

Economía y juegos

economy.py casino.py games.py — por servidor, no un global único.

Voz temporal

voice.py join-to-create. Stats de tiempo en voice_stats.py.

Backups

server_backup.py y plantillas en server_templates.py, también disparables desde el panel.

Privacidad

privacy.py exportar/borrar datos. Fingerprints en privacy_crypto.py.

i18n

langs/*.json (es, en, fr, de, it, pt, ja, ko, zh). El bot traduce embeds y descripciones de slash en caliente.

Logs y alts

logging.py canales por tipo. La web ve IP/device (alt_intel.py) que Discord no da al bot.

Last.fm y voz

lastfm.py scrobbles en /cuenta. voice.py join-to-create; streams.py alertas.

Música HD

music.py yt-dlp con cookies, YouTube, Spotify, Deezer, autocompletado y cola reactiva.

Radios 24/7 & Lofi

Autoplay continuo estilo Spotify con prefetching, Modo Lofi y 8 emisoras de radio en vivo tolerantes a cortes.

Servidor

RSS, starboard, giveaways, foros, comandos custom, autorespuestas, anuncios, webhooks, hooks de GitHub. Lista: MODULES.md.

Sistema de Música Avanzado & Radios 24/7

Implementación completa en cogs/music.py con motor yt-dlp y pipeline de audio de alta fidelidad con FFmpeg Opus directo a Discord Voice, diseñado para no congelar el bucle de eventos asyncio.

  • Autenticación con cookies: Montaje de cookies.txt en Docker en modo lectura para evadir bloqueos por detección de bots de YouTube, sign-in restrictions y throttling de ancho de banda.
  • Detección y extracción multiplataforma: Detección automática y resolución transparente de enlaces y playlists de YouTube, Spotify, Deezer, Apple Music y SoundCloud, además de búsqueda directa por texto.
  • Autocompletado en tiempo real: Búsqueda asíncrona interactiva que ofrece sugerencias de temas y artistas directamente en el selector de Discord mientras el usuario escribe en /play.
  • Autoplay inteligente con prefetching: Cuando la cola termina, el bot calcula pistas similares y relacionadas (estilo Spotify). Para evitar latencia o silencios entre canciones, realiza una pre-descarga/extracción anticipada de la siguiente pista en segundo plano mientras la actual sigue sonando. Cuota diaria de 20 canciones para servidores gratuitos y reproducción ilimitada para servidores Premium.
  • Modo 24/7 y Modo Lofi (Premium): Permanencia continua en el canal de voz sin desconexión por inactividad. Modo Lofi dedicado con streams relajantes de baja latencia.
  • Modo Radio en Vivo: Sintonizador de 8 emisoras web temáticas (Lofi Girl, Synthwave, Chillhop Café, Pop Hits, Rock Clásico, Clásica & Estudio, EDM Gaming, Ambient Relax) con flags de reconexión automática FFmpeg (-reconnect 1 -reconnect_streamed 1).
  • Calidad y calibración sonora: Pipeline Opus sin pérdidas a 48kHz estéreo, normalización de volumen y prevención estricta de aceleración o distorsión de tono.
  • Reproductor interactivo en el panel web: Control en tiempo real desde dabot.davito.es/servers/{id}/music para pausar, reanudar, saltar pistas, vaciar la cola, ajustar volumen, reproducir desde un segundo concreto y sincronizar la barra de progreso con el bot.

El panel (dabot.davito.es)

dashboard_server.py es una API FastAPI, no un adorno. Login con Discord OAuth2 + PKCE S256, state en SQLite, cookie de sesión, CSRF en /api/*, CSP y HSTS. El staff ve canales, roles, config JSON (SQLite), infracciones, tickets, reproductor interactivo y cola de música en vivo, leaderboard, backups y una consola live de mensajes. /healthz y /api/status viven en routers aparte.

Rutas públicas y de gestión: /, /dashboard, /servers, /servers/{id}/music (reproductor web sincronizado), /niveles, /normas, /verify, /premium, /cuenta. Webhooks de Stripe / Sellix / Discord para premium. Health en /healthz.

Sitios del código que importan

Localización transparente. En main.py se parchean Context.send e InteractionResponse.send_message para traducir content, embeds y views según el idioma del guild. Los cogs viejos no tienen que saber de i18n.

Audio con prefetching y streaming asíncrono. En cogs/music.py, la extracción de enlaces y metadatos corre en un threadpool sin bloquear el heartbeat de discord.py. El autoplay anticipa la siguiente pista resolviendo el stream antes de que termine la actual, mientras que la dashboard se comunica mediante colas en memoria y llamadas locales para reflejar el estado del reproductor sin retardo.

IA con recambio. utils/gemini_client.py prueba varios modelos y varias claves; si una da 429, la enfría y sigue. El chatbot elige proveedor según complejidad, no un SDK único.

Tickets full-stack. Cada mensaje se guarda en SQLite y el panel lo lee. Si el guild tiene canal de transcripciones, se replica a Discord. El HTML de transcript se sirve en /tickets/{id}/transcript.

Operación & Seguridad

Secretos solo en .env y dabot-secrets.env (token, OAuth client secret, claves de IA, Stripe). El repo público lleva .env.example vacío. La SQLite y las plantillas YAML de import no se publican. Healthchecks independientes bot/API. El dominio dabot.davito.es entra por Cloudflare Tunnel (Argo Tunnel) directo al contenedor sin exponer puertos al exterior; la API valida CSRF, rate limit con CF-Connecting-IP, CSP estricto y SameSite en cookies.