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

Bot de Discord multipropósito y panel FastAPI. Moderación, tickets, economía y reproductor de música HD 24/7 en Docker.
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.
Dabot is a product, not a three-command mod bot: one codebase covers a Discord server and a public dashboard at dabot.davito.es where staff signs in with Discord.
90 cogs loaded (~55k lines of Python, ~100 tables). Includes a full audio stack (music) with yt-dlp, Spotify-style intelligent autoplay, 24/7 radios, and a live synced web player. tts is skipped. Live per-guild config is JSON in SQLite (guild_configs), not YAML. State (tickets, economy, music queue, web sessions, alts) shares dabot.db in WAL between the bot and API. Inventory: docs/MODULES.md.
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.
Compose runs two services: the bot (heartbeat file) and the API (/healthz). They share code, configs, templates and the database. The API binds localhost; nginx publishes the domain.
Boot: env → owner permissions → config → aiohttp → SQLite setup → slash translator → load cogs → start. Crash-loop guard plus a repair engine if it dies in a loop.
Cada archivo en cogs/ es una extensión de discord.py. Agrupados por lo que hacen de verdad:
Each file in cogs/ is a discord.py extension, grouped by what they actually do:
moderation.py grupo /mod: kick, ban, timeout, warns, purge, apelaciones, CSV.
automod.py spam, flood, invites, unicode, /antilinks. Complementa reglas nativas en discord_automod.py.
antiraid.py lockdown por flood de joins. antinuke.py límites y whitelist contra acciones masivas.
verification.py captcha/emoji/math. La web aporta IP/device que Discord no da al bot (alt_intel.py, proxy_detect.py).
tickets.py panel, categorías, mensajes en SQLite, transcripts HTML. ticket_extras.py CSAT y snippets.
leveling.py XP de texto (cooldown 60 s) y loop de voz, tarjetas Pillow, roles por nivel, leaderboard.
chatbot.py pool Gemini / Groq / Cohere / OpenAI / OpenRouter / HF / Cloudflare. gemini_client.py rota claves y modelos.
economy.py casino.py games.py — por servidor, no un global único.
voice.py join-to-create. Stats de tiempo en voice_stats.py.
server_backup.py y plantillas en server_templates.py, también disparables desde el panel.
privacy.py exportar/borrar datos. Fingerprints en privacy_crypto.py.
langs/*.json (es, en, fr, de, it, pt, ja, ko, zh). El bot traduce embeds y descripciones de slash en caliente.
logging.py canales por tipo. La web ve IP/device (alt_intel.py) que Discord no da al bot.
lastfm.py scrobbles en /cuenta. voice.py join-to-create; streams.py alertas.
music.py yt-dlp con cookies, YouTube, Spotify, Deezer, autocompletado y cola reactiva.
Autoplay continuo estilo Spotify con prefetching, Modo Lofi y 8 emisoras de radio en vivo tolerantes a cortes.
RSS, starboard, giveaways, foros, comandos custom, autorespuestas, anuncios, webhooks, hooks de GitHub. Lista: MODULES.md.
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.
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./play.-reconnect 1 -reconnect_streamed 1).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.Full implementation in cogs/music.py backed by yt-dlp and an FFmpeg Opus high-fidelity audio pipeline streaming directly to Discord Voice without blocking asyncio.
cookies.txt in Docker preventing YouTube bot detection blocks, sign-in walls, and bandwidth throttling./play.dabot.davito.es/servers/{id}/music allowing pause, resume, skip, seek to timestamp, volume adjustments, and live progress bar sync.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.
dashboard_server.py is a real FastAPI app: Discord OAuth2 + PKCE S256, SQLite state, session cookie, CSRF, CSP, HSTS. Staff gets config, infractions, tickets, live web music player and queue, backups, and a live message console.
Product routes include dashboard, servers, /servers/{id}/music (live synced web player), levels, rules, verify, premium. Stripe/Sellix/Discord webhooks. /healthz for the compose healthcheck.
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.
Transparent localization. main.py patches send/response so legacy cogs get translated embeds without knowing about 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.
Audio prefetching & async streaming. In cogs/music.py, extraction and stream resolution run in a threadpool so discord.py's heartbeat never misses a beat. Autoplay prefetches the subsequent stream before the current track finishes, while the web dashboard syncs with in-memory state and local API calls without latency.
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.
IA with failover. Gemini client rotates models and keys; 429 cools that key. The chatbot routes by complexity across a provider pool.
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.
Full-stack tickets. Every message is in SQLite for the dashboard; optional Discord transcript channel; HTML at /tickets/{id}/transcript.
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.
Secrets live in .env only (token, OAuth secrets, AI keys, Stripe). Public repo has an empty example file. SQLite and import YAML stay off git. Bot and API have separate healthchecks. dabot.davito.es enters via Cloudflare Argo Tunnel directly into the container without exposing host ports; the API enforces CSRF, rate limits keyed on CF-Connecting-IP, strict CSP, and SameSite cookies.