マッチメイキングAPI
 前提条件
 マッチメイキングAPIを使用するには、以下のアイテムを準備する必要があります。
  - API呼び出しのための認証トークン(Certification Key):Hive コンソール アプリセンター > プロジェクトを管理 > ゲームリストからゲームを選択 > ゲームの詳細 > 基本情報 > 認証キー
- ゲームインデックス(gameIndex):Hive コンソール アプリセンター > プロジェクトを管理 > ゲームリストからゲームを選択 > ゲームの詳細 > 基本情報 > ゲームインデックス
- マッチID(matchId):これは、Hive コンソールでマッチを作成する際に確認できます。
リクエストURLルート
   | サーバー | URL | 
  | ライブ | api-match.withhive.com | 
  | サンドボックス | sandbox-api-match.withhive.com | 
 
 一般的な応答コード
 これらは一般的なAPIレスポンスコードです。
   | コード | 値 | 説明 | 
  | 200 | 成功 | 各APIレスポンスを参照してください | 
  | 400 | 不正なリクエスト | リクエストパラメータまたはリクエストボディの入力が不正です | 
  | 401 | 未認証 | リクエストメッセージの認証ヘッダーが欠落しているか無効です | 
  | 403 | 禁止 | API呼び出しのための認証トークン(認証キー)が無効です | 
  | 404 | 見つかりません | 不正なAPIパスです | 
  | 500 | 内部サーバーエラー | 内部サーバーエラーが発生しました | 
 
 リクエストマッチ
 ユーザーがマッチをリクエストする際にこのAPIを呼び出します。matchIdに対応するマッチはHiveコンソールで事前に作成されている必要があります。
 リクエストURL
    | ライブURL | https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
    | サンドボックスURL | https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
  | HTTPメソッド | POST | 
  | コンテンツタイプ | application/json | 
  
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
  | 認証 | API呼び出しのための認証トークン(ベアラー) | 文字列 | はい | 
  
 パスパラメータ
   | フィールド名 | 説明 | タイプ | 必須 | 
  | gameIndex | Hive コンソールアプリセンターで利用可能なプロジェクト識別子 | int | はい | 
  | matchId | Hive コンソールで作成された各マッチ識別子 | int | はい | 
 
 リクエストボディ
    | フィールド名 | 説明 | タイプ | 必須 | 
  | playerId | アカウント識別子 | long | Y | 
  | point | 試合で使用されるスコア。入力範囲は 0 ~ 999,999,999です。入力しない場合は`0`が使用されます。 | integer | N | 
  | extraData | 追加のアカウント情報(ニックネーム、レベル、国など)。最大256文字まで入力できます。試合結果に含まれます。 | string | N | 
  
 応答
    | フィールド名 | 説明 | 
  | playerId | アカウント識別子 | 
  | matchInfo | リクエスト対象情報  gameIndex:gameIndexの値matchId:matchIdの値 | 
  | requestingStatus | リクエストステータス情報  requested: マッチが正常にリクエストされましたnotRequested: マッチがリクエストされていないか、マッチがすでに完了しているため、進行中のリクエストはありません | 
  | requestingInfo | リクエスト情報  requestTimeUtc: UTC+0でのリクエスト時間point: リクエスト時に入力されたpointextraData: リクエスト時に入力されたextraData | 
  | matchingInfo | マッチステータス情報 ( status) matchingInProgress: マッチ進行中timeout: 制限時間内にマッチが行われなかったmatched: マッチが完了しました | 
  
 リクエストサンプル
 curl --location 'https://sandbox-api-match.withhive.com/gameindexes/1/matchmakings/1/request' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJIaXZlIiwiaWF0IjoxNzAyNDU4MTkzLCJqdGkiOiIxMzY2NDk4MjcxIn0.VSwvsTE-tS0sL_e9p9gNvHRkMCbsycSO4ObE4J2ya3a' \
--data '{
   "playerId":100,
   "point": 1000
}'
応答サンプル
 {
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "requested",
   "requestingInfo": {
       "requestTimeUtc": "2024-06-05T05:09:28.72",
       "point": 1000
   },
   "matchingInfo": {
       "status": "matchingInProgress"
   }
}
マッチステータスを確認
 リクエストされた試合のステータスを確認してください。
 リクエストURL
    | ライブURL | https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
    | サンドボックスURL | https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
  | HTTPメソッド | GET | 
  
 ヘッダー パラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
  | 認証 | API呼び出しのための認証トークン(ベアラー) | 文字列 | はい | 
  
 パスパラメータ
   | フィールド名 | 説明 | タイプ | 必須 | 
  | gameIndex | Hive コンソールアプリセンターで利用可能なプロジェクト識別子 | int | はい | 
  | matchId | Hive コンソールで生成される各マッチの識別子 | int | はい | 
 
 クエリパラメータ
   | フィールド名 | 説明 | タイプ | 必須 | 
  | id | ユーザーID (`playerId`) | long | Y | 
 
 応答
    | フィールド名 | 説明 | 
  | playerId | アカウント識別子 | 
  | matchInfo | 要求された情報  gameIndex:gameIndexの値matchId:matchIdの値 | 
  | requestingStatus | リクエストステータス情報  requested: マッチが正常にリクエストされましたnotRequested: マッチがリクエストされていないか、マッチがすでに完了しているため、進行中のリクエストはありません | 
  | requestingInfo | リクエスト情報  requestTimeUtc: UTC+0でのリクエスト時間point: リクエスト時に入力されたpointextraData: リクエスト時に入力されたextraData | 
  | matchingInfo | マッチステータス情報 ( status) matchingInProgress: マッチ進行中timeout: 制限時間内にマッチが完了しなかったmatched: マッチが完了しました | 
  
 リクエストサンプル
 curl --location --request GET 'https://sandbox-api-match.withhive.com/gameindexes/1/matchmakings/1/players?id=100' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJIaXZlIiwiaWF0IjoxNzAyNDU4MTkzLCJqdGkiOiIxMzY2NDk4MjcxIn0.VSwvsTE-tS0sL_e9p9gNvHRkMCbsycSO4ObE4J2ya3a'
応答サンプル
 マッチリクエストをまだ行っていないときのマッチステータスは次のとおりです。
 {
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "notRequested"
}
 Request Match は、マッチがまだ進行中の場合に requested と matchingInProgress ステータスを返します。
 {
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "requested",
   "requestingInfo": {
       "requestTimeUtc": "2024-06-05T05:09:28.72",
       "point": 1000
   },
   "matchingInfo": {
       "status": "matchingInProgress"
   }
}
 マッチが完了した後にリクエストのステータスを確認すると、matchedまたはtimeoutの結果が返されます。これはマッチが完了した状態ですが、マッチ結果コールバックがまだ受信されていない状態です。
     {
       "playerId": 100,
       "matchInfo": {
           "gameIndex": 1,
           "matchId": 1
       },
       "requestingStatus": "requested",
       "requestingInfo": {
           "requestTimeUtc": "2024-06-05T05:09:28.72",
           "point": 1000
       },
       "matchingInfo": {
           "status": "matched"
       }
   }
 試合が完了すると、Hive サーバーはあなたのサーバーにマッチ結果コールバックを送信します。あなたのサーバーがマッチ結果コールバックを受信し、Hive サーバーにHTTPステータス200を返すと、再度マッチリクエストのステータスを確認すると、notRequestedに変更され、matchingInfoキーは以下のように削除されます。これは、Hive サーバーがコールバックに対する応答としてHTTPステータス200を受け取った時点で、あなたのマッチリクエストが完了したと見なしてマッチリクエストトランザクションを削除するためです。
 {
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "notRequested"
}
    |  | マッチリクエスト前 | マッチリクエスト後 | マッチ結果作成後 | コールバック受信後 | 
    | requestingStatus | notRequested | requested | requested | notRequested | 
  | matchingInfo > Status | N/A | matchingInProgress | matched or timeout | N/A | 
  | 備考 |  | マッチ進行中 | コールバック受信前 |  | 
  
 マッチリクエストをキャンセル
 マッチリクエストをキャンセルします。マッチリクエストをキャンセルすると、マッチリクエストトランザクションは Hive サーバーから削除されます。
 リクエストマッチの後にマッチが完了し、マッチ結果コールバックを受け取り、HTTPステータス200で応答した場合、Hive サーバーはマッチが完了したと見なし、マッチリクエストトランザクションを削除します。この状態では、マッチリクエストをキャンセルするために呼び出しても、マッチリクエストトランザクションはすでに削除されているため、キャンセル操作は実行されず、例外も返されません。
 リクエストURL
    | ライブURL | https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players/{playerId} | 
    | サンドボックスURL | https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players/{playerId} | 
  | HTTPメソッド | DELETE | 
  
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
  | 認証 | API呼び出しのための認証トークン(ベアラー) | 文字列 | はい | 
  
 パスパラメータ
   | フィールド名 | 説明 | タイプ | 必須 | 
  | gameIndex | Hive コンソールアプリセンターで利用可能なプロジェクト識別子 | int | はい | 
  | matchId | Hive コンソールで作成された各マッチの識別子 | int | はい | 
  | playerId | ユーザーID | long | はい | 
 
 応答
 200 OKの場合、ボディは空です。
 リクエストサンプル
 curl --location --request DELETE 'https://sandbox-api-match.withhive.com/gameindexes/1/matchmakings/1/players/100' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJIaXZlIiwiaWF0IjoxNzAyNDU4MTkzLCJqdGkiOiIxMzY2NDk4MjcxIn0.VSwvsTE-tS0sL_e9p9gNvHRkMCbsycSO4ObE4J2ya3a'
応答サンプル
 リクエストが正常にキャンセルされた場合、特定の応答はありません。
 マッチ結果コールバック
 試合が完了すると、Hive サーバーは試合結果をコールバックとしてあなたのサーバーに送信します。あなたのサーバーが試合結果のコールバックを問題なく受信した場合、あなたのサーバーはHttpStatus 200で応答する必要があります。Hive コンソールに希望するサーバーURLを登録することで、試合結果はこのアドレスにコールバックとして送信されます。このアドレスは公開アクセス可能なURLでなければなりません。API情報は以下の通りです。
 コールバック受信URL (Hive サーバー → あなたのサーバー)
 あなたのサーバーAPIエンドポイントがHiveコンソールに登録されると、Hiveサーバーはマッチが完了したときにこのエンドポイントにコールバック結果を送信します。
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
  | X-Match-Signature | HMAC SHA-256アルゴリズムで暗号化されたボディ内容の署名値 | 文字列 | はい | 
  
 コールバックで渡された値
    | フィールド名 | 説明 | タイプ | 
  | gameIndex | 完了した試合のgameIndex値 | int | 
  | matchId | 完了した試合のmatchId値 | int | 
  | matchingInfos | マッチされたアプリユーザーの情報の配列。`playerId`フィールド値が`0`のユーザーはボットと見なされます。  matchingId: マッチIDprivateInfos: ソロゲームでマッチされたユーザーの情報の配列(timeoutPlayerInfosと同じ形式)teamInfos: チームゲームでマッチされたユーザーの情報の配列(teamIndex: チーム番号、playerInfos: チームメンバーの情報の配列、timeoutPlayerInfosと同じ形式) | json | 
  | timeoutPlayerInfos | マッチされずにタイムアウトしたアプリユーザーの情報の配列  extraData: マッチがリクエストされたときに入力されたextraDatapoint: マッチがリクエストされたときに入力されたpointplayerId: マッチがリクエストされたときに入力されたplayerId | json | 
  
 コールバックの例 (Hive サーバー → あなたのサーバー)
 curl --location 'The API endpoint of your server registered in the Hive Console.' --header 'Content-Type: application/json' --header 'X-Match-Signature: nj2YlgGTlLXcAhrl6ijSgfD71gTWokBiM8WPn72xxg8=' --data '{
   "gameIndex": 1,
   "matchId": 1,
   "matchingInfos": [
       {
           "matchingId": "1:1_2024-06-05T05:43:28.91_1",
           "privateInfos": [
               {
                   "playerId": 100,
                   "point": 1000
               },
               {
                   "playerId": 101,
                   "point": 1000
               }
           ]
       }
   ],
   "timeoutPlayerInfos": []
}'
 コールバック結果の真正性は、ヘッダー パラメーター X-Match-Signature の値を使用して確認できます。また、アルゴリズム計算に使用するキーは、Hive コンソールにあります。以下は、署名を取得するための Java コードの例です。
 import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class MatchSignature {  
   private static final String HMAC_SHA_256 = "HmacSHA256";
   private static final String UTF_8 = "UTF-8";
   public String getSignature(String secret, String httpRequestBody) throws Exception {
       SecretKeySpec key = new SecretKeySpec(secret.getBytes(), HMAC_SHA_256);
       Mac mac = Mac.getInstance(HMAC_SHA_256);
       mac.init(key);
       byte[] source = httpRequestBody.getBytes(UTF_8);
       return new String(Base64.getEncoder().encode(mac.doFinal(source)), StandardCharsets.UTF_8);
   }
}
 Hive サーバーから送信されたコールバックが正常に受信された場合、HTTP ステータス 200 をレスポンスとして返す必要があります。
  - HttpStatus 200での応答: マッチが正常に完了したと見なされるため、マッチリクエストはキャンセルされます。
- HttpStatus 200以外の値またはタイムアウトでの応答: マッチ結果のコールバックは定期的に再送信されます。
Hive サーバーがHTTPステータス200の応答を継続的に受信できない場合、システム管理の目的で一定期間マッチ結果のコールバックは配信されません。