TrufaBot es un bot de Discord modular construido con Node.js + TypeScript.
Incluye un módulo de música con panel interactivo, autoplay con prefetch, soporte para YouTube y Spotify (con fallbacks), además de comandos de utilidad como /help, /ping, /uptime y /welcome.
El proyecto está pensado como base escalable para seguir agregando módulos y comandos sin romper la estructura actual.
Documentación principal del proyecto:
TrufaBot nace como un proyecto para:
- Aprender arquitectura de bots de Discord con una base modular y mantenible.
- Construir un módulo de música real con controles, cola, autoplay y validaciones.
- Practicar integración de múltiples librerías (
discord.js,DisTube,yt-dlp, Spotify). - Documentar el proceso completo (setup, flujo, debugging, decisiones técnicas).
También funciona como práctica avanzada de backend/eventos, manejo de estados por guild y troubleshooting de integraciones externas.
Para el detalle completo de arquitectura, flujo interno y evolución del proyecto:
- docs/GUIA-HISTORICA.md (documento maestro: setup + historia + flujo + troubleshooting)
- docs/discord-music-bot-architecture.md (visión macro / diseño arquitectónico y roadmap técnico)
- README.md (esta portada)
- docs/GUIA-HISTORICA.md (lectura principal; suficiente para entender el proyecto completo)
- docs/discord-music-bot-architecture.md (visión de alto nivel y crecimiento futuro)
- 🎵 Reproducción por texto (
/play despacito) - 🔗 Reproducción por URL (YouTube y Spotify)
- 📃 Playlists públicas (YouTube y Spotify) con carga progresiva
- 🎛️ Panel Now Playing con botones de control
- 🔁 Autoplay con prefetch y filtros anti-repetición
- ⏪⏩ Seek rápido (
rewind/forward) - 🔉 Control de volumen (
/volume) - 🧾 Cola paginada (
/queue) - 📌 Resumen de pista actual (
/nowplaying) - 🧹 Clear queue (
/clear) y salida de voz (/quit) - 🐱 Mensaje de bienvenida al entrar a un servidor + comando
/welcome - 📚 /help paginado con botones (índice + secciones)
- 📝 Logs estructurados con
pino - ⏱️ Auto-desconexión por inactividad y por canal vacío
- Node.js + TypeScript
- discord.js v14
- DisTube
- @distube/yt-dlp
- @distube/spotify
- @distube/youtube (modo extractor de búsqueda)
- ffmpeg
- @discordjs/voice
- pino (logs)
- Node.js 20+ (recomendado 20 LTS)
npmffmpeginstalado y disponible enPATH- Bot de Discord creado en el Developer Portal
Scopes recomendados al invitar el bot:
botapplications.commands
npm installcopy .env.example .envEn Linux/macOS usa:
cp .env.example .envDISCORD_TOKEN=tu_token_del_bot
CLIENT_ID=tu_application_client_id
GUILD_IDS=123456789012345678,987654321098765432Para mejorar estabilidad y evitar límites del modo scraping en playlists/álbumes grandes:
SPOTIFY_CLIENT_ID=...
SPOTIFY_CLIENT_SECRET=...npm run commands:registerSi agregas un comando nuevo o metes el bot a otro servidor, vuelve a correr ese script.
npm run devnpm run build
npm startLa salida compilada se genera en:
dist/
- Invita el bot al servidor.
- Registra comandos con
npm run commands:register. - Entra a un canal de voz.
- Usa
/join(opcional) o directamente/play <texto|url>. - Controla la reproducción desde el panel (
QUEUE,CLEAR,LOOP,AUTOPLAY, etc.). - Usa
/queue,/nowplaying,/volumepara operaciones rápidas.
/ping/uptime/help/welcome
/join/play/pause/resume/skip/back/autoplay/loop/rewind/forward/replay/nowplaying/queue/clear/volume/stop/quit
QUEUECLEARLOOPAUTOPLAYREWINDPAUSE/RESUMEFORWARDSKIPBACKREPLAYSTOP
DISCORD_TOKENCLIENT_IDGUILD_IDS
SPOTIFY_CLIENT_IDSPOTIFY_CLIENT_SECRET
LOG_LEVEL
MUSIC_NO_PLAYBACK_TIMEOUT_MSMUSIC_EMPTY_CHANNEL_TIMEOUT_MSMUSIC_LOCK_TIMEOUT_MSMUSIC_STALE_LOCK_RELEASE_MSMUSIC_AUTOPLAY_RECENT_LIMITMUSIC_AUTOPLAY_RECENT_TTL_MSMUSIC_AUTOPLAY_RANDOM_POOL_SIZEMUSIC_PLAYLIST_PROGRESSIVE_FLAT_TIMEOUT_MSMUSIC_PLAYLIST_PROGRESSIVE_MAX_ENTRIESMUSIC_PLAYLIST_PROGRESSIVE_BATCH_DELAY_MS
npm run dev # Ejecuta el bot con tsx
npm run commands:register # Registra slash commands en los guilds configurados
npm run typecheck # TypeScript (sin emitir)
npm test # Alias estable de typecheck (default al codear)
npm run test:smoke # Smoke de proveedores externos (yt-dlp/YouTube)
npm run verify # test + build + smoke (validacion completa)
npm run lint # Lint (requiere eslint.config.* con ESLint v9)
npm run build # Compila a dist/
npm run start # Ejecuta el build compilado
npm run clean # Limpia dist/Smoke test local de playlists (script auxiliar):
node scripts/music-playlist-smoke-test.mjs- YouTube/Spotify pueden romper o degradarse temporalmente por cambios externos (extractores, rate limits, scraping).
- Sin credenciales de Spotify, playlists/álbumes pueden quedar limitados a ~100 tracks.
- Algunas fuentes/URLs no públicas (privadas, restringidas, edad/región) pueden fallar sin cookies/autenticación.
- El módulo de música depende de
ffmpegy del estado deyt-dlp.exeen el entorno local. - El smoke test (
npm run test:smoke) depende de red y de proveedores externos; úsalo como validación operativa, no como test unitario determinista. - El script
npm run lintrequiere uneslint.config.*compatible con ESLint v9.
.envestá ignorado por.gitignore.- No subas tokens, secrets, cookies ni archivos de configuración local.
- Antes de publicar cambios, revisa:
git statusgit diff
Proyecto en estado funcional, con foco actual en:
- estabilidad del autoplay y de los fallbacks,
- mejoras de UX del panel,
- robustez de playlists,
- y crecimiento modular del bot.
Documentación:
- README.md orientado a uso/entrada rápida
- docs/GUIA-HISTORICA.md orientado a aprendizaje completo del proyecto
- docs/discord-music-bot-architecture.md orientado a diseño y evolución

