Plataforma competitiva de esports con autenticación multi-proveedor, pagos con Stripe, integración con Steam/Valorant/Riot, torneos automatizados y bot de Discord.
Deploy VANTS Discord bot on Railway in one click. Just set your environment variables and you're ready to go!
- Click the Deploy on Railway button above
- Set these environment variables:
DISCORD_TOKEN- Your Discord bot tokenDISCORD_GUILD_ID- Your Discord server IDSUPABASE_URL- Your Supabase project URLSUPABASE_SERVICE_ROLE_KEY- Your Supabase service role keyPORT- 8080
- Deploy! Railway will handle the rest
VANTS is a complete esports platform for Discord communities:
- 🏆 Tournament Management: Create and manage tournaments for 12+ games (Valorant, LoL, CS2, MLBB, etc.)
- 📊 Player Rankings: Track player stats, ranks, and tournament history with real-time leaderboards
- 🎮 Valorant Integration: Sync with ValoTracker for ranked stats, RR, and match history
- 💳 Payment Processing: Accept payments for tournament entries via Stripe (BASIC, PRO, ELITE plans)
- 🌐 Multi-Platform: Web dashboard + Discord bot
- 🔒 Secure: RLS policies, OAuth authentication, and encrypted secrets in Supabase Vault
- ✅ Supabase Auth con correo + contraseña (verificación por email, recuperación)
- ✅ OAuth: Google, Discord, GitHub, Twitch y Spotify (PKCE flow)
- ✅ Steam: OpenID 2.0 vía Edge Functions
- ✅ Riot Games: vinculación de cuentas para Valorant
- 💳 Stripe live - Payment Links
- BASIC: 9 € (IVA incluido)
- PRO: 19 € (IVA incluido)
- ELITE: 39 € (IVA incluido)
- 🔔 Webhook (desplegado aparte) → actualización de planes
- 🎯 Zona VIP con contenido exclusivo por plan
- 🏆 Creación y gestión de torneos multi-juego
- 📊 Tablas de clasificación (leaderboards)
- 🎮 12 juegos soportados: LoL, MLBB, FC26, Fortnite, Clash Royale, Rocket League, Valorant, CS2, COD Warzone, Apex Legends, Overwatch 2, Rainbow Six Siege
- 📝 Sistema de inscripción automática
- 🔔 Notificaciones en Discord
- 🎮 Steam: vinculación de cuentas (OpenID 2.0)
- 🔫 Valorant: stats ranked vía ValoTracker bot
- 💬 Discord: bot
vantcallcon comandos/vincular rioty/perfil - 🌐 Riot Games: API para datos de jugadores
- 👑 Dashboard exclusivo para admins (
public.web_admins) - 📈 Métricas: jugadores, torneos, eventos, ranked, soporte
- 🤖 Gestión del bot Discord (activar/desactivar comandos, sync, announce)
- 💎 Configuración de planes y contenido VIP
VantsportsOficial/
├── index.html, app.js, auth.js, admin.js, zona.js, data.js, db.js, ranks.js, premium.js
│ # Frontend estático (HTML + JS vanilla + CSS), sin build
├── *.css # Estilos (base, style, premium, vip)
├── vendor/ # Librerías de terceros
├── bot/ # Bot de Discord (Python, discord.py)
│ ├── main.py # Cliente, comandos slash y arranque
│ ├── commands/ # perfil.py, vincular.py
│ ├── utils/ # health.py (healthcheck HTTP), supabase_client.py
│ └── requirements.txt
├── supabase/
│ ├── functions/ # Edge Functions
│ │ ├── steam-login/
│ │ ├── discord-commands/
│ │ ├── discord-admin/
│ │ └── discord-notify/
│ ├── schema.sql # Estructura de BD
│ ├── seed.sql # Datos iniciales
│ └── migrations/ # Migraciones
├── config.toml # verify_jwt de las Edge Functions públicas
└── assets/
├── brand/ # Logo, favicon, iconos
├── ranks/ # 8 emblemas de rango premium
└── BRAND.md # Guía de marca
| Tabla | Descripción |
|---|---|
players |
Perfiles de jugadores (discord_user_id, auth_user_id, plan, verificación) |
user_game_accounts |
Cuentas externas vinculadas (Steam, Riot, etc.) con verified = true |
purchases |
Historial de compras Stripe (client_reference_id = user_id) |
tournament_participants / tournament_entries |
Inscripciones a torneos |
web_events |
Eventos de la web (publicados en Discord #web-eventos) |
web_admins |
Lista de administradores (RLS protegido) |
plan_content |
Contenido exclusivo por plan (BASIC/PRO/ELITE) |
bot_commands |
Catálogo de comandos del bot (activar/desactivar, plan mínimo) |
discord_channels |
Canales para notificaciones de torneos/eventos |
- 🔒
web_admins: solo lectura/escritura para admins - 🔒
purchases: solo el usuario propietario - 🔒
user_game_accounts: índice único(user_id, game) - 🔒 Secretos en Supabase Vault (nunca en el repo)
Gateway (Python, bot/main.py)
| Comando | Descripción |
|---|---|
/vincular riot |
Vincula cuenta de Riot Games al perfil |
/perfil |
Muestra el perfil VANTS del jugador |
/valorant ranking |
Top 10 de Valorant |
/valorant perfil |
Stats de Valorant de un jugador |
/setup |
Configura los canales del servidor (solo administradores) |
HTTP Interactions (Edge Function discord-commands): /ayuda, /zona, /web, /vincular, /perfil, /ranking, /torneos, /torneo inscribir, /eventos, /calendario, /planes y lo[...]
Panel admin web (Edge Function discord-admin): acciones status, connect, sync y announce, que requieren un usuario de web_admins. No son comandos slash.
| /perfil | Muestra stats del jugador (torneos, rango, cuentas vinculadas) |
| /valorant ranking | Muestra top 10 de Valorant |
| /valorant perfil | Muestra stats de Valorant de un jugador |
| /status | Estado del bot (solo staff) |
| /connect | Conecta el servidor con VANTS (guarda token en Vault) |
| /sync | Sincroniza datos de torneos y jugadores |
| /announce | Publica anuncios en canales configurados |
- Gateway (Python):
bot/main.pycondiscord.py; exponeGET /en$PORTcomo healthcheck - HTTP Interactions (Edge Functions):
discord-commands,discord-admin,discord-notify - Despliegue: Railway/Render con variables de entorno:
DISCORD_TOKEN=<tu_token> DISCORD_GUILD_ID=<id_del_servidor> SUPABASE_URL=https://qtetsgwwsvqzquxssudj.supabase.co SUPABASE_SERVICE_ROLE_KEY=<service_role_key>
⚠️ Nota: Si usas el endpoint HTTP (Edge Functions), Discord solo envía interacciones al endpoint, no al gateway Python.
| Variable | Ubicación | Uso |
|---|---|---|
STRIPE_WEBHOOK_SECRET |
Supabase Vault / .env | Verificar firma de webhooks |
STEAM_WEB_API_KEY |
Supabase Vault | API de Steam (OpenID) |
DISCORD_TOKEN |
Supabase Vault / .env | Bot de Discord |
SUPABASE_SERVICE_ROLE_KEY |
Supabase Vault / .env | Operaciones admin en BD |
STEAM_LOGIN_REDIRECTS |
Supabase Vault | Lista de destinos permitidos |
- Site URL:
https://vantsbetaa.pplx.app - Redirect URLs:
https://vantsbetaa.pplx.app/** - Discord Client ID:
1552959749891297320 - Discord Redirect:
https://qtetsgwwsvqzquxssudj.supabase.co/auth/v1/callback - Google Cloud Redirect:
https://qtetsgwwsvqzquxssudj.supabase.co/auth/v1/callback - Activa GitHub, Twitch y Spotify en Supabase → Authentication → Sign In / Providers e introduce el Client ID/Secret de cada app. No guardes esos secretos en este repositorio.
- En GitHub OAuth Apps, Twitch Developer Console y Spotify Developer Dashboard configura como callback
https://<PROJECT_REF>.supabase.co/auth/v1/callback. - Autoriza los dominios públicos de la web en Supabase → Authentication → URL Configuration → Redirect URLs. En el login se solicitan los scopes
read:user user:emailpara GitHub yuser:read:emailpara Twitch.
- Activa Spotify en Supabase → Authentication → Sign In / Providers y configura el Client ID y Client Secret de tu aplicación de Spotify. El callback del proveedor es
https://<PROJECT_REF>.supabase.co/auth/v1/callback. - Añade ese callback en la lista de Redirect URIs de Spotify y añade los dominios públicos de la web en la lista de Redirect URLs de Supabase Auth. El Web Playback SDK requiere HTTPS (excepto localhost).
- El login y la vinculación piden los permisos
streaming,user-modify-playback-state,user-read-playback-state,user-read-currently-playing,user-read-emailyuser-read-private. - El reproductor usa el token OAuth temporal devuelto por Supabase; no pongas el Client Secret ni tokens en el frontend. El usuario necesita Spotify Premium para reproducir desde el Web Playback SDK.
- Para escuchar, inicia sesión con Spotify (o vincúlalo desde Mi cuenta), abre Mi cuenta y pega una URI o enlace de canción, álbum o playlist de Spotify.
- Python 3.10+ (frontend y bot)
- Node.js 18+ (solo para la Supabase CLI)
Es un sitio estático: no hay package.json ni paso de build. Las claves de Supabase (URL y anon key) están en db.js.
# Servir en local
python3 -m http.server 8080
# Abrir http://localhost:8080cd bot
# Instalar dependencias
pip install -r requirements.txt
# Copiar y configurar .env
cp .env.example .env
# Editar: DISCORD_TOKEN, SUPABASE_SERVICE_ROLE_KEY
# Ejecutar
python main.py
# O desde la raíz: python bot/main.py# Instalar Supabase CLI
npm install -g supabase
# Login
supabase login
# Link al proyecto
supabase link --project-ref qtetsgwwsvqzquxssudj
# Deploy de funciones (verify_jwt se toma de config.toml)
supabase functions deploy steam-login
supabase functions deploy discord-commands
supabase functions deploy discord-admin
supabase functions deploy discord-notify
stripe-webhookno está en este repo. Los Payment Links de Stripe están enauth.js; la asignación automática de planes depende de un webhook que debe desplegarse aparte.
sequenceDiagram
participant User
participant Web
participant Stripe
participant Supabase
participant Webhook
User->>Web: Click en "Suscribirse"
Web->>Stripe: Payment Link (BASIC/PRO/ELITE)
User->>Stripe: Completa el pago
Stripe->>Webhook: POST /stripe-webhook
Webhook->>Webhook: Verificar firma
Webhook->>Supabase: INSERT purchases
Supabase->>Supabase: Trigger → actualizar plan
Supabase->>Web: plan_content actualizado
Web->>User: Acceso a Zona VIP
- Logo:
assets/brand/(favicon, icono Discord, imagen social) - Rangos: 8 emblemas premium en
assets/ranks/(generados porranks.js) - Guía completa:
assets/BRAND.md
supabase/schema.sql # Tablas principales
supabase/seed.sql # Datos iniciales
supabase/migrations/20261001_admin_bot_premium.sql # Admins, bot y premium
supabase/migrations/20261001_owner_identities.sql # Propietario e identidades# Con la CLI (recomendado)
supabase db push
# O manualmente con psql
psql "postgresql://postgres:<password>@db.qtetsgwwsvqzquxssudj.supabase.co:5432/postgres" \
-f supabase/schema.sql \
-f supabase/seed.sql \
-f supabase/migrations/20261001_admin_bot_premium.sql \
-f supabase/migrations/20261001_owner_identities.sql- Ve a Discord Developer Portal
- OAuth2 → Reset Secret
- Copia el nuevo Client Secret
- Supabase → Authentication → Providers → Discord → pega el nuevo secret
- Redirect obligatoria:
https://qtetsgwwsvqzquxssudj.supabase.co/auth/v1/callback
- Verifica que
DISCORD_TOKENesté correcto en .env - Revisa que el bot tenga permisos en el servidor
- Si usas Edge Functions, asegúrate de que el endpoint esté activo
- Verifica
STRIPE_WEBHOOK_SECRETen Supabase Vault - Prueba el endpoint (desplegado aparte, ver sección Edge Functions) con Stripe CLI:
stripe listen --forward-to https://qtetsgwwsvqzquxssudj.supabase.co/functions/v1/stripe-webhook
MIT License.
- Fork el repo
- Crea una rama (
git checkout -b feature/nueva-funcionalidad) - Commit (
git commit -m 'Añade nueva funcionalidad') - Push (
git push origin feature/nueva-funcionalidad) - Pull Request
- Web: https://vantsbetaa.pplx.app/
- Discord: Únete al servidor oficial
- Email: feisplaa@gmail.com