Переход с Discord
Запустите своего бота для Discord на GameVox, изменив два параметра конфигурации: базовый URL REST и URL шлюза. Без изменений кода и без замены SDK.
1. Создайте приложение бота в GameVox
- Войдите на developers.gamevox.com
- Нажмите Новое приложение
- Скопируйте токен бота из окна создания (он показывается один раз, сохраните его сразу)
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 ничего из этого не хранит: ваше приложение остаётся единственным владельцем своей конфигурации.
Вся интеграция это один обработчик шлюза и один 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 попал в лог и ответ пришёл, ваш бот полностью подключён. Слэш-команды, голос, компоненты: ничего из этого тоже не требует изменений.