Backend Node.js modular para automatizaciones en vivo con integraciones a Twitch, Discord y Philips Hue.
- Node.js 25.9.0 (o superior)
- npm 10+
- Bridge de Philips Hue en la misma red local
- Cuenta de Twitch para el bot
npm install
cp .env.example .env
# Edita .env con tus credenciales (ver seccion Configuracion)
npm run dev| Variable | Descripcion |
|---|---|
TWITCH_CLIENT_ID |
Client ID de tu app en dev.twitch.tv/console → Register Your Application |
TWITCH_CLIENT_SECRET |
Client Secret de la misma app de Twitch |
TWITCH_ACCESS_TOKEN |
Access token inicial del bot |
TWITCH_REFRESH_TOKEN |
Refresh token inicial del bot (permite renovacion automatica) |
TWITCH_TOKEN_EXPIRES_IN |
Segundos de expiracion del token inicial. 0 fuerza refresh inmediato al iniciar |
TWITCH_TOKEN_FILE |
Ruta del archivo donde se persiste el token renovado (data/twitch-token.json) |
COOLDOWN_CONFIG_FILE |
Ruta del archivo JSON de cooldowns por plataforma/comando (config/cooldowns.json) |
CUSTOM_COMMANDS_CONFIG_FILE |
Ruta del archivo JSON de comandos custom (config/custom-commands.json) |
TWITCH_CHANNELS |
Nombre(s) de tu canal sin #, separados por coma. Ej: micanal |
TWITCH_COMMAND_PREFIX |
Prefijo de comandos, por defecto ! |
Recomendado: usa un flujo que entregue
access_token+refresh_token. Si solo tienes access token, el bot no podra renovarlo automaticamente cuando expire.
Obtener access_token y refresh_token (Authorization Code):
- Abre este URL en tu navegador (reemplaza valores):
https://id.twitch.tv/oauth2/authorize?response_type=code&client_id=TU_CLIENT_ID&redirect_uri=http://localhost:3000&scope=chat:read+chat:edit
- Autoriza la app y copia el parametro
codedel redirect. - Intercambia el
codepor tokens:
curl -X POST "https://id.twitch.tv/oauth2/token" \
-d "client_id=TU_CLIENT_ID" \
-d "client_secret=TU_CLIENT_SECRET" \
-d "code=EL_CODE_DEL_REDIRECT" \
-d "grant_type=authorization_code" \
-d "redirect_uri=http://localhost:3000"- Copia
access_tokenaTWITCH_ACCESS_TOKENyrefresh_tokenaTWITCH_REFRESH_TOKEN.
| Variable | Descripcion |
|---|---|
HUE_BRIDGE_IP |
IP local del bridge. Busca en la app Hue → Settings → My Hue System → Bridge → IPv4, o visita https://discovery.meethue.com/ |
HUE_APP_KEY |
Clave de aplicacion generada en el bridge (ver pasos abajo) |
HUE_LIGHT_IDS |
IDs de luces individuales a controlar separados por coma. Si se deja vacio y no hay grupos configurados, controla todas |
HUE_GROUPED_LIGHT_IDS |
IDs de grouped_light a controlar separados por coma. Ideal si quieres usar un grupo o zona ya armada en Hue |
HUE_DEFAULT_BRIGHTNESS |
Brillo de 1 a 100. Recomendado: 80 |
HUE_ALLOW_SELF_SIGNED |
true para aceptar el certificado self-signed del bridge local |
Como obtener HUE_APP_KEY:
- Presiona el boton fisico del bridge Hue.
- Dentro de los siguientes 30 segundos, ejecuta (reemplaza la IP):
curl -X POST https://192.168.1.10/api \
-k \
-H "Content-Type: application/json" \
-d '{"devicetype":"io-bot#v2","generateclientkey":true}'- La respuesta incluye el campo
username, ese valor es tuHUE_APP_KEY.
Como obtener HUE_LIGHT_IDS (opcional):
curl -k https://192.168.1.10/clip/v2/resource/light \
-H "hue-application-key: TU_APP_KEY"Cada elemento del array tiene un campo id (UUID). Copia los que quieras controlar.
Como obtener HUE_GROUPED_LIGHT_IDS (opcional, recomendado si ya armaste grupos/zonas):
curl -k https://192.168.1.10/clip/v2/resource/grouped_light \
-H "hue-application-key: TU_APP_KEY"Ese endpoint devuelve recursos grouped_light. Copia sus id en HUE_GROUPED_LIGHT_IDS.
- Usa
HUE_LIGHT_IDSsi quieres controlar luces puntuales. - Usa
HUE_GROUPED_LIGHT_IDSsi quieres controlar un grupo/zona ya armado en Hue. - Si ambas variables estan vacias, el bot controla todas las luces detectadas.
| Variable | Descripcion |
|---|---|
DISCORD_TOKEN |
Token del bot en discord.com/developers/applications → Bot → Reset Token |
DISCORD_CLIENT_ID |
Application ID de la misma app → OAuth2 |
Si estas variables estan vacias el bot de Discord no se inicia, el resto del sistema funciona igual.
La configuracion de cooldown esta centralizada en config/cooldowns.json.
Ejemplo:
{
"defaults": {
"enabled": false,
"seconds": 5,
"scope": "user_channel"
},
"platforms": {
"twitch": {
"funa": {
"enabled": true,
"seconds": 8,
"scope": "user_channel"
},
"luz": {
"enabled": true,
"seconds": 5,
"scope": "user_channel"
}
},
"discord": {}
}
}Scopes soportados:
user_channel: mismo usuario en mismo canalchannel: global por canaluser_global: mismo usuario en toda la plataformaglobal: global por plataforma
Comando en chat de Twitch:
!luz azul!luz rojo!luz #0F336F
El comando cambia el color de las luces configuradas en Philips Hue usando la API v2.
npm run dev: modo desarrollo con watchnpm start: ejecucion normalnpm run lint: validacion ESLintnpm run format: validacion Prettiernpm run test: pruebas unitarias
src/
app/ # Orquestacion de la aplicacion
core/ # Configuracion, logging, utilidades transversales
components/ # Integraciones e implementaciones por dominio
twitch/
discord/
hue/
shared/ # Helpers reutilizables entre componentes
- Indice de Documentacion
- Arquitectura
- Core Subsystems
- Subsistema de Cooldown
- Sistema de Comandos Custom
- Sistema de Luz
- Sistema de Funa
- Guia: Agregar Comandos
- Buenas Practicas
DISCORD_TOKEN es opcional por ahora. Si no existe, el bot de Discord no se inicia.
Cambiar el color de las luces Philips Hue.
Contador de funas por usuario con persistencia SQLite. Detalles en docs/funa-system.md.
-
!funa(Twitch) - EN PROGRESO- ✅ Sistema de persistencia SQLite con identidades canónicas.
- ✅ Cooldown por plataforma/comando con estrategia configurable.
- ✅ Matching automático de nombres y búsqueda de similares.
- ⏳ Integración con Discord (reutilizará mismos servicios).
- ⏳ Comando de admin para unificar identidades manuales.
-
Niveles de usuario
- Registrar cantidad de mensajes enviados por usuarios en Twitch y Discord.
- Subir de nivel en base a cantidad de mensajes.
- Considerar bonificadores de experiencia/subida para VIP y suscriptores.
- En Discord, permitir excluir canales que no deben sumar niveles.
- En Twitch y Discord, excluir mensajes que sean comandos (por ejemplo:
/play,!luz, entre otros).
-
Dashboard de ranking de niveles
-
Comando "preguntale a la IA"
- En Twitch, con comando personalizado de uso exclusivo para moderadores.
- Ejemplo:
!ia que paso un dia como hoy en 1954. - La pregunta debe enviarse a un LLM configurable (por ejemplo Gemini).