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" |