Портал разработчиков
Экспериментально Платформа для ботов и приложений активно развивается. Поддержка собственных серверов вышла 13.08.2026, и функций там пока меньше, чем в облаке. Посмотрите, что поддерживается.
← Документация

Переход с Discord

Запустите своего бота для Discord на GameVox, изменив два параметра конфигурации: базовый URL REST и URL шлюза. Без изменений кода и без замены SDK.

1. Создайте приложение бота в GameVox

  1. Войдите на developers.gamevox.com
  2. Нажмите Новое приложение
  3. Скопируйте токен бота из окна создания (он показывается один раз, сохраните его сразу)

2. Направьте библиотеку на GameVox

REST API доступен по адресу app-api.gamevox.com. Прежнее имя, bot-api.gamevox.com, указывает на тот же API и продолжает работать, поэтому существующих ботов менять не нужно.

discord.js (Node, v14+)

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

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
  rest: { api: 'https://app-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://app-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://app-api.gamevox.com/api"))
    .setGatewayPool(scheduler)
    .build();
// JDA при запуске читает URL шлюза из /gateway/bot,
// а наша прослойка REST возвращает там wss://gateway.gamevox.com.

Eris (Node)

const Eris = require('eris');

const client = new Eris(GAMEVOX_BOT_TOKEN, {
  rest: { baseURL: 'https://app-api.gamevox.com/api/v10' },
  ws: { gateway: 'wss://gateway.gamevox.com' },
  // Eris по умолчанию использует кодировку ETF; принудительно включите JSON (GameVox пока не поддерживает 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://app-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://app-api.gamevox.com/api/v10")
    .gateway_url("wss://gateway.gamevox.com")
    .await?;
client.start().await?;

3. Установите бота на сервер

На вкладке OAuth2 вашего приложения в портале разработчиков соберите URL установки с нужными правами и поделитесь им. URL имеет стандартный для Discord вид:

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

Владельцы серверов переходят по ссылке, выбирают свой сервер GameVox и подтверждают.

4. Чем отличается

Цель: совместимость на 100%. Логике вашего бота не нужно знать, что это не Discord. Но несколько моментов стоит учитывать:

  • Приложения настраиваются внутри клиента. GameVox умеет отрисовывать форму настроек вашего приложения в настройках сервера, так что настраиваемому боту больше не нужен размещённый дашборд. Это единственная намеренная несовместимость и единственная часть платформы, у которой нет аналога в Discord. Полная документация →
  • Эпоха snowflake: та же, что в Discord (1420070400000, 2015-01-01 UTC). Парсеры, написанные для Discord, работают с ID GameVox без изменений. Подробнее →
  • Темы (threads) и публикации форумов пока не поддерживаются.
  • Голос работает с Lavalink. Никакой особой настройки. VOICE_SERVER_UPDATE просто указывает на compatible-voice-gateway-{region}.gamevox.com, а остальное делает Lavalink.
  • Собственные эмодзи: эмодзи сервера работают в сообщениях точно так же, как в Discord. Эмодзи приложения пока управляются в портале разработчиков; bot-API предоставляет только GET. См. Эмодзи.
  • Собственные серверы: пользователи могут запускать GameVox на своём железе. Ваш бот работает и там, включая слэш-команды и компоненты сообщений, но с чуть меньшим набором возможностей. См. документацию по собственным серверам.
  • Задержка записи в ЕС и Азиатско-Тихоокеанском регионе: у ботов, размещённых вне us-east, запись будет медленнее примерно на 80–150 мс из-за перенаправления записи в Aurora. Для лучшей производительности размещайте бота в us-east.

5. Настройте приложение прямо в GameVox

В Discord бот с любыми настройками поставляется с веб-дашбордом: домен, вход через OAuth2, сессии, проверки прав, хостинг. И обычно лишь затем, чтобы оператор выбрал канал для логов и переключил три функции. GameVox уже знает, кто оператор, какой сервер он настраивает и имеет ли он на это право, поэтому предоставляет такую панель вашему приложению напрямую.

Ваше приложение описывает форму через шлюз; GameVox отрисовывает её в разделе Настройки сервера ▸ Интеграции ▸ Настройки и возвращает изменённые значения прямо вам. GameVox ничего из этого не хранит: ваше приложение остаётся единственным владельцем своей конфигурации.

Окно настроек сервера в клиенте GameVox: вкладка «Настройки» установленного приложения с выпадающим списком языка, переключателем и списком каналов с флажками.
Целиком отрисовано из одного ответа бота. Бот не отправлял ни одного id канала: список выбора называет вид, а GameVox подставляет варианты этого сервера. Названия сервера и каналов скрыты.

Вся интеграция это один обработчик шлюза и один 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 }),
  });
});

Двенадцать типов полей, включая выбор каналов и ролей, который GameVox заполняет за вас, условные поля, маскированные секреты и разделы. Настройки в приложении →

6. Проверьте

Простейший smoke-тест: отвечайте pong на !ping.

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

Если READY попал в лог и ответ пришёл, ваш бот полностью подключён. Слэш-команды, голос, компоненты: ничего из этого тоже не требует изменений.