File size: 3,743 Bytes
c9b1033
7cb3a7a
c9b1033
7cb3a7a
c9b1033
7cb3a7a
c9b1033
 
7cb3a7a
c9b1033
7cb3a7a
c9b1033
 
 
7cb3a7a
c9b1033
 
 
 
 
7cb3a7a
c9b1033
923be0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7cb3a7a
c9b1033
7cb3a7a
 
 
 
 
 
 
 
 
 
 
c9b1033
7cb3a7a
 
 
c9b1033
7cb3a7a
c9b1033
 
7cb3a7a
c9b1033
7cb3a7a
c9b1033
7cb3a7a
 
 
 
 
 
c9b1033
 
 
7cb3a7a
 
 
c9b1033
7cb3a7a
c9b1033
 
7cb3a7a
 
 
 
 
 
 
 
 
c9b1033
 
 
7cb3a7a
c9b1033
7cb3a7a
 
 
 
 
 
 
 
c9b1033
7cb3a7a
c9b1033
7cb3a7a
 
 
 
 
 
c9b1033
7cb3a7a
 
 
 
c9b1033
7cb3a7a
c9b1033
7cb3a7a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c9b1033
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 协议规范

本文档定义了 InterConnect-Server 使用的 REST 和 WebSocket 协议格式。所有负载均为 JSON 格式。

## 认证 (Authentication)

- REST: 在请求头中发送 `Authorization: Bearer <API_KEY>`- WebSocket: 连接到 `ws://<host>/ws?api_key=<API_KEY>`(HTTPS 下使用 `wss`)。

## 事件对象 (Event Object)

事件通过 REST 发送到服务器,并广播给 WebSocket 客户端。
服务器仅验证必填字段和 `event_type` 值。
`data` 负载会原样传递。

必填字段:
- `event_type` (字符串)
- `server_name` (字符串)
- `timestamp` (字符串, ISO 8601)
- `data` (对象)

有效的 `event_type` 值:
- `player_join` - 玩家加入服务器
- `player_quit` - 玩家退出服务器
- `player_death` - 玩家死亡
- `player_chat` - 玩家与AI聊天消息
- `player_message` - 玩家公屏聊天消息
- `remote_command` - 远程命令执行
- `server_start` - 服务器启动
- `server_stop` - 服务器停止

### 事件数据字段

| 事件类型 | 监听器 | 数据字段 |
|----------|--------|----------|
| `player_join` | PlayerJoinEvent | `player_name`, `uuid` |
| `player_quit` | PlayerQuitEvent | `player_name`, `uuid`, `playtime` (在线时长秒数) |
| `player_death` | PlayerDeathEvent | `player_name`, `uuid`, `death_message`, `killer` (如果是被玩家杀死) |
| `player_chat` | AsyncChatEvent (1.19+) / AsyncPlayerChatEvent (1.8-1.18) | `message`, `player_name`, `uuid` |
| `player_message` | AsyncChatEvent (1.19+) / AsyncPlayerChatEvent (1.8-1.18) | `message`, `player_name`, `uuid` |
| `remote_command` | ServerCommandEvent | `command`, `sender` |
| `server_start` | PluginEnableEvent | `server_id`, `max_players`, `version` |
| `server_stop` | PluginDisableEvent | `server_id` |

### 事件说明

- `player_chat`:监听玩家与AI的聊天事件。当配置了 `auto_respond_chat: true` 时,所有自动回复监听到的消息都归类为 `player_chat`- `player_message`:监听玩家与其他玩家的聊天事件(公屏聊天)。

事件示例:
```json
{
  "event_type": "player_join",
  "server_name": "survival-01",
  "timestamp": "2024-01-21T12:34:56.789Z",
  "data": {
    "player": "Steve"
  }
}
```

## REST 端点 (REST Endpoints)

### POST /api/events

提交一个事件以进行存储和广播。

请求:
- 认证:任意有效密钥
- `Content-Type: application/json`
- Body: 事件对象

响应:
```json
{
  "message": "Event received and broadcasted"
}
```

错误:
- `400` 如果缺少必填字段或 `event_type` 无效
- `401` 如果 API 密钥丢失/无效

### POST /api/server/command

发送服务器命令。这也将广播一个 `server_command` 事件。

请求:
- 认证:Regular 或 Admin 密钥
- `Content-Type: application/json`
- Body:
```json
{
  "command": "say Hello from API",
  "server_id": "survival-01"
}
```

注意:
- 当 Admin 密钥未绑定到服务器时,必须提供 `server_id`- 服务器对 Admin 命令强制执行允许/阻止列表。

响应:
```json
{
  "message": "Command sent successfully",
  "command": "say Hello from API",
  "server_id": "survival-01"
}
```

## WebSocket 消息 (WebSocket Messages)

### 客户端到服务器

Ping:
```json
{ "type": "ping" }
```

Pong 响应:
```json
{ "type": "pong" }
```

### 服务器到客户端

广播事件:
```json
{
  "type": "minecraft_event",
  "event": {
    "event_type": "message",
    "server_name": "survival-01",
    "timestamp": "2024-01-21T12:34:56.789Z",
    "data": {
      "player": "Alex",
      "message": "Hello world"
    }
  },
  "source_key_id_prefix": "a1b2c3d4"
}
```

`source_key_id_prefix` 是提交事件或命令的 API 密钥 ID 的前 8 个字符。它不是 API 密钥本身。