Esta guia cubre la arquitectura completa para conectar Twitch con tu servidor Minecraft: autenticacion OAuth con Twitch API, EventSub WebSockets para escuchar channel points redeems en tiempo real, y RCON para ejecutar comandos en el servidor. Incluye codigo funcional comentado en Node.js.
Viewer redime Channel Point (Twitch)
-> EventSub WebSocket notifica tu servidor Node.js
-> Node.js valida el redeem
-> RCON envia comando al servidor Minecraft
-> Jugador ve el efecto en tiempo realEl tiempo de respuesta desde que el viewer hace clic hasta que pasa en el servidor es de 200-500ms con esta arquitectura.
http://localhost:3000/callback# .env
TWITCH_CLIENT_ID=tu_client_id
TWITCH_CLIENT_SECRET=tu_client_secret
TWITCH_CHANNEL_ID=123456789 # ID numerico del canal, no el nombre
RCON_HOST=localhost
RCON_PORT=25575
RCON_PASSWORD=tu_password_rconEn server.properties:
enable-rcon=true
rcon.port=25575
rcon.password=tu_password_rcon_seguro
broadcast-rcon-to-ops=falseReinicia el servidor. RCON escucha solo en localhost por defecto — no exponerlo a internet.
Instala dependencias:
npm install rcon-client @twurple/auth @twurple/eventsub-ws dotenvArchivo principal bot.js:
import { Rcon } from 'rcon-client';
import { StaticAuthProvider } from '@twurple/auth';
import { EventSubWsListener } from '@twurple/eventsub-ws';
import 'dotenv/config';
// Conexion RCON persistente
const rcon = new Rcon({
host: process.env.RCON_HOST,
port: parseInt(process.env.RCON_PORT),
password: process.env.RCON_PASSWORD,
});
await rcon.connect();
console.log('RCON conectado al servidor Minecraft');
// Mapa de channel points: titulo del redeem -> comando MC
const REDEEMS = {
'Lluvia de Diamantes': 'give {username} diamond 5',
'Terremoto': 'summon minecraft:tnt ~ ~ ~',
'Dia Instantaneo': 'time set day',
'Velocidad x2': 'effect give {username} speed 60 2 true',
'Modo Dios': 'gamemode spectator {username}',
};
// Auth con App Token para EventSub
const authProvider = new StaticAuthProvider(
process.env.TWITCH_CLIENT_ID,
process.env.TWITCH_CLIENT_SECRET
);
const listener = new EventSubWsListener({ apiClient: new ApiClient({ authProvider }) });
listener.onChannelRedemptionAdd(process.env.TWITCH_CHANNEL_ID, async (e) => {
const template = REDEEMS[e.rewardTitle];
if (!template) return;
// Buscar nombre de jugador por nombre de Twitch (requiere tu propia tabla)
const mcPlayer = await getMinecraftPlayer(e.userName);
if (!mcPlayer) {
console.log(${e.userName} no tiene cuenta MC vinculada);
return;
}
const command = template.replace('{username}', mcPlayer);
await rcon.send(command);
console.log([Redeem] -> );
});
await listener.start();Necesitas una tabla que conecte nombres de Twitch con UUIDs de Minecraft. Opciones:
linked_accounts (twitch_name, mc_uuid, mc_name)/linkcuenta [nombre-twitch] que genera un codigo de verificacion de 6 digitos// RCON se desconecta si el servidor se reinicia
rcon.on('error', async (err) => {
console.error('RCON error:', err);
setTimeout(async () => {
try { await rcon.connect(); }
catch (e) { console.error('Reconexion fallida:', e); }
}, 5000);
});
// Rate limiting: maximo 1 redeem por jugador cada 30s
const cooldowns = new Map();
function checkCooldown(user) {
const last = cooldowns.get(user);
if (last && Date.now() - last < 30000) return false;
cooldowns.set(user, Date.now());
return true;
}Ya tenemos Twitch+MC activo en nuestro servidor. Conecta y redime channel points en directo.
Ver Hosting