開発者ポータル
試験運用中 ボット&アプリ基盤は現在も活発に開発中です。セルフホストサーバーのサポートは 2026-08-13 に提供を開始しましたが、機能範囲はクラウド版より狭くなっています。対応状況を見る
← ドキュメント

Discord からの移行

設定値を 2 つ(REST のベース URL とゲートウェイ URL)変えるだけで、既存の Discord ボットを GameVox で動かせます。コードの変更も SDK の入れ替えも不要です。

1. GameVox でボットアプリケーションを作成する

  1. developers.gamevox.com にログイン
  2. 新規アプリケーションをクリック
  3. 作成ダイアログでボットトークンをコピー(表示は 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_UPDATEcompatible-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 は何も保存しません。設定の所有者はあなたのアプリだけです。

GameVox クライアントのサーバー設定ウィンドウ。インストール済みアプリの設定タブに、言語のドロップダウン、トグル、チャンネルのチェックリストが表示されています。
1 つのボットの応答だけからすべて描画されています。ボットはチャンネル ID を送っていません。ピッカーが種類を指定すると、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. 動作を確認する

最も簡単な確認方法は、!pingpong と返すことです。

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

READY がログに出て返信が届けば、ボットは完全に接続できています。スラッシュコマンド、ボイス、コンポーネントも変更は不要です。