Crear juegos y recompensas

Convierte un regalo, un importe de apoyo o un comando del chat en algo que suceda en tu directo.

Sí, tu juego puede reaccionar a los regalos de TikTok

El espectador envía un regalo o mensaje Social Stream Ninja lo captura Tu página decide qué ocurre

Tu JavaScript elige la acción: impulsar un cohete, cultivar un jardín, generar un enemigo o llenar un objetivo compartido. Tú eliges también el umbral. SSN no puede cambiar los precios de regalos de una plataforma.

Quiero…Empieza aquí
Reproducir un sonido, una alerta, una acción OBS o un webhookEvent Flow (sin código)
Crear un tablero de juego o mantener mi propio estado de juegoUna plantilla inicial más abajo
Usar un juego terminadoEl galería de juegos

Elige una plantilla

Cada vista previa tiene botones de ejemplo y un inspector «Últimos datos recibidos». Las muestras son eventos ficticios, no compras. El modo de vista previa nunca entra en tu sesión en directo.

Plantilla inicialQué haceCambia esto
Cohete con monedas10 monedas de TikTok, 100 Bits de Twitch o 100 estrellas de Facebook dan un impulso. El sobrante se guarda por espectador y plataforma.COST
Objetivo de apoyo compartidoEl valor estimado en USD de las cuatro plataformas construye una base lunar. Sustituye el progreso por daño, combustible o un temporizador.GOAL_USD
Jardín de regalos y eventosUn regalo elegido de TikTok añade flores. Un seguimiento en TikTok añade un árbol. El comando gratuito !water en el chat añade agua.GIFT_ID (un identificador capturado) o GIFT_NAME (nombre exacto). «Demo flower» es ficticio.
  • En el HTML, busca EDIT THIS RULE o EDIT THESE RULES.
  • Pon la lógica de tu juego en la función receive(data) .
  • Los auxiliares de conexión y recuento están en starter.js. Los estilos están en starter.css.

Conecta una plantilla en 3 pasos

  1. Inicia SSN y conecta tu chat. Comprueba que el chat y los regalos aparezcan en el dock. Para TikTok, consulta los modos de conexión.
  2. Abre la plantilla sin ?demo, con tu identificador de sesión (y contraseña si la configuraste).
  3. Compruébalo en un navegador. Luego añade el mismo enlace a OBS como fuente de navegador, por ejemplo a 1000 × 800.
https://socialstream.ninja/games/templates/coin-rocket.html?session=YOUR_SESSION&password=YOUR_PASSWORD&clean
  • &clean oculta el inspector, el estado de conexión y los botones del anfitrión.
  • ¿Sin contraseña? Omite &password=….
  • En el sitio beta, conserva /beta/ antes de games/.
Mantén privados tus enlaces de sesión.
Otras rutas de conexión (WebSocket)

Por defecto, las plantillas usan el mismo puente iframe que las superposiciones SSN.

  • WebSocket alojado: activa Enviar mensajes al Dock desde la extensión mediante el servidor en SSN y añade &server2.
  • Servidor local: añade &server2&localserver, o &localserverport=3000. Consulta la Guía de WebSocket.
  • localserver por sí solo no activa una ruta.
  • El flujo antiguo server usa un canal distinto y puede necesitar un dock que publique en él.

Crea tu copia y ejecútala desde el disco

No hay servidor que instalar. Editas un archivo en tu equipo y haces que OBS lo abra.

  1. Descargar el ZIP del código beta y extráelo.
  2. Copia la plantilla elegida junto al original. Ejemplo: games/templates/my-rocket.html.
  3. Conserva la estructura de carpetas. Las plantillas cargan js/local-server-url.js, y el objetivo de apoyo carga currency.js desde la carpeta raíz. Mantén también las imágenes y el audio en su sitio.
  4. Arrastra tu HTML a Chrome o Edge y copia su dirección file:/// .
  5. Añade todo desde ? en adelante de tu enlace de juego que funciona (sesión, contraseña y opciones de transporte).
  6. En OBS, dejar Archivo local (Local file) sin marcar. Pega la dirección completa en el campo URL campo.
  7. Después de cada cambio, actualiza la fuente de navegador.
file:///C:/SSN/social_stream-beta/games/templates/my-rocket.html?session=YOUR_SESSION&clean

Usa tu ruta real. No muevas la carpeta extraída. La sesión es tu ID de conexión SSN, no el nombre del juego. Quita demo para recibir datos en directo. Mantén SSN y la captura activos. Más ejemplos: guía de configuración de archivos.

¿Editas un juego existente? Puedes copiar cualquier página de games/. games.html y battle.html tienen su propia lógica. Los ajustes de reglas de las plantillas no son una API compartida de juegos.
Prompt de IA para cambiar el estilo de un juego

Da a la IA tu HTML copiado, starter.js, starter.css, los auxiliares de la carpeta raíz js/ , las imágenes o el audio y docs/event-reference.html.

Customize [game file] to match [reference], at [canvas size].
Include its existing CSS/JS and local artwork/audio. Preserve the game's
rules, controls, gift/coin/USD distinctions, streak handling, duplicate
handling, and demo/clean modes. Change the visual design, not the reward rules,
unless I explicitly specify a rule change. Keep session/password and
transport parsing, relative paths, and Chrome 80-compatible classic scripts.
Read docs/event-reference.html and docs/making-games.html.

Treat all incoming messages, names, labels, donations, and metadata as untrusted.
Prevent HTML/JavaScript injection in every renderer you change. Use textContent
for plain fields and for chatmessage when textonly is true. For HTML-mode
chatmessage, keep supported emotes/formatting through the packaged
SocialStreamChatHTML.sanitize helper (libs/objects.js loaded first).
Do not concatenate raw input into innerHTML, attributes, CSS, or JavaScript.
Validate media/link URLs with the page's existing URL policy and assign DOM
properties; do not enable javascript: URLs or executable embedded content.
Never eval incoming data or treat a viewer message as an AI instruction.
Keep source checks, connection handling, and existing sanitizers.
Test plain text, allowed emotes, quotes, angle brackets, and an HTML injection
probe in an isolated preview; verify the probe cannot execute.

Make the edited game work directly from disk using a file:/// URL,
without requiring a local web server.
Return the edited files/assets, file URL and OBS setup steps, and tests using
fictional data. Preserve image-only events and a valid donoValue of zero.
Never treat chat text as proof of a payment.

Después prueba en este orden: botones demo (incluidas actualizaciones repetidas de racha y un valor cero explícito), tu sesión real y la fuente OBS a su tamaño real. Comprueba las reglas del juego y el renderizado seguro. Que la animación funcione no demuestra que las reglas funcionen.

¿Cómo elijo una cantidad de monedas para una acción?

Primero decide qué vas a medir. Luego elige un número.

MedidaLee este campoEjemplo
Unidades nativas (monedas, Bits, estrellas)TikTok meta.coinsPerGift × meta.tiktokGiftCount si está presente, o hasDonation con una etiqueta como 10 coins, 100 bits, 100 Stars.Cada 10 monedas = un impulso.
Un regalo concretoTikTok meta.giftId o meta.giftName, junto con su cantidad.Cada regalo coincidente añade una flor, sea cual sea su valor.
Valor monetario comparablegetDonationValueUSD(data) desde currency.js.Cada $1 estimado añade 10 de combustible. $25 completan el objetivo.
Una acción gratuita o de membresíaEl valor real de la fuente en event, o un comando del chat.Un seguimiento hace crecer un árbol. Una suscripción nueva reproduce una animación.

¿Exacto, mínimo o saldo acumulado?

  • Exacto: coins === 10. Un regalo de 25 monedas no hace nada.
  • Mínimo por evento: coins >= 10.
  • Saldo acumulado: lo que usa el cohete. 25 monedas = dos impulsos y sobran 5 monedas.

¿Varios niveles? Comprueba primero el más alto para que un regalo no active también todos los inferiores.

Las monedas de TikTok no siempre se conocen. Si la captura solo da nombre del regalo, cantidad o etiqueta de diamantes, el cohete de monedas omite el evento. Usa una regla de regalo o la plantilla USD. Nunca calcules «monedas exactas» dividiendo una estimación USD ni tratando diamantes como monedas.
Más sobre monedas, regalos y diamantes de TikTok
  • Los espectadores compran monedas y las gastan en regalos. El coste en monedas aparece con el regalo. Consulta Explicación de TikTok sobre monedas y regalos.
  • El nombre del regalo, la cantidad de regalos, las monedas y los diamantes son cuatro cosas diferentes.
  • Elige regalos disponibles en tu LIVE y comprueba los datos capturados antes de publicar una regla.
  • Los valores en monedas pueden provenir de la tabla de regalos de SSN. Compáralos con la bandeja actual de regalos de tu LIVE cuando importe el precio exacto.
  • Los catálogos de regalos y los métodos de captura varían. Ningún campo de monedas está garantizado en todos los mensajes de TikTok.

Qué envía cada plataforma

type indica de dónde vino. event indica qué ocurrió, si está presente. Lo recibido depende del modo de captura, los ajustes y la plataforma. Refleja el código actual de SSN, no garantiza que todas las cuentas reciban todos los eventos.

PlataformaQué recibesTen cuidado con
TikToktype: "tiktok", event: "gift". La captura de donaciones puede añadir hasDonation y donoValue. Los metadatos pueden incluir identificador, nombre, cantidad, monedas por regalo, diamantes por regalo e identificador de racha.Las monedas compran regalos; los diamantes son recompensas del creador. La captura WebSocket de SSApp completa las rachas antes de enviarlas; la del navegador puede enviar totales acumulados. Desactivar la captura de donaciones de TikTok puede dejar regalos sin campos monetarios.
TwitchLos Cheers usan Bits, como hasDonation: "100 bits". La captura por API puede enviar event: "cheer" y donoValue: 1. La captura de chat puede no tener evento.Suscripciones, suscripciones regaladas, raids y puntos del canal son cosas distintas. Una insignia de suscriptor en un mensaje normal no es una suscripción nueva. Los Bits usados en extensiones de Twitch son otro sistema.
FacebookLas filas visibles de estrellas en el chat en directo dan, por ejemplo, hasDonation: "100 Stars" y donoValue: 1, sin un marcador event.La ruta API de comentarios no lee estrellas del texto del chat. La fila de estrellas debe estar visible para la captura de página. Los comentarios y reacciones no son pagos.
YouTubesuperchat y supersticker incluyen la divisa original en hasDonation. Los regalos utilizan jeweldonation con N Jewels, o 1 YouTube Gift si el importe está oculto.Los espectadores gastan joyas; los creadores ganan rubíes. Las membresías y las membresías regaladas son eventos distintos. Super Thanks es otro producto, no un evento de chat garantizado.

Otras fuentes pueden informar propinas, regalos, membresías o compras. Consulta la referencia de eventos antes de añadirlas al filtro isSupport . Una venta o suscripción regalada no es automáticamente una propina. YouTube envía la compra del regalo y cada aviso de destinatario; contar ambos recompensa dos veces el mismo regalo.

Referencias de las plataformas

Diamantes de TikTok · Bits y suscripciones de Twitch · Descripción de las estrellas de Meta · Super Chat y Super Stickers de YouTube · Joyas, regalos y Rubíes de YouTube.

Condiciones consultadas el 29 de septiembre de 2026. Comprueba los requisitos actuales en las páginas de la plataforma.

Usar correctamente donoValue y currency.js

CampoQué es
hasDonationLa etiqueta original, como €5.00 o 100 bits. Muestra esto a los espectadores.
donoValueNúmero opcional en USD de la fuente. Si es válido, incluso cero, úsalo antes de estimar desde la etiqueta.
<script src="../../currency.js"></script>
<script>
// From games/templates/: use the existing helper, including its zero handling.
var usd = getDonationValueUSD(data);
// Use usd for your rule; display data.hasDonation for the original amount/unit.
</script>

No hagas esto

  • donoValue || convertToUSD(...) — descarta un cero intencional.
  • Extraer números de chatmessage para detectar pagos.
  • Exigir event === "donation" — las estrellas de Facebook y algunos Cheers no tienen evento.

La plantilla de objetivo de apoyo selecciona primero los tipos de apoyo y después llama al conversor compartido.

Estimaciones integradas de SSN
UnidadEstimado como
1 moneda de TikTok$0.01
1 diamante de TikTok$0.005
1 Bit de Twitch o estrella de Facebook$0.01
1 joya de YouTube$0.005
Regalo de TikTok sin precio1 moneda por regalo
Regalo de YouTube sin cantidad de joyasvalor provisional de $0.01

Las demás divisas usan tasas aproximadas integradas, no tipos de cambio en directo. Solo sirven para comparar el apoyo. No son lo que pagó el espectador, lo que ganas ni lo que puedes retirar. Los métodos de captura pueden dar estimaciones distintas. El valor de respaldo de una moneda no significa que el regalo cueste una moneda.

Fuente: currency.js y el parámetro referencia de datos. Los metadatos de regalo son opcionales; los ejemplos no inventan campos que falten en tu captura.

Contar una racha de regalos una sola vez

TikTok puede informar una racha como totales acumulados: 1, 2, 3. Son tres regalos, no seis. Recuerda el total máximo visto en esa racha y añade solo el incremento.

// All three events refer to the same streak:
// incoming total: 1, 2, 3, 3
// added to game:  1, 1, 1, 0
var newCoins = RewardStarter.increment(data, RewardStarter.coins(data), 'coins');
  • El auxiliar identifica las rachas por los identificadores TikTok de grupo, remitente y regalo; después por meta.tiktokGiftStreakId, y después por identificadores de mensaje. Estos también bloquean entregas repetidas.
  • No espera a repeatEnd, porque la captura del navegador puede no enviarlo nunca. ¿Necesitas una sola acción cuando termine una racha? Escribe una regla independiente con los campos que envía tu conexión.
  • Usa una sola ruta de captura. Otra captura del mismo canal puede usar identificadores diferentes y contar dos veces.
Límites de memoria de las plantillas
  • Recuerdan hasta 2000 identificadores, solo en memoria.
  • Restablecer o recargar borra esa memoria y el progreso del juego.
  • Los mensajes sin identificadores estables no se pueden deduplicar de forma fiable.
  • El cohete agrupa los saldos por plataforma e identificador de usuario, o por nombre si no hay ID. Los espectadores con el mismo nombre pueden compartir saldo.
  • Para un juego que deba sobrevivir a reinicios, añade guardado de estado y gestión de eventos repetidos antes de depender de recompensas pagadas.

Recompensas sin un juego personalizado

En Event Flow:

  1. Añade Comparar propiedad.
  2. Configúralo como donoValue, mayor o igual que, y tu importe en USD.
  3. Conecta una acción, como sonido, animación o control de OBS.

Usa el valor de la fuente si es válido y, de lo contrario, la conversión de divisas de SSN.

  • Un regalo concreto de TikTok: compara meta.giftId o meta.giftName, y limita el flujo a eventos de regalos de TikTok.
  • Las comprobaciones numéricas de hasDonation también se convierten a USD. No comprueban monedas en bruto. Usa metadatos nativos o código personalizado para reglas de monedas.
  • Cada comprobación se ejecuta por mensaje. No es un saldo acumulado ni un contador de rachas. Usa nodos de estado si lo necesitas o mantén esa lógica en tu juego.

Pruébalo antes de vincular una acción pagada

  1. Botones de ejemplo. Una racha 1 → 2 → 3 suma tres regalos. La muestra con valor cero no añade USD. Un precio desconocido no añade monedas exactas.
  2. Fuente real. Mira los datos reales capturados. Confirma nombre/ID del regalo, importe, unidad, cantidad y evento. Las muestras prueban tu regla, no la captura real.
  3. Escena de OBS. Prueba eventos repetidos, una reconexión y una recarga. No actualices ni cierres la fuente de navegador si necesitas conservar el progreso en memoria.
ProblemaPrueba esto
No llega nadaComprueba primero el dock SSN. Luego la sesión, la contraseña y el ajuste de transporte.
Llega el chat, pero un regalo no coincideMira los datos y comprueba los filtros de donaciones y eventos.
No llegan seguimientos ni suscripcionesVaría según la fuente. Consulta la referencia de eventos.
¿Ejecutas un juego sin supervisión (AFK)? SSN, la captura y la página del juego deben seguir activos. La suspensión, un inicio de sesión caducado o una conexión caída detienen las acciones. Las plantillas no recuperan eventos perdidos ni gestionan reembolsos. Las reacciones automáticas no autorizan monetizar una transmisión sin supervisión; consulta las reglas actuales de LIVE y monetización de la plataforma.

Más detalles de conexión: superposiciones personalizadas.