WebSocket API
概要¶
WebSocket APIはSocketサーバーとWebSocket通信を行い、チャットサービスを提供します。 ゲームクライアントの接続、チャネルメッセージの送信などをサポートしています。
WebSocket APIの主な機能は以下の通りです。
- クライアント接続 / 切断
- PING / PONG
- チャットメッセージの送信 / 受信- チャンネルチャット
- 1:1 チャット
 
- ブロックしたユーザーのフィルタリング- ブロックしたユーザーにメッセージを送信しない
- ブロックしたユーザーからメッセージを受信しない
 
- チャンネルの入退室通知
基本情報¶
WebSocket APIを使用する際に、共通して知っておくべき基本情報を案内します。
主要用語¶
- チャンネル: チャットルーム
- チャンネルメッセージ: 参加したチャンネルのすべてのユーザーに送信されるチャットメッセージ
- 1:1メッセージ: 特定のユーザーにのみ送信されるチャットメッセージ
パケットタイプ¶
ソケットサーバーと送受信するパケットタイプは以下の通りです。
| パケット名 | 説明 | 
|---|---|
| CONNECT | ソケットサーバー接続 | 
| RESPONSE_CONNECT | CONNECTリクエストに対する応答 | 
| DISCONNECT | ソケットサーバー接続解除 | 
| RESPONSE_DISCONNECT | DISCONNECTリクエストに対する応答 | 
| PING | 接続維持 CONNECTが成功していない状態でPINGリクエストを送信すると、サーバーが接続を解除します | 
| PONG | PINGリクエストに対する応答 | 
| CHANNEL_CHAT | チャンネルチャット | 
| RESPONSE_CHANNEL_CHAT | CHANNEL_CHATリクエストに対する応答 | 
| DIRECT_CHAT | 1:1チャット | 
| RESPONSE_DIRECT_CHAT | DIRECT_CHATリクエストに対する応答 | 
| NOTIFY_ENTER_CHANNEL | チャンネル入場メッセージ | 
| NOTIFY_EXIT_CHANNEL | チャンネル退場メッセージ | 
| NOTIFY_DELETE_CHANNEL | チャンネル削除メッセージ | 
| NOTIFY_CHANNEL_NOTICE | チャンネル通知メッセージ | 
| NOTIFY_CHANNEL_CHAT | チャンネルチャットメッセージ | 
| NOTIFY_DIRECT_CHAT | 1:1チャットメッセージ | 
| NOTIFY_DISCONNECT | 接続解除メッセージ WebSocket接続がアイドル状態の時、Jsonフォーマットが無効な場合にこのパケットタイプで応答 | 
ソケット接続プロセス¶
-  ゲームサーバーでチャットHttp APIを使ってトークン発行をリクエストします。※ 発行されたトークンはチャットSocketサーバー接続に使用されます - Hive Certification Keyを使用してユーザートークン発行APIをリクエストします
 
-  ゲームクライアントからSocketサーバーへの接続要求 - WebSocket通信
- 1番の過程で発行されたトークンを使用
- 接続に成功すると、Socketサーバーは以下の情報を返します
 
ソケット通信構造¶
-  'RESPONSE_'で始まるパケットタイプのJSON形式 
-  その他のパケット形式 
サーバー側でWebSocket接続が切断される場合は、以下の通りです。
- クライアント側で1分間何のリクエストもない場合
- JSON形式でない場合
- status値が401、403の時- 401 unauthorized
- 403 forbidden
 
応答コード¶
応答ステータスコードです。
| ステータスコード | ステータスメッセージ | 説明 | 
|---|---|---|
| 200 | 成功 | 成功 | 
| 400 | 不正なリクエスト | 不正なリクエスト | 
| 401 | 認証エラー | 権限なし | 
| 403 | 禁止 | サーバーで拒否されました | 
| 408 | リクエストタイムアウト | クライアントから60秒間リクエストがなかったため、サーバーが接続を解除しました | 
| 409 | 競合 | ユーザーのリクエストがサーバーの状態と競合しています (例: 1:1チャット相手がオフラインの場合) | 
| 500 | 内部サーバーエラー | 内部サーバーエラー | 
WebSocket API 機能¶
チャットサービスに利用されるWebSocket APIの機能別APIリクエストおよび応答、例のコードを説明します。
クライアント接続¶
リクエストパラメータ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | クライアント接続コマンド ( CONNECT) | string | Y | 
| body | リクエストデータ | object | Y | 
リクエストパラメータ > 本文¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲーム インデックス | integer | Y | e.g. 1 | 
| playerId | アカウント識別子 Hive プレイヤー ID | long | Y | e.g. 1234 | 
| loginKey | 接続時に使用するトークン チャット Http APIで発行 | string | Y | "eyJhbGciOiJIUzI1NiJ9.eyJnYW1lSW5kZXgiOjEsInBsYXllcklkIjoxMjM0LCJpYXQiOjE3MzAzNjY4MjksImV4cCI6MTczMDM3MDQyOX0.fpg6kqwqp1QN3KuYcjVBr8j0mzjN2doefJ_D6xFxcFY" | 
| extraData | ユーザー追加情報 ( UTF-8基準)(最大 256 Byte) | string | N | e.g. "{\"nickname\":\"Test1234\",\"guildname\":\"together\"}" | 
レスポンスボディ¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 
|---|---|---|---|
| packetType | 接続要求に対する応答 ( RESPONSE_CONNECT) | string | Y | 
| status | ステータスコード | integer | Y | 
| message | ステータスメッセージ | string | Y | 
| body | 返却データ | object | Y | 
レスポンスボディ > ボディ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| sessionId | 接続成功時に返される値 | string | Y | 例: "005056fffea3fd10-000400fd-00000797-f67881178d98d1cd-64ae9a76" | 
リクエストサンプル¶
{
    "packetType": "CONNECT",
    "body":{
        "gameIndex":1,
        "playerId": 1234,
        "loginKey": JWT generated by API server,
                "extraData": Additional information
    }
}
レスポンスサンプル¶
{
    "packetType":"RESPONSE_CONNECT",
    "status": 200,
    "message":"OK",
    "body":{
        "sessionId":"005056fffea3fd10-000400fd-00000797-f67881178d98d1cd-64ae9a76"
    }
}
クライアント接続解除¶
リクエストパラメータ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | クライアント接続解除コマンド ( DISCONNECT) | string | Y | 
| body | リクエストデータ | object | Y | 
リクエストパラメータ > 本文¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| sessionId | 接続成功時に返される sessionId | string | N | e.g. "6c2408fffe8c91a8-00002f24-00000032-093b757cdc668383-54b4fbc1" | 
- sessionId を指定しない場合、websocket に割り当てられた sessionId に対する切断処理
- sessionId を指定する場合、該当値に対する切断処理
レスポンスボディ¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 
|---|---|---|---|
| packetType | 接続解除リクエストに対する応答 ( RESPONSE_DISCONNECT) | string | Y | 
| status | ステータスコード | integer | Y | 
| message | ステータスメッセージ | string | Y | 
リクエストサンプル¶
-  sessionIdを指定していない場合 
-  sessionIdを指定する場合 
レスポンスサンプル¶
PING / PONG¶
- ソケットサーバーとCONNECTが完了した状態でのみリクエストが有効です
- PONG応答がない場合は再ログインが必要です
リクエストパラメータ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | PING リクエストコマンド ( PING) | string | Y | 
レスポンスボディ¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 
|---|---|---|---|
| packetType | PONG 応答コマンド ( PONG) | string | Y | 
リクエストサンプル¶
レスポンスサンプル¶
チャンネルメッセージ送信¶
リクエストパラメータ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | チャンネルメッセージ送信コマンド ( CHANNEL_CHAT) | string | Y | 
| body | リクエストデータ | object | Y | 
リクエストパラメータ > 本文¶
| フィールド名 | 説明 | タイプ | 必須 | 例 | 
|---|---|---|---|---|
| gameIndex | Hiveゲームインデックス | integer | Y | e.g. 1 | 
| from | チャンネルにメッセージを送信するアカウント識別子 HiveプレイヤーID | long | Y | e.g. 1234 | 
| to | チャンネルメッセージを送信するチャンネルID チャットHttp APIで生成 | string | Y | e.g. "open:1" | 
| message | チャンネルに送信するメッセージ (最大200文字) | string | Y | e.g. "Hello World!" | 
| langCode | Hive言語コード (ISO 639 alpha-2に基づき、ISO 639 alpha-2で区別されない言語はスクリプトタグを付けて区別) | string | Y | e.g. "en" | 
レスポンスボディ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | チャンネルメッセージ送信に対する応答 ( RESPONSE_CHANNEL_CHAT) | string | Y | 
| status | ステータスコード | integer | Y | 
| message | ステータスメッセージ | string | Y | 
リクエストサンプル¶
{
    "packetType":"CHANNEL_CHAT",
    "body": {
        "gameIndex": 1,
        "from": 1234,
        "to": "open:1",
        "message": "Hello World!",
        "langCode": "en"
    }
}
レスポンスサンプル¶
1:1 メッセージ送信¶
リクエストパラメータ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | 1:1 メッセージ送信コマンド ( DIRECT_CHAT) | string | Y | 
| body | リクエストデータ | object | Y | 
リクエストパラメータ > 本文¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲーム インデックス | integer | Y | 例: 1 | 
| from | 1:1 メッセージを送信するアカウント識別子 Hive プレイヤー ID | long | Y | 例: 1234 | 
| to | 1:1 メッセージを受信するアカウント識別子 Hive プレイヤー ID | long | Y | 例: 2222 | 
| message | 1:1で送信するメッセージ (最大 200文字) | string | Y | 例: "Hello World!" | 
| langCode | Hive 言語コード (ISO 639 alpha-2を基準とし、ISO 639 alpha-2で区別されない言語はScriptタグを付けて区別) | string | Y | 例: "en" | 
レスポンスボディ¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 
|---|---|---|---|
| packetType | 1:1 メッセージ送信に対する応答 ( RESPONSE_DIRECT_CHAT) | string | Y | 
| status | 状態コード | integer | Y | 
| message | 状態メッセージ | string | Y | 
レスポンスボディ > body¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| status | 応答ステータスコード | integer | Y | e.g. 200 | 
リクエストサンプル¶
{
  "packetType": "DIRECT_CHAT",
  "body": {
    "gameIndex": 1,
    "from": 2222,
    "to": 1234,
    "message": "안녕하세요.",
    "langCode": "ko"
  }
}
レスポンスサンプル¶
ソケットサーバーイベントメッセージ¶
イベント発生時に、サーバーからクライアントに送信されるメッセージについて説明します。
このメッセージは、packetTypeがNOTIFYで始まります。
チャンネル入場メッセージ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | チャンネル入場メッセージ ( NOTIFY_ENTER_CHANNEL) | string | Y | 
| body | リクエストデータ | object | Y | 
本文¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲーム インデックス | integer | Y | e.g. 1 | 
| channelId | 入場したチャンネル ID | string | Y | e.g. "open:10" | 
| playerId | チャンネルに入場したアカウント識別子 Hive プレイヤー ID | long | Y | e.g. 1234 | 
| extraData | ユーザー追加情報 ( UTF-8基準)(最大 256 Byte) | string | Y | e.g. "abcd" | 
| timestamp | チャンネルに入場した日時 ( UTC+0基準,yyyy-MM-dd'T'HH:mm:ss.SSSZ形式) | string | Y | e.g. "2024-11-12T08:59:59.497Z" | 
サンプル¶
{
  "packetType": "NOTIFY_ENTER_CHANNEL",
  "body": {
    "gameIndex": 1,
    "channelId": "open:10",
    "playerId": 1234,
    "extraData": "abcd",
    "timestamp": "2024-11-12T08:59:59.497Z"
  }
}
チャンネル退出メッセージ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | チャンネル退出メッセージ ( NOTIFY_EXIT_CHANNEL) | string | Y | 
| body | リクエストデータ | object | Y | 
本文¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲームインデックス | integer | Y | e.g. 1 | 
| channelId | 退出したチャンネル ID | string | Y | e.g. "open:10" | 
| playerId | チャンネルで退出したアカウント識別子 Hive プレイヤー ID | long | Y | e.g. 2222 | 
| extraData | ユーザー追加情報 ( UTF-8基準)(最大 256 Byte) | string | Y | e.g. "abcd" | 
| timestamp | チャンネルで退出した日時 ( UTC+0基準,yyyy-MM-dd'T'HH:mm:ss.SSSZ形式) | string | Y | e.g. "2024-11-12T08:59:59.497Z" | 
サンプル¶
{
  "packetType": "NOTIFY_EXIT_CHANNEL",
  "body": {
    "gameIndex": 1,
    "channelId": "open:10",
    "playerId": 2222,
    "extraData": "abcd",
    "timestamp": "2024-11-12T09:29:35.872Z"
  }
}
チャンネル削除メッセージ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | チャンネル削除メッセージ ( NOTIFY_DELETE_CHANNEL) | string | Y | 
| body | リクエストデータ | object | Y | 
本文¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲームインデックス | integer | Y | e.g. 1 | 
| channelId | 削除したチャンネル ID | string | Y | e.g. "open:10" | 
| timestamp | チャンネルを削除した日時 ( UTC+0基準,yyyy-MM-dd'T'HH:mm:ss.SSSZ形式) | string | Y | e.g. "2024-11-12T08:59:59.497Z" | 
サンプル¶
{
  "packetType": "NOTIFY_DELETE_CHANNEL",
  "body": {
    "gameIndex": 1,
    "channelId": "owner:1",
    "timestamp": "2024-11-13T05:06:29.198Z"
  }
}
チャンネル通知メッセージ¶
| フィールド名 | 説明 | タイプ | 必須 여부 | 
|---|---|---|---|
| packetType | 通知メッセージ ( NOTIFY_CHANNEL_NOTICE) | string | Y | 
| body | リクエストデータ | object | Y | 
本文¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲーム インデックス | integer | Y | e.g. 1 | 
| channelId | お知らせメッセージを受信したチャンネル ID | string | N | e.g. "open:10" | 
| from | お知らせメッセージを送信したアカウント識別子 | string | Y | e.g. SYSTEM | 
| message | お知らせメッセージの内容 | string | Y | e.g. "お知らせメッセージです。" | 
| timestamp | お知らせメッセージを送信した日時 ( UTC+0基準,yyyy-MM-dd'T'HH:mm:ss.SSSZ形式) | string | Y | e.g. "2024-11-13T05:06:29.198Z" | 
サンプル¶
// Announcement to specific channel
{
  "packetType": "NOTIFY_CHANNEL_NOTICE",
  "body": {
    "gameIndex": 1,
    "channelId": "open:10",
    "from": "SYSTEM",
    "message": "Announcement message.",
    "timestamp": "2024-11-13T05:06:29.198Z"
  }
}
チャンネルメッセージ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | チャンネルメッセージ ( NOTIFY_CHANNEL_CHAT) | string | Y | 
| body | リクエストデータ | object | Y | 
本文¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲームインデックス | integer | Y | e.g. 1 | 
| from | チャンネルメッセージを送信したアカウント識別子 Hive プレイヤー ID | long | Y | e.g. 2222 | 
| fromExtra | ユーザー追加情報 ( UTF-8基準)(最大 256 Byte) | string | Y | e.g. "bbbb" | 
| to | チャンネルメッセージを送信したチャンネル ID | string | Y | e.g. "open:10" | 
| langCode | Hive 言語コード (ISO 639 alpha-2を基準としており、ISO 639 alpha-2で区別されない言語はScriptタグを付けて区別) | string | Y | e.g. "ko" | 
| timestamp | チャンネルメッセージを送信した日時 ( UTC+0基準,yyyy-MM-dd'T'HH:mm:ss.SSSZ形式) | string | Y | e.g. "2024-11-13T05:12:18.385Z" | 
サンプル¶
{
  "packetType": "NOTIFY_CHANNEL_CHAT",
  "body": {
    "gameIndex": 1,
    "from": 2222,
    "fromExtra": "bbbb",
    "to": "open:10",
    "message": "Hello World!",
    "langCode": "ko",
    "timestamp": "2024-11-13T05:12:18.385Z"
  }
}
1:1 メッセージ¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 
|---|---|---|---|
| packetType | 1:1 メッセージ ( NOTIFY_DIRECT_CHAT) | string | Y | 
| body | リクエストデータ | object | Y | 
本文¶
| フィールド名 | 説明 | タイプ | 必須かどうか | 例 | 
|---|---|---|---|---|
| gameIndex | Hive ゲームインデックス | integer | Y | e.g. 1 | 
| from | 1:1 メッセージを受け取ったアカウント識別子 Hive プレイヤー ID | long | Y | e.g. 1234 | 
| fromExtra | ユーザー追加情報 ( UTF-8基準)(最大 256 Byte) | string | Y | e.g. "abcd" | 
| to | 1:1 メッセージを送信したアカウント識別子 Hive プレイヤー ID | long | Y | e.g. 2222 | 
| message | 1:1 メッセージ内容 | string | Y | e.g. "こんにちは。1:1 チャットです。" | 
| langCode | Hive 言語コード (ISO 639 alpha-2を基準とし、ISO 639 alpha-2で区分されない言語はScriptタグを付けて区分) | string | Y | e.g. "ko" | 
| timestamp | 1:1 メッセージを送信した日時 ( UTC+0基準,yyyy-MM-dd'T'HH:mm:ss.SSSZ形式) | string | Y | e.g. "2024-11-13T05:12:50.060Z" |