# HSG Keyserver API 規格書
> 目前HSG的訊號視訊和接收到的API桌號是不一致的,需要透過 https://play.kasar.live/assets/table.json 去mapping訊號。
## chart
```mermaid
graph TD
dealer[現場]-->strat_deal{荷官上桌開始發牌}
strat_deal-->|是| 通知24MIS解除桌檯維護
strat_deal-->|否| maintenance[維護]
通知24MIS解除桌檯維護-->操作Keypad後台解除桌檯維護
操作Keypad後台解除桌檯維護--> keypad後台通知KeyServer
keypad後台通知KeyServer--> KeyServer通知GameServer解除桌檯維護
KeyServer通知GameServer解除桌檯維護-->Cancel_Maintenance{解除桌檯維護成功}
Cancel_Maintenance-->|失敗| maintenance
Cancel_Maintenance-->|成功| keypad中場
keypad中場--> keypad_flow[keypad流程]
keypad_flow --> maintain{是否維護}
maintain-->|是| 荷官進入中場
maintain--> |否| keypad_flow
荷官進入中場--> 荷官通知24MIS進維護
荷官通知24MIS進維護--> maintenance
```
## API 位置
- 測試: keyserver.olacak.live:2570
- 正式機: keyserver.kasar.live:2570
## 維護
| Field | Type | Description |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type | int | [遊戲型別](#遊戲型別) |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
|  maintenance|bool|是否維護中,true/false|
```json=
{
"command":"X900",
"type":1,
"id":"A",
"time":1602827720,
"payload":{
"maintenance": true // 維護狀態 true or false
}
}
```
## 中場
| Field | Type | Description |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type | int | [遊戲型別](#遊戲型別) |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
```json=
{
"command":"X000",
"type":1,
"id":"A",
"time":1602827720,
"payload":null
}
```
## 遊戲中
| Field | Type | Description |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type | int | [遊戲型別](#遊戲型別) |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
|  round|long|輪號|
|  run|int|局號|
|  status|int|[牌桌狀態](#牌桌狀態)|
|  bettime|int|開始下注至結束下注秒數|
|  cards|array|[數字牌型對應](#數字牌型對應)|
|  dealer|object|荷官資料,牌桌狀態為`compute`(6) 才會帶值,其餘為`null`|
|   id|string|荷官ID|
|   name|string|荷官姓名|
|   photo|string|荷官圖片|
```json=
{
"command":"X100",
"type":1,
"id":"A",
"time":1602827720,
"payload":{
"round":1602827707,
"run":1,
"status":1,
"bettime":30,
"cards":[12,23,0,11,34,0],
"dealer":{ // if status is not compute(6), dealer will be null.
"id":"123456",
"name":"王小明"
"photo":"http://XXXX.XXX.jpg"
}
}
}
```
## 更換荷官
| Field | Type | Description |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type | int | [遊戲型別](#遊戲型別) |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
|  id|string|荷官ID|
|  name|string|荷官姓名|
|  photo|string|荷官圖片|
```json=
{
"command":"X500",
"type":1,
"id":"A",
"time":1602827720,
"payload":{
"id":"123456",
"name":"王小明",
"photo":"http://XXXX.XXX.jpg"
}
}
```
## 牌桌狀態
| Number | Status |
| ------ |:--------- |
| `1` | newRound |
| `2` | newRun |
| `3` | startBet |
| `4` | endBet |
| `5` | deal |
| `6` | compute |
| `7` | cancelRun |
## 牌桌狀態指令
| Value | Description |
|:------ |:----------- |
| `X000` | 中場 |
| `X100` | 遊戲中 |
| `X500` | 更換荷官 |
| `X900` | 維護 |
## 遊戲型別
| Value | Description |
|:----- |:----------- |
| `1` | 百家樂 |
| `2` | 骰寶 |
| `3` | 輪盤 |
| `4` | 色碟 |
| `5` | 龍虎 |
## 數字牌型對應
#### 0-52數字陣列
#### 1. 百家樂順序為:Player1,Player2,Player3,Banker1,Banker2,Banker3
#### 2. 龍虎順序為:Dragon, Tiger
#### 3. 輪盤不適用以下數字排型對應, 順序第一個號碼為開出的號碼
#### 4. 色碟不適用以下數字排型對應, 順序第一個號碼為紅色碟數量
| Number | Card | Number | Card | Number | Card | Number | Card |
|:------ | --------- | ------ | --------- |:------ | --------- | ------ |:-------- |
| `1` | `黑桃 1` | `14` | `紅心 1` | `27` | `方塊 1` | `40` | `梅花1` |
| `2` | `黑桃 2` | `15` | `紅心 2` | `28` | `方塊 2` | `41` | `梅花2` |
| `3` | `黑桃 3` | `16` | `紅心 3` | `29` | `方塊 3` | `42` | `梅花3` |
| `4` | `黑桃 4` | `17` | `紅心 4` | `30` | `方塊 4` | `43` | `梅花4` |
| `5` | `黑桃 5` | `18` | `紅心 5` | `31` | `方塊 5` | `44` | `梅花5` |
| `6` | `黑桃 6` | `19` | `紅心 6` | `32` | `方塊 6` | `45` | `梅花6` |
| `7` | `黑桃 7` | `20` | `紅心 7` | `33` | `方塊 7` | `46` | `梅花7` |
| `8` | `黑桃 8` | `21` | `紅心 8` | `34` | `方塊 8` | `47` | `梅花8` |
| `9` | `黑桃 9` | `22` | `紅心 9` | `35` | `方塊 9` | `48` | `梅花9` |
| `10` | `黑桃 10` | `23` | `紅心 10` | `36` | `方塊 10` | `49` | `梅花10` |
| `11` | `黑桃 J` | `24` | `紅心 J` | `37` | `方塊 J` | `50` | `梅花J` |
| `12` | `黑桃 Q` | `25` | `紅心 Q` | `38` | `方塊 Q` | `51` | `梅花Q` |
| `13` | `黑桃 K` | `26` | `紅心 K` | `39` | `方塊 K` | `52` | `梅花K` |
## Web API
### Endpoint
| 環境 | 位址 |
| -------- | -------- |
| Stage | http://stage.keypad.admin.kasar.live |
| Production | http://keypad.admin.kasar.live |
### 取得路圖資料
> GET /casino-api/v2/roadmap?tableId=F&round=1617867216&gameType=gameType
#### Query string
| 變數 | 型態 | 說明 |
| -------- | -------- | -------- |
| tableId | string | 桌號 |
| round | int | 輪號 |
| gameType | string | 遊戲類型 `Baccarat` `DragonTiger` |
#### Response
```json=
{
"status": "success",
"data": [
{
"TableName": "Baccarat", // 遊戲類型
"HistoryId": 589927, // 牌局紀錄編號
"TableId": "B", // 桌號
"Round": 1602388403, // 輪號
"Run": 56, // 局號
"Result" : {
"WinSpot": null, // 輸贏注區
"Cards": [0,0,0,0,0,0] //參考 數字牌型對應
}
"ModifiedStatus": "Canceled", // 狀態 Modified(改牌), Canceled(取消)
"ModifiedTime": "2020-10-11 12:34:58", // 修改時間
"CreateTime": "2020-10-11 12:34:13" // 建立時間
},
....
]
}
```
### 取得改單資料
建議每五分鐘調用一次即可
> GET /casino-api/v2/modify-game?modifyTime=2020-10-10%2020:00:00
#### Query string
| 變數 | 型態 | 說明 |
| -------- | -------- | -------- |
| modifyTime | DateTime | 會撈取 `modifyTime` 之後有改單的注單,使用的時區為 GMT+8 時間。 |
#### Response
```json=
{
"status": "success",
"data": [
{
"TableName": "Baccarat", // 遊戲類型
"HistoryId": 589927, // 牌局紀錄編號
"TableId": "B", // 桌號
"Round": 1602388403, // 輪號
"Run": 56, // 局號
"Result" : {
"WinSpot": null, // 輸贏注區
"Cards": [0,0,0,0,0,0] //參考 數字牌型對應
}
"ModifiedStatus": "Canceled", // 狀態 Modified(改牌), Canceled(取消)
"ModifiedTime": "2020-10-11 12:34:58", // 修改時間
"CreateTime": "2020-10-11 12:34:13" // 建立時間
},
....
]
}
```
### 平板驗證
> POST /casino-api/live-auth
#### Request parameter
| 變數 | 型態 | 說明 |
| -------- | -------- | -------- |
| gameType | Enum | `Baccarat`、`DragonTiger`、`Roulette` |
| tableId | String | 桌檯編號 |
| playerName | String | 玩家帳號 |
| verifyNumber| String | 四碼數字組成的字串 |
#### Response
```json=
{
"status": "success",
"data": {
"gameType": "Baccarat",
"tableId": "Q",
"playerName": "Test123",
"verifyNumber": "0000"
}
}
```
### 查詢牌局
```
GET /casino-api/v2/game-history?
gameType=<gameType>&
tableId=<tableId>&
round=<round>&
run=<run>
```
#### Request parameter
| 參數名稱 | 參數型態 | 說明 |
|:--------:|:--------:|:-----------:|
| gameType | string | 遊戲類型 |
| tableId | string | 桌號 |
| round | int | 輪號 |
| run | int | 局號 |
#### Response
##### Success
```json=
{
"status": "success",
"data": {
"TableName": "Baccarat", // 遊戲類型
"HistoryId": 589927, // 牌局紀錄編號
"TableId": "B", // 桌號
"Round": 1602388403, // 輪號
"Run": 56, // 局號
"Result" : {
"WinSpot": null, // 輸贏注區
"Cards": [0,0,0,0,0,0] //參考 數字牌型對應
}
"ModifiedStatus": "Canceled", // 狀態 Modified(改牌), Canceled(取消)
"ModifiedTime": "2020-10-11 12:34:58", // 修改時間
"CreateTime": "2020-10-11 12:34:13" // 建立時間
}
}
```
##### Failed
```json=
{
"status": "success",
"data": null
}
```
## 視訊位址
目前提供 720p 和 420p 兩種位址 格式如下
### 百家樂
| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p | https://flv.kasar.live/bacc/tw_{桌號}-720.flv | https://flv.kasar.live/bacc/tw_s.flv |
| 480p | https://flv.kasar.live/bacc/tw_{桌號}-480.flv | https://flv.kasar.live/bacc/tw_s-480.flv |
### 龍虎
| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p | https://flv.kasar.live/dt/tw_{桌號}-720.flv | https://flv.kasar.live/dt/tw_a-720.flv |
| 480p | https://flv.kasar.live/dt/tw_{桌號}-480.flv | https://flv.kasar.live/dt/tw_a-480.flv |
### 輪盤
| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p | https://flv.kasar.live/rt/tw_{桌號}-720.flv | https://flv.kasar.live/rt/tw_b-720.flv |
| 480p | https://flv.kasar.live/rt/tw_{桌號}-480.flv | https://flv.kasar.live/rt/tw_b-480.flv |
### 色碟
| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p | https://flv.kasar.live/sd/tw_{桌號}-720.flv | https://flv.kasar.live/sd/tw_c-720.flv |
| 480p | https://flv.kasar.live/sd/tw_{桌號}-480.flv | https://flv.kasar.live/sd/tw_c-480.flv |
### 開放桌號
#### 百家樂
- E
- F
- G
- H
- I
- J
- K
- L
- O
- P
` `
#### 龍虎
- A
#### 輪盤
- B
#### 色碟
- C
- D
## 錄影位址
```text
https://dvr.kasar.live/<遊戲名稱代碼>/<桌號>/<輪號>/<輪號>-<局號>.mp4
```
桌號請參考[開放卓號](#開放桌號),遊戲名稱代碼請參考下方表格,輪號局號為API取得。
### 遊戲名稱代碼
| 遊戲 | 代碼 |
| -------- | -------- |
| 百家樂 | baccarat |
| 龍虎 | dragon_tiger |
| 輪盤 | roulette |
| 色諜 | sedie |
| 骰寶 | sicbo |