Przejście z Discorda
Uruchom istniejącego bota Discord w GameVox, zmieniając dwie wartości konfiguracji: bazowy URL REST i URL gatewaya. Bez zmian w kodzie, bez wymiany SDK.
1. Utwórz aplikację bota GameVox
- Zaloguj się na developers.gamevox.com
- Kliknij Nowa aplikacja
- Skopiuj token bota z okna tworzenia (pokazywany jest tylko raz, zapisz go od razu)
2. Skieruj swoją bibliotekę na GameVox
REST API jest pod adresem app-api.gamevox.com. Pierwotna nazwa, bot-api.gamevox.com, to to samo API i nadal działa, więc istniejące boty nie wymagają zmian.
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 przy starcie odczytuje URL gatewaya z /gateway/bot,
// a nasza warstwa REST zwraca tam 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 domyślnie używa kodowania ETF; wymuś JSON (GameVox nie obsługuje jeszcze 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. Zainstaluj bota na serwerze
W zakładce OAuth2 swojej aplikacji w portalu deweloperskim zbuduj URL instalacji z potrzebnymi uprawnieniami i udostępnij go. URL ma standardową postać znaną z Discorda:
https://gamevox.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=8 Właściciele serwerów klikają link, wybierają swój serwer GameVox i potwierdzają.
4. Co jest inaczej
Celem jest 100% zgodności. Logika twojego bota nie musi wiedzieć, że to nie Discord. Warto pamiętać o kilku rzeczach:
- Aplikacje konfiguruje się w kliencie. GameVox może wyświetlić formularz ustawień twojej aplikacji w Ustawieniach serwera, więc bot z konfiguracją nie potrzebuje już hostowanego panelu. To jedyna celowa niezgodność i jedyna część platformy bez odpowiednika na Discordzie. Pełna dokumentacja →
- Epoka snowflake: identyczna jak na Discordzie (
1420070400000, 2015-01-01 UTC). Parsery napisane dla Discorda działają z identyfikatorami GameVox bez zmian. Więcej → - Wątki i posty na forum nie są jeszcze obsługiwane.
- Głos działa z Lavalinkiem. Bez specjalnej konfiguracji.
VOICE_SERVER_UPDATEpo prostu wskazuje nacompatible-voice-gateway-{region}.gamevox.com, a resztą zajmuje się Lavalink. - Własne emoji: emoji serwera działają w wiadomościach dokładnie tak jak na Discordzie. Emoji aplikacji na razie zarządza się w portalu deweloperskim; API botów udostępnia tylko
GET. Zobacz Emoji. - Serwery hostowane samodzielnie: klienci mogą uruchamiać GameVox na własnym sprzęcie. Twój bot działa również tam, łącznie z komendami ukośnikowymi i komponentami wiadomości, choć z nieco mniejszym zakresem funkcji. Zobacz dokumentację serwerów hostowanych samodzielnie.
- Opóźnienie zapisów w EU / AP: boty hostowane poza us-east odczują około 80–150 ms dodatkowego opóźnienia przy zapisach z powodu przekazywania zapisów w Aurorze. Dla najlepszej wydajności hostuj w us-east.
5. Skonfiguruj aplikację z poziomu GameVox
Na Discordzie bot z jakąkolwiek konfiguracją wymaga panelu WWW: domeny, logowania OAuth2, sesji, sprawdzania uprawnień, hostingu. Zwykle tylko po to, żeby operator mógł wybrać kanał logów i przełączyć trzy funkcje. GameVox już wie, kim jest operator, który serwer konfiguruje i czy ma do tego prawo, więc udostępnia tę warstwę bezpośrednio twojej aplikacji.
Twoja aplikacja opisuje formularz przez gateway; GameVox wyświetla go w Ustawienia serwera ▸ Integracje ▸ Ustawienia i odsyła zmienione wartości prosto do niej. GameVox niczego z tego nie przechowuje: twoja aplikacja pozostaje jedynym właścicielem swojej konfiguracji.
Cała integracja to jeden handler gatewaya i jedno wywołanie 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 }),
});
}); Dwanaście typów pól, w tym selektory kanałów i ról, które GameVox wypełnia za ciebie, pola warunkowe, maskowane sekrety i sekcje. Ustawienia w aplikacji →
6. Przetestuj
Najprostszy test: odpowiedz na !ping wiadomością pong.
client.on(Events.MessageCreate, async (msg) => {
if (msg.author.bot) return;
if (msg.content === '!ping') {
await msg.reply('pong');
}
}); Jeśli w logach pojawi się READY i dotrze odpowiedź, twój bot jest w pełni połączony. Komendy ukośnikowe, głos, komponenty: żadne z nich też nie wymagają zmian.