9.1 KiB
Discord Bot Setup - Vercel Serverless
Discord bot para claude-code-templates integrado con Vercel Functions usando webhooks. Este enfoque es más eficiente que mantener un bot tradicional con conexión persistente.
🚀 Ventajas de la Arquitectura Serverless
- ✅ Sin servidor permanente: Solo se ejecuta cuando hay interacciones
- ✅ Escalabilidad automática: Vercel maneja el scaling
- ✅ Integrado con tu infraestructura: Mismo proyecto, mismo deployment
- ✅ Costo reducido: Solo pagas por ejecuciones reales
- ✅ Cache inteligente: Reutiliza datos entre invocaciones
📋 Comandos Disponibles
Comandos Básicos (Fase 1)
/search <query> [type]- Buscar componentes/info <name> [type]- Información detallada/install <name> [type]- Comando de instalación/popular <type> [limit]- Componentes más populares/random <type>- Descubre componentes aleatorios
🛠️ Setup Paso a Paso
1. Crear Discord Application
- Ve a Discord Developer Portal
- Click "New Application" y dale un nombre
- En la sección "General Information":
- Copia el Application ID → Esto es tu
DISCORD_APP_ID
- Copia el Application ID → Esto es tu
- Ve a la sección "Bot":
- Click "Add Bot"
- Copia el Bot Token → Esto es tu
DISCORD_BOT_TOKEN - Habilita "Message Content Intent" si lo necesitas
- En "General Information" nuevamente:
- Copia el Public Key → Esto es tu
DISCORD_PUBLIC_KEY
- Copia el Public Key → Esto es tu
2. Configurar Variables de Entorno
En Local (para testing)
Crea/actualiza tu archivo .env:
# Discord Bot Configuration
DISCORD_APP_ID=123456789012345678
DISCORD_BOT_TOKEN=MTIzNDU2Nzg5MDEyMzQ1Njc4.AbCdEf.GhIjKlMnOpQrStUvWxYz
DISCORD_PUBLIC_KEY=abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
DISCORD_GUILD_ID=987654321098765432 # Opcional, para testing en un server específico
# API Configuration
COMPONENTS_API_URL=https://aitmpl.com/components.json
En Vercel (para producción)
- Ve a tu proyecto en Vercel Dashboard
- Settings → Environment Variables
- Agrega estas variables:
DISCORD_APP_IDDISCORD_BOT_TOKENDISCORD_PUBLIC_KEYCOMPONENTS_API_URL(opcional, por defecto usa aitmpl.com)
3. Instalar Dependencias
npm install
Esto instalará:
discord-interactions- Para verificar requests de Discordaxios- Para cargar components.jsondotenv- Para variables de entorno
4. Registrar Comandos con Discord
npm run discord:register
Output esperado:
📦 Registering Discord slash commands...
Registering to guild: 987654321098765432
✅ Successfully registered 5 commands!
📝 Registered commands:
1. /search - Search for components by keyword
2. /info - Get detailed information about a specific component
3. /install - Get the installation command for a component
4. /popular - View the most popular components by download count
5. /random - Discover a random component
5. Deploy a Vercel
vercel --prod
O usa el deployment automático de GitHub si lo tienes configurado.
Después del deploy, copia tu URL de producción:
https://your-project.vercel.app
6. Configurar Interactions Endpoint en Discord
- Ve a Discord Developer Portal → Tu aplicación
- Ve a "General Information"
- En Interactions Endpoint URL, pega:
https://your-project.vercel.app/api/discord/interactions - Click "Save Changes"
Discord intentará verificar la URL enviando un PING. Si todo está bien configurado, verás un ✅.
7. Invitar el Bot a tu Servidor
- En Discord Developer Portal → OAuth2 → URL Generator
- Selecciona scopes:
- ✅
bot - ✅
applications.commands
- ✅
- Selecciona permisos del bot:
- ✅ Send Messages
- ✅ Embed Links
- ✅ Read Message History
- Copia la URL generada y ábrela en tu navegador
- Selecciona tu servidor y autoriza
🧪 Testing Local
Para testear localmente antes de hacer deploy:
# 1. Instala Vercel CLI si no lo tienes
npm i -g vercel
# 2. Inicia el servidor de desarrollo
vercel dev
Esto correrá en http://localhost:3000
Para que Discord pueda enviar webhooks a tu localhost, necesitas un túnel:
# Opción 1: ngrok
ngrok http 3000
# Opción 2: Vercel dev con --listen
vercel dev --listen 3000
Usa la URL pública del túnel en Discord Interactions Endpoint.
📁 Estructura del Proyecto
api/
└── discord/
├── interactions.js # Endpoint principal de webhooks
├── register-commands.js # Script para registrar comandos
├── handlers/ # Handlers de cada comando
│ ├── search.js
│ ├── info.js
│ ├── install.js
│ ├── popular.js
│ └── random.js
└── utils/ # Utilidades compartidas
├── componentsLoader.js # Cache de components.json
└── embedBuilder.js # Generador de embeds
🔍 Cómo Funciona
Flujo de una Interacción
- Usuario ejecuta
/search securityen Discord - Discord envía POST a
https://your-domain.vercel.app/api/discord/interactions - Vercel ejecuta
api/discord/interactions.js - El handler verifica la firma (seguridad)
- Identifica el comando y llama al handler correspondiente
- Handler carga components.json (desde cache si existe)
- Ejecuta la búsqueda y genera un embed
- Retorna respuesta a Discord
- Discord muestra el resultado al usuario
Cache de Componentes
El sistema mantiene components.json en memoria por 5 minutos:
- Primera request: Descarga desde aitmpl.com
- Siguientes requests (< 5 min): Usa cache
- Después de 5 min: Actualiza automáticamente
Esto reduce latencia y requests a la API.
🐛 Troubleshooting
Error: "Invalid request signature"
Causa: La PUBLIC_KEY no está configurada o es incorrecta
Solución:
- Verifica que
DISCORD_PUBLIC_KEYesté en las variables de entorno de Vercel - Asegúrate de copiar la Public Key correcta del Developer Portal
- Redeploy después de cambiar variables de entorno
Error: Discord no puede verificar la URL
Causa: El endpoint no responde correctamente al PING
Solución:
- Verifica que el deployment fue exitoso
- Prueba manualmente:
curl https://your-domain.vercel.app/api/discord/interactions - Revisa los logs en Vercel Dashboard → Functions
Comandos no aparecen en Discord
Causa: No se registraron o falta scope
Solución:
- Ejecuta
npm run discord:registernuevamente - Si usaste
DISCORD_GUILD_ID, los comandos solo aparecen en ese server - Quita el bot del server y vuelve a invitarlo con el scope
applications.commands - Espera unos minutos (comandos globales pueden tardar hasta 1 hora)
Bot no responde
Causa: Error en el handler o falta de permisos
Solución:
- Revisa logs en Vercel Dashboard → Functions
- Verifica que el bot tenga permisos de "Send Messages" y "Embed Links"
- Prueba con un comando simple como
/random
"Components data not loaded"
Causa: No puede acceder a components.json
Solución:
- Verifica que
https://aitmpl.com/components.jsonsea accesible - Revisa la variable
COMPONENTS_API_URLsi usas una URL custom - Chequea los logs de Vercel para ver el error específico
📊 Monitoreo
Vercel Dashboard
Ve a tu proyecto en Vercel → Functions para ver:
- Invocaciones totales
- Errores
- Tiempo de respuesta
- Logs en tiempo real
Discord Logs
Cada comando registra en consola:
🔹 Command received: /search
✅ Components data loaded
Revisa estos logs en Vercel Functions.
🚀 Próximos Pasos
Fase 2: Comandos Interactivos
/stats- Estadísticas de la plataforma/new- Componentes recientes/daily- Componente del día
Fase 3: Botones y Menús
- Agregar botones de acción a los embeds
- Select menus para filtros avanzados
- Modal forms para búsqueda compleja
Fase 4: Integración Avanzada
- Tracking de instalaciones vía Discord
- Notificaciones automáticas de releases
- Sistema de votación y reviews
💡 Tips y Mejores Prácticas
- Testing: Usa
DISCORD_GUILD_IDpara testing rápido en tu server - Production: Quita
DISCORD_GUILD_IDpara comandos globales - Cache: Ajusta
CACHE_DURATIONencomponentsLoader.jssegún tus necesidades - Errores: Todos los errores retornan embeds ephemeral (solo visibles para el usuario)
- Logs: Los logs en Vercel te ayudan a debuggear problemas en producción
📚 Recursos
- Discord Developer Portal
- Discord Interactions Documentation
- Vercel Functions Documentation
- discord-interactions npm
🤝 Soporte
Si tienes problemas:
- Revisa los logs en Vercel Dashboard
- Verifica todas las variables de entorno
- Prueba los endpoints manualmente con curl
- Abre un issue en GitHub con los logs relevantes
¡Listo! Tu bot de Discord está corriendo en Vercel Functions 🎉