"Turning Gaming into a Gamified Marketplace."
Este proyecto es una plataforma full-stack diseñada para gestionar la dinámica de mi regreso a Twitch. Permite a mis moderadores y a la propia API de Twitch controlar el progreso de los juegos y ajustar dinámicamente el precio de venta de mis juegos físicos en tiempo real.
Es un sistema de subasta inversa en tiempo real diseñado para streams de alto impacto. Los espectadores controlan el precio final mediante interacciones directas en Twitch, sincronizando una publicación de Mercado Libre en el clímax del evento.
A diferencia de una subasta tradicional donde el precio sube, aquí la comunidad trabaja unida para bajarlo.
-
Precio de Salida: La subasta inicia en un precio base (ej. $1,200 MXN).
-
Mecánica de Descuento: Cada interacción en el chat de Twitch reduce el precio en tiempo real:
- Suscripción Tier 1 / Prime: Descuento principal
- Suscripción Tier 2 / 3: Descuento premium
- Bits: Descuento proporcional a la cantidad (100, 500, 1000 bits)
- Follows: Micro-descuento controlado (anti-abuso)
-
Fases de Escalamiento: El sistema detecta el precio y entra en diferentes niveles (Base, Nivel 1, 2, 3 y Modo Final). En cada nivel, los descuentos se vuelven más agresivos, premiando la constancia de la comunidad.
-
El Clímax: Al finalizar, el bot libera automáticamente el link de Mercado Libre con el precio final alcanzado.
- Framework: Next.js 14+ (App Router)
- Database & State: Upstash Redis
- Real-time: Pusher (WebSockets)
- Auth: Auth.js (NextAuth) + Twitch + RBAC
- Animaciones: Framer Motion
- Deployment: Vercel (Edge Functions)
Si deseas desplegar tu propia instancia, asegúrate de inicializar las siguientes llaves:
| Llave | Tipo | Descripción |
|---|---|---|
auction_price |
String | Precio actual |
auction_status |
String | Estado (active, paused, finished) |
game_progress |
String | Progreso visual (0-100) |
ml_access_token |
String | Token Mercado Libre |
ml_refresh_token |
String | Refresh token |
final_price_achieved |
String | Precio final guardado |
Iniciar sesión con Twitch NO es suficiente. Debes registrar las suscripciones de eventos (EventSub) manualmente vía API.
El endpoint:
/api/twitch/register-eventsub
Se encarga de:
-
Crear suscripciones EventSub para:
channel.followchannel.subscribechannel.subscription.messagechannel.subscription.giftchannel.cheer
-
Conectar esos eventos al webhook:
/api/webhooks/twitch -
Permitir que Twitch envíe eventos en tiempo real
Después de autenticarte con Twitch:
POST /api/twitch/register-eventsub
Ejemplo:
fetch("/api/twitch/register-eventsub", { method: "POST" })
.then(res => res.json())
.then(console.log);/api/twitch/status
Debe devolver:
{
"connection": "CONNECTED",
"eventsub": {
"enabled": 5,
"pending": 0,
"ok": true
}
}/api/twitch/eventsub/status
Todos los eventos deben estar en:
"status": "enabled"
| Problema | Causa |
|---|---|
| 405 | Usaste GET en vez de POST |
| pending | Webhook inválido (URL o HTTPS) |
| total: 0 | No ejecutaste register-eventsub |
| No bajan precios | NEXTAUTH_URL mal configurado |
graph LR
A["Twitch Event"] --> B["/api/webhooks/twitch"]
B --> C["/api/price"]
C --> D["Redis"]
C --> E["Pusher"]
E --> F["OBS / UI"]
Si no ejecutas:
/api/twitch/register-eventsub
👉 Tu sistema NO reaccionará a subs, bits o follows.
graph TD
subgraph Clients
A[Landing]
B[OBS Overlay]
C[Admin]
end
subgraph Realtime
D((Pusher))
end
subgraph Backend
E[Price Engine]
F[Auction Logic]
G[Auth]
end
subgraph External
H[Twitch]
I[Mercado Libre]
end
subgraph Storage
J[(Redis)]
end
C --> E
E --> J
E --> D
D --> A
D --> B
H --> B
I --> E