Portal de Desarrolladores
Experimental La plataforma de bots y apps está en desarrollo activo. La compatibilidad con servidores autoalojados llegó el 13-08-2026 con menos funciones que la nube. Consulta qué se admite.
← Documentación

Migrar desde Discord

Haz funcionar tu bot de Discord en GameVox cambiando dos valores de configuración: la URL base de REST y la URL del gateway. Sin cambios de código ni de SDK.

1. Crea una aplicación de bot en GameVox

  1. Inicia sesión en developers.gamevox.com
  2. Pulsa Nueva aplicación
  3. Copia el token del bot del diálogo de creación (se muestra una sola vez, guárdalo ya)

2. Apunta tu biblioteca a GameVox

discord.js (Node, v14+)

const { Client, GatewayIntentBits } = require('discord.js');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
  rest: { api: 'https://bot-api.gamevox.com/api' },
  ws:   { gatewayURL: 'wss://gateway.gamevox.com' },
});

client.login(process.env.GAMEVOX_BOT_TOKEN);

discord.py

import discord

discord.http.Route.BASE = 'https://bot-api.gamevox.com/api/v10'
discord.gateway.DiscordWebSocket.DEFAULT_GATEWAY = (
    'wss://gateway.gamevox.com/?v=10&encoding=json'
)

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)
client.run(GAMEVOX_BOT_TOKEN)

JDA (Java)

JDA jda = JDABuilder.createDefault(GAMEVOX_BOT_TOKEN)
    .setGatewayEncoding(GatewayEncoding.JSON)
    .setRestConfig(new RestConfig().setBaseUrl("https://bot-api.gamevox.com/api"))
    .setGatewayPool(scheduler)
    .build();
// JDA lee la URL del gateway desde /gateway/bot al arrancar,
// que nuestro shim REST devuelve como wss://gateway.gamevox.com.

Eris (Node)

const Eris = require('eris');

const client = new Eris(GAMEVOX_BOT_TOKEN, {
  rest: { baseURL: 'https://bot-api.gamevox.com/api/v10' },
  ws: { gateway: 'wss://gateway.gamevox.com' },
  // Eris usa ETF por defecto; fuerza JSON (GameVox todavía no habla ETF).
});

client.connect();

DSharpPlus (.NET)

var discord = new DiscordClient(new DiscordConfiguration
{
    Token = Environment.GetEnvironmentVariable("GAMEVOX_BOT_TOKEN"),
    TokenType = TokenType.Bot,
    Intents = DiscordIntents.AllUnprivileged | DiscordIntents.MessageContents,
    ApiChannelEndpoint = "https://bot-api.gamevox.com/api/v10",
    GatewayUri = new Uri("wss://gateway.gamevox.com"),
});

await discord.ConnectAsync();

serenity (Rust)

let mut client = Client::builder(&token, intents)
    .event_handler(Handler)
    .api_base("https://bot-api.gamevox.com/api/v10")
    .gateway_url("wss://gateway.gamevox.com")
    .await?;
client.start().await?;

3. Instala el bot en un servidor

Desde la pestaña OAuth2 de tu aplicación en el portal, construye una URL de instalación con los permisos que necesites y compártela. La URL tiene la forma estándar de Discord:

https://gamevox.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=8

Quien sea propietaria del servidor pulsa el enlace, elige un servidor de GameVox suyo y confirma.

4. Qué es distinto

La superficie de compatibilidad aspira al 100 %. La lógica de tu bot no necesita saber que no es Discord. Algunas cosas que conviene tener presentes:

  • Las apps se configuran dentro del cliente. GameVox puede mostrar el formulario de ajustes de tu app en los Ajustes del servidor, así que un bot configurable ya no necesita un dashboard alojado. Es la única incompatibilidad deliberada y la única parte de la plataforma sin equivalente en Discord. Documentación completa →
  • Época de snowflake: idéntica a la de Discord (1420070400000, 01/01/2015 UTC). Los analizadores escritos para Discord funcionan con los IDs de GameVox sin cambios. Más →
  • Los hilos y publicaciones de foro aún no están admitidos.
  • La voz funciona con Lavalink. Sin configuración especial. VOICE_SERVER_UPDATE simplemente apunta a compatible-voice-gateway-{region}.gamevox.com y Lavalink se encarga del resto.
  • Emojis personalizados: los emojis del servidor funcionan en los mensajes igual que en Discord. Los emojis propios de la app se gestionan por ahora en el portal; la API de bots solo expone GET. Consulta Emojis.
  • Servidores autoalojados: la clientela puede ejecutar GameVox en su propio hardware. Tu bot también funciona allí, con una superficie menor (todavía sin webhooks ni interacciones). Consulta la documentación de autoalojado.
  • Latencia de escritura en EU / AP: los bots alojados fuera de us-east verán unos 80–150 ms de latencia adicional en las escrituras por el reenvío de escrituras de Aurora. Aloja en us-east para el mejor rendimiento.

5. Configura tu app desde dentro de GameVox

En Discord, un bot con cualquier configuración trae un dashboard web: un dominio, un inicio de sesión OAuth2, sesiones, comprobaciones de permisos y alojamiento para todo ello, normalmente solo para que alguien elija un canal de registro y active tres funciones. GameVox ya sabe quién es esa persona, qué servidor está configurando y si tiene permiso, así que ofrece esa superficie directamente a tu app.

Tu app describe un formulario por el gateway; GameVox lo muestra en Ajustes del servidor ▸ Integraciones ▸ Ajustes y te devuelve los valores editados directamente. GameVox no guarda nada — tu app sigue siendo la única propietaria de su configuración.

La ventana de Ajustes del servidor del cliente de GameVox, mostrando la pestaña Ajustes de una app instalada con un desplegable de idioma, un interruptor y una lista de canales.
Generado por completo a partir de la respuesta de un solo bot. El bot no envió ningún id de canal — un selector indica un tipo y GameVox aporta las opciones de este servidor. Nombres de servidor y de canal ocultados.

Toda la integración es un manejador de gateway y una llamada REST:

client.on("raw", async (packet) => {
  if (packet.t !== "APP_SETTINGS_REQUEST") return;
  const { nonce, server_id, action, values } = packet.d;

  const body = action === "save"
    ? { message: await save(server_id, values) }
    : { version: 2, sections: await describe(server_id) };

  await client.rest.post("/applications/@me/settings-response", {
    body: { nonce, ...body },
    query: new URLSearchParams({ server_id }),
  });
});

Doce tipos de campo, incluidos selectores de canal y de rol que GameVox rellena por ti, campos condicionales, secretos enmascarados y secciones. Ajustes dentro de la app →

6. Pruébalo

La prueba de humo más simple: responder a !ping con pong.

client.on(Events.MessageCreate, async (msg) => {
  if (msg.author.bot) return;
  if (msg.content === '!ping') {
    await msg.reply('pong');
  }
});

Si aparece READY en el registro y llega la respuesta, tu bot está completamente conectado. Comandos de barra, voz, componentes: ninguno requiere cambios.