多机器人(src/bot/botPool.js、src/config/botsConfig.js) - .env 用 MC_BOTS 一次配置多个账号(JSON 数组或 用户名:密码 逗号分隔),未配置时回退单机器人 - 每个机器人独立连接 / 登录 / 扩地状态机,共享一份领土数据服务与运行日志 - 密码只从 .env 读取;data/bots.json 只存启用状态、备注名、自动开始与各自的配置覆盖 - 每个机器人可覆盖全局配置(策略 / 目标邦国 / 目标数量等),未覆盖字段回退全局默认 开拓日志(src/core/expansionLog.js) - 逐条记录开拓玩家、邦国、区块、方块坐标、时间与判定来源,追加写入 data/expansion-log.jsonl - 支持按机器人 / 邦国 / 时间筛选、统计、导出带 BOM 的 CSV,超过 16MB 自动轮转 游戏公屏完整日志与聊天框(src/core/chatLog.js) - 每个机器人的全部公屏 / 系统 / 动作栏消息按机器人分文件留档,自身发出的聊天与指令同样留档 - 控制台新增公屏聊天页签与消息发送框 登录验证门禁 - 游戏侧:未完成登录验证时拒绝发送指令 / 聊天,isReady() 也不放行扩地任务; 新增 server.loginConfirmTimeoutMs 兜底,避免服务器不回提示导致永远卡在未登录 - 控制台侧:新增 WEB_PASSWORD 与 /api/login、/api/session,页面登录框验证通过才允许操作 大地图(src/core/bigMapService.js) - 爬取服务器地图站点(squaremap)的瓦片图片与领土标记,一张图上看全部机器人坐标 - 坐标系对源站实测标定并用 27 个王城交叉验证;瓦片磁盘缓存,层级 0 启动预爬取、更高层级按需穿透 - 领土按 markers.json 原始多边形绘制(预编译 Path2D,even-odd 保留孔洞),叠加王城与机器人标签 配套改造 - TerritoryModel 新增 flyingChunksOf / ownChunksOf,邦国归属改为按名称显式传入, 不再依赖全局 selfStateName(多机器人会互相覆盖) - Web 接口以 /api/bots/:id/... 为主,原单机器人接口保留为默认机器人的等价别名 - 新增 scripts/check-web-ids.js 校验前端元素引用一致性 测试从 154 增至 242,全部通过。
55 行
1.5 KiB
JavaScript
55 行
1.5 KiB
JavaScript
'use strict';
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
|
||
/**
|
||
* 机器人注册表持久化:保存「非敏感」的机器人设置。
|
||
*
|
||
* 存的是:是否启用、备注名、启动后是否自动开始扩地、以及每个机器人自己的扩地配置覆盖。
|
||
* **绝不存账号密码** —— 密码只从 `.env` 读取(见 {@link module:config/botsConfig})。
|
||
*
|
||
* 默认路径 `data/bots.json`(`data/` 已在 .gitignore 中忽略)。
|
||
*/
|
||
class BotStore {
|
||
/**
|
||
* @param {string} [filePath] 配置文件绝对路径
|
||
*/
|
||
constructor(filePath) {
|
||
this.filePath = filePath || path.join(__dirname, '..', '..', 'data', 'bots.json');
|
||
}
|
||
|
||
/**
|
||
* 读取注册表;文件不存在或损坏时返回空表。
|
||
* @returns {{bots: Record<string, object>}}
|
||
*/
|
||
load() {
|
||
try {
|
||
const parsed = JSON.parse(fs.readFileSync(this.filePath, 'utf8'));
|
||
if (parsed && typeof parsed === 'object' && parsed.bots && typeof parsed.bots === 'object') {
|
||
return { bots: parsed.bots };
|
||
}
|
||
} catch {
|
||
// 首次运行或文件损坏:回退到空表
|
||
}
|
||
return { bots: {} };
|
||
}
|
||
|
||
/**
|
||
* 写入注册表。
|
||
* @param {{bots: Record<string, object>}} data
|
||
* @returns {boolean} 是否写入成功
|
||
*/
|
||
save(data) {
|
||
try {
|
||
fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
|
||
fs.writeFileSync(this.filePath, JSON.stringify({ bots: data.bots || {} }, null, 2), 'utf8');
|
||
return true;
|
||
} catch {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
module.exports = { BotStore };
|