Discord からの移行
設定値を 2 つ(REST のベース URL とゲートウェイ URL)変えるだけで、既存の Discord ボットを GameVox で動かせます。コードの変更も SDK の入れ替えも不要です。
1. GameVox でボットアプリケーションを作成する
- developers.gamevox.com にログイン
- 新規アプリケーションをクリック
- 作成ダイアログでボットトークンをコピー(表示は 1 回だけなので、その場で保存してください)
2. ライブラリの向き先を 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 は起動時に /gateway/bot からゲートウェイ URL を読み込みます。
// 当社の REST シムはそこで 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 は既定で 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://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. ボットをサーバーにインストールする
開発者ポータルでアプリケーションの 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 向けに書いたパーサーは GameVox の ID でもそのまま動きます。詳細 → - スレッド / フォーラム投稿はまだ対応していません。
- ボイスは Lavalink で動きます。 特別な設定は不要です。
VOICE_SERVER_UPDATEはcompatible-voice-gateway-{region}.gamevox.comを指すだけで、あとは Lavalink が処理します。 - カスタム絵文字: サーバー所有の絵文字は Discord とまったく同じようにメッセージ内で使えます。アプリ所有の絵文字は当面ポータルで管理し、ボット API では
GETのみ提供します。絵文字をご覧ください。 - セルフホストサーバー: 顧客は自前のハードウェアで GameVox を運用できます。あなたのボットもそこで動きますが、機能範囲は狭くなります(Webhook とインタラクションは未対応)。セルフホストのドキュメントをご覧ください。
- EU / AP の書き込みレイテンシ: us-east 以外でホストされたボットは、Aurora の書き込み転送により書き込みで約 80〜150 ms の追加レイテンシが発生します。最良の性能を求める場合は us-east でホストしてください。
5. GameVox の中からアプリを設定する
Discord では、設定項目のあるボットはウェブダッシュボードを用意することになります。ドメイン、OAuth2 ログイン、セッション、権限チェック、ホスティング — たいていは運営者がログチャンネルを選び、機能を 3 つ切り替えるためだけにです。GameVox は運営者が誰か、どのサーバーを設定しているか、その権限があるかをすでに把握しているので、その画面をアプリに直接提供します。
アプリはゲートウェイ経由でフォームを記述し、GameVox がサーバー設定 ▸ 連携 ▸ 設定に表示して、編集された値をそのまま返します。GameVox は何も保存しません。設定の所有者はあなたのアプリだけです。
統合はゲートウェイのハンドラー 1 つと REST 呼び出し 1 つだけです。
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 が中身を用意するチャンネル/ロールのピッカーを含む 12 種類のフィールド、条件付きフィールド、マスクされたシークレット、セクションが使えます。アプリ内設定 →
6. 動作を確認する
最も簡単な確認方法は、!ping に pong と返すことです。
client.on(Events.MessageCreate, async (msg) => {
if (msg.author.bot) return;
if (msg.content === '!ping') {
await msg.reply('pong');
}
}); READY がログに出て返信が届けば、ボットは完全に接続できています。スラッシュコマンド、ボイス、コンポーネントも変更は不要です。