🤖 Discord Bot Forge

Aloja bots de Discord con IA en Val Town: dashboard para gestionarlos, personajes que responden con Groq, y un creador de embeds con vista previa.

Abrir el dashboard →

Qué hace

  • Dashboard con tus bots — conectas un bot pegando su token, y ves su estado (encendido, apagado, con avisos, error) con un vistazo.
  • Chat con IA (Groq) — un copiloto por bot que te escribe la persona, propone embeds, textos de bienvenida e ideas de comandos. Con un clic puedes guardar su respuesta como persona del bot.
  • Creador de embeds — formulario, vista previa fiel a Discord, generación con IA a partir de una descripción, plantillas guardadas y envío inmediato a un canal.
  • Respuesta automática en Discord — el bot lee los mensajes recientes de su canal y contesta con IA cuando lo mencionan (o a todo, si activas la auto-respuesta).
  • Tokens cifrados — cada token de Discord se guarda con AES-256-GCM y nunca vuelve al navegador.

Cómo funciona

Rendering mermaid diagram...

Val Town no puede mantener abierta una conexión de gateway de Discord (los vals son efímeros y no aceptan WebSockets entrantes). Por eso cada bot funciona por polling REST: el intervalo runtime.ts recorre los bots encendidos cada 15 minutos y, además, puedes forzar un ciclo al instante con ⚡ Ejecutar ahora desde el dashboard.

Puesta en marcha

1. Variables de entorno

VariablePara qué sirve
DISCORD_CLIENT_IDLogin con Discord (obligatorio para entrar)
DISCORD_CLIENT_SECRETClient Secret de la misma app de Discord
GROQ_API_KEYChat con IA, respuestas del bot y generación de embeds
ENCRYPTION_KEYClave de cifrado de los tokens de Discord (32+ caracteres aleatorios)

Crea una app en el Discord Developer Portal y, en OAuth2 → Redirects, añade como URL de redirección:

https://<tu-endpoint>.web.val.run/auth/discord/callback

El Client ID y el Client Secret están en ese mismo apartado OAuth2. No hacen falta más scopes que identify y email (el val los pide solo).

La pantalla de inicio del dashboard te muestra la URL exacta que corresponde a tu despliegue.

2. Conecta un bot de Discord

  1. Crea una aplicación en el Discord Developer Portal.
  2. En Bot → Reset Token y copia el token.
  3. Invita el bot a tu servidor con los permisos View Channels, Send Messages y Read Message History.
  4. Pega el token en el dashboard (+ Conectar). Se valida contra Discord antes de guardarse.

3. Configúralo y enciéndelo

En la pestaña Ajustes elige el canal, escribe (o pídele a la IA) la persona, ajusta el modelo y la temperatura, y pulsa Encender bot. A partir de ahí responde a las menciones en ese canal.

Estructura

ArchivoRol
main.tsEntrada HTTP: dashboard, /api/*, OAuth con Discord, assets
api.tsAPI JSON (bots, chat, embeds, envío a Discord)
bots.tsConfiguración del bot y ciclo tickBot()
discord.tsCliente REST de Discord v10
groq.tsCliente de Groq + prompts (persona, copiloto, embeds)
db.tsSQLite: usuarios, sesiones, bots, mensajes, embeds
auth.tsSesiones en cookie HttpOnly + OAuth de Discord
crypto.tsCifrado AES-256-GCM de tokens
runtime.tsInterval val: revisa los bots encendidos cada 15 min
frontend/React + Twind: shell, API cliente, UI y componentes

API

MétodoRutaDescripción
GET/api/configEstado de las integraciones y modelos disponibles
GET/api/meUsuario de la sesión
GET POST/api/botsListar / conectar bot (valida el token)
GET PATCH DELETE/api/bots/:idVer / configurar / eliminar bot
POST/api/bots/:id/stateEncender o apagar
POST/api/bots/:id/tickEjecutar un ciclo de lectura y respuesta ahora
GET/api/bots/:id/channelsCanales de texto del servidor
POST/api/bots/:id/sendEnviar texto y/o embed a un canal
GET POST DELETE/api/bots/:id/messagesHistorial del copiloto
GET POST DELETE/api/bots/:id/embedsPlantillas de embeds
POST/ai/embedGenerar un embed a partir de una descripción

Todas las rutas de bots filtran por el usuario de la sesión: nunca se puede leer ni tocar un bot ajeno.

Límites conocidos

  • No hay gateway: la respuesta llega en el siguiente ciclo del intervalo (15 min en el plan gratuito) o cuando pulsas Ejecutar ahora. Para tiempo real haría falta un proceso siempre vivo.
  • Un canal por bot: el bot lee y responde en un único canal, el configurado en Ajustes.
  • Límite de bots: 25 por usuario (constante MAX_BOTS_PER_USER en db.ts).

Ver el código