feat: 接齐 SimpCore 开放 API 全量接口并新增 API 数据浏览弹层
以前只用了「邦国领土」这一类接口,控制台也只能看到一行「已启用/未启用」, 大量服务端公开信息拿得到却看不到。现在按官方文档 https://open.bgjq.top/api-docs.html 补齐。 新增 - SimpApiClient 从 7 个接口补到 16 个:/info/players、/info/unions/{key}/members、 /tech、/contributions、/info/buffs、/info/diplomacy、/info/bans、/info/logs、 /info/announcements - SimpApiV2Client(新):/players、/players/{name}/equipment、/time、/dragon。 文档明确 API 与 API-V2 是两套独立、互不通用的密钥体系,因此单独实例与配置 (apiV2Enabled / apiV2Key,或环境变量 SIMP_API_V2_KEY);V2 配额很小 (末影龙 1 次/分钟),一律按需查询、不做轮询 - 控制台「查看 API 数据」弹层,五个页签: 概览(两套密钥状态/请求数/缓存/健康检查)· 邦国(27 个,点开看成员/科技/捐献/领土统计) · 玩家(1600+ 可搜索,点开看详情与所属邦国)· 全服(加成/外交/封禁/日志/公告) · 实时 V2(在线玩家/游戏时间/末影龙/装备) - /api/simp/* 一整套只读代理接口,统一处理「未配 Key / 上游错误」并给出可读提示 修复(解析字段名以实测响应为准) - 捐献:响应只有 player_uuid 没有玩家名 -> 先用成员表补全、查不到再退到全服玩家表; 时间字段是 contributed_at;补充 reason(用途)列;amount 可为负(邦国支出) - 公告:message 是 Minecraft 聊天组件 JSON 字符串 -> 新增 componentToText() 压平为纯文本 - 封禁:实际字段 banned_player_name / banned_by_player_name / banned_at / unbanned - 日志:实际字段 username / action / timestamp - 玩家表:上下线时间是 last_join_time / last_quit_time - 王城坐标:服务端可能返回 null,原来 Number(null) 会算成 0, 伪装成「王城在世界原点 (0,0)」;现在显式判空返回 null 变更 - 快捷发送去掉 /spawn 与 /list,只留 /u return、/u claimmode、/u restore confirm 测试 326 -> 336,全部通过。
这个提交包含在:
@@ -137,11 +137,27 @@ squaremap 前端用 `L.CRS.Simple` + `tileSize: 512`,瓦片路径为
|
||||
而错误假设(256 / 1024 方块每瓦片、整体偏移半张瓦片)分别为 76.0% / 47.3% / 41.6%,
|
||||
即只有正确公式能让王城稳定落在陆地上。
|
||||
|
||||
### 以机器人为中心 + 可调图幅
|
||||
|
||||
大地图的用途是看**自己机器人周边**,所以默认以机器人当前位置为中心(`bigMap.followBot`)。
|
||||
界面上的「图幅」下拉框决定半径:
|
||||
|
||||
| 图幅 | 层级 0 需要的瓦片数 |
|
||||
| --- | --- |
|
||||
| ±512 格 | 1 |
|
||||
| ±1024 格 | 1~4 |
|
||||
| ±4096 格(默认) | 9 |
|
||||
| ±8192 格 | 25 |
|
||||
| 全世界(±20480) | 100 |
|
||||
|
||||
层级 0 每张瓦片覆盖 4096 格,所以「只看周边」比「拉全世界」省一到两个数量级。
|
||||
点「爬取周边」只会爬当前图幅内的瓦片;「回到机器人」把视图拉回机器人所在位置。
|
||||
|
||||
### 缓存与爬取
|
||||
|
||||
| 层级 | 每瓦片方块数 | 全世界瓦片数 | 策略 |
|
||||
| --- | --- | --- | --- |
|
||||
| 0 | 4096 | 10×10 = 100 | 启动时自动预爬取 |
|
||||
| 0 | 4096 | 10×10 = 100 | 启动时自动预爬取(以机器人位置为中心,只爬当前图幅内) |
|
||||
| 1 | 2048 | 20×20 = 400 | 按需拉取 + 永久缓存 |
|
||||
| 2 | 1024 | 40×40 = 1600 | 按需拉取 + 永久缓存 |
|
||||
| 3 | 512 | 80×80 = 6400 | 按需拉取 + 永久缓存 |
|
||||
@@ -150,7 +166,47 @@ squaremap 前端用 `L.CRS.Simple` + `tileSize: 512`,瓦片路径为
|
||||
- 瓦片由后端代理(`/api/bigmap/tile/:z/:x/:y`),避免浏览器直连地图站点的跨域问题
|
||||
- 领土以 `markers.json` 的**原始多边形**绘制(预编译成 `Path2D`,按 even-odd 填充保留国中孔洞),
|
||||
叠加本次会话新占领区块、王城与**全部机器人坐标(含名字标签)**
|
||||
- 操作:滚轮缩放、拖拽平移、「全世界」/「回到机器人」一键定位、「爬取地图」手动触发预爬取
|
||||
- 操作:滚轮缩放、拖拽平移、图幅切换、「爬取周边」/「回到机器人」一键定位
|
||||
|
||||
---
|
||||
|
||||
## SimpCore 开放 API
|
||||
|
||||
`src/core/simpApiClient.js` 对接 [SimpCore 开放 API](https://open.bgjq.top/api-docs.html)
|
||||
(邦国崛起服务器的只读查询服务)。它既是占领判定的第四数据源,也把服务端的公开信息
|
||||
完整暴露到控制台。
|
||||
|
||||
### 文档里的接口基本都接了
|
||||
|
||||
| 分类 | 接口 |
|
||||
| --- | --- |
|
||||
| 健康 | `GET /health`(免鉴权) |
|
||||
| 玩家 | `/info/players`、`/info/players/{key}`、`/info/players/{key}/union` |
|
||||
| 邦国 | `/info/unions`、`/info/unions/{key}`、`/members`、`/territory`、`/tech`、`/contributions` |
|
||||
| 全服 | `/info/territory`、`/info/buffs`、`/info/diplomacy`、`/info/bans`、`/info/logs`、`/info/announcements` |
|
||||
|
||||
在左栏「领土数据源」点 **查看 API 数据** 打开浏览弹层,分五个页签:概览 / 邦国 / 玩家 / 全服 / 实时 V2。
|
||||
限流按「Key × 接口」每分钟计算,所以**全部按需点击加载 + 会话内缓存 + 服务端 5 分钟缓存**,绝不做轮询。
|
||||
|
||||
### API 与 API-V2 是两套独立的密钥
|
||||
|
||||
文档明确说明两者**互不通用的**:
|
||||
|
||||
- **API**:`https://bgjq.simpfun.cn/api/` —— 邦国、领土、玩家、全服数据,配置 `apiKey`(或环境变量 `SIMP_API_KEY`)
|
||||
- **API-V2**:`https://bgjq.simpfun.cn/api-v2/` —— 服务器实时状态(在线玩家 / 装备 / 游戏时间 / 末影龙),
|
||||
需要在密钥中心**另外申请**,配置 `apiV2Key`(或环境变量 `SIMP_API_V2_KEY`)
|
||||
|
||||
V2 的接口级配额很小(末影龙只有 **1 次/分钟**),因此 V2 一律按需查询、不做自动轮询。
|
||||
|
||||
### 几个响应字段的坑(已按实测处理)
|
||||
|
||||
| 接口 | 坑 | 处理 |
|
||||
| --- | --- | --- |
|
||||
| 捐献 | 只有 `player_uuid`,**没有玩家名** | 先用邦国成员表补全,查不到再退到全服玩家表 |
|
||||
| 捐献 | `amount` 可为负 | 负数是邦国支出(如「恢复民心」消耗金锭/钻石),UI 注明 |
|
||||
| 公告 | `message` 是**聊天组件 JSON 字符串** | `componentToText()` 压平成纯文本 |
|
||||
| 王城 | 服务端可能返回 `null` | 显式判空,避免 `Number(null)` 算成 0 伪装成 (0,0) |
|
||||
| 封禁 / 日志 | 字段名是 `banned_player_name` / `timestamp` 等 | 按实测字段解析 |
|
||||
|
||||
---
|
||||
|
||||
@@ -479,29 +535,9 @@ npm start
|
||||
|
||||
---
|
||||
|
||||
## 大地图
|
||||
---
|
||||
|
||||
`src/core/bigMapService.js` 爬取服务器地图站点(本项目部署的是
|
||||
[squaremap](https://github.com/jpenilla/squaremap))的瓦片图片与领土标记,
|
||||
把所有机器人画在同一张图上。
|
||||
|
||||
### 以机器人为中心 + 可调图幅
|
||||
|
||||
大地图的用途是看**自己机器人周边**,所以默认以机器人当前位置为中心(`bigMap.followBot`)。
|
||||
界面上的「图幅」下拉框决定半径:
|
||||
|
||||
| 图幅 | 层级 0 需要的瓦片数 |
|
||||
| --- | --- |
|
||||
| ±512 格 | 1 |
|
||||
| ±1024 格 | 1~4 |
|
||||
| ±4096 格(默认) | 9 |
|
||||
| ±8192 格 | 25 |
|
||||
| 全世界(±20480) | 100 |
|
||||
|
||||
层级 0 每张瓦片覆盖 4096 格,所以「只看周边」比「拉全世界」省一到两个数量级。
|
||||
点「爬取周边」只会爬当前图幅内的瓦片;「回到机器人」把视图拉回机器人所在位置。
|
||||
|
||||
### REST / WebSocket 接口
|
||||
## REST / WebSocket 接口
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
|
||||
在新工单中引用
屏蔽一个用户