2026-10-15 14:14:58 +08:00
|
|
|
|
# 旧代码与数据迁移
|
|
|
|
|
|
|
|
|
|
|
|
## 本轮实际同步
|
|
|
|
|
|
|
|
|
|
|
|
源:D:/Work/zhenxun_plugin_farm,Beta 分支,
|
|
|
|
|
|
提交 b015c6c1997f146f651b677382980d338a306bb2。
|
|
|
|
|
|
复制工作区中受版本管理的文件,不复制 .git、未跟踪的工具安装目录。
|
|
|
|
|
|
源 .gitignore 含上轮 Comet 规则,未复制;新主仓库使用自己的忽略策略。
|
|
|
|
|
|
|
|
|
|
|
|
目的地:legacy/zhenxun_plugin_farm。827 个文件、35 个 Python 文件、
|
|
|
|
|
|
静态配置、HTML、图片以及两个仅含 plant/sqlite_sequence 表的作物库。
|
|
|
|
|
|
两库只读 quick_check 均为 ok,未复制运行中的 farm.db 或玩家备份。
|
|
|
|
|
|
静态资源是否全有合法分发授权尚未确认。
|
|
|
|
|
|
|
|
|
|
|
|
唯一源码差异:utils/request.py 的硬编码服务令牌改为读取
|
|
|
|
|
|
FARM_SERVICE_TOKEN,未把原值复制到新仓库。
|
|
|
|
|
|
来源哈希、复制哈希及差异说明见 legacy-manifest.json。
|
|
|
|
|
|
原项目未修改,服务端令牌轮换需另行处理。
|
|
|
|
|
|
|
|
|
|
|
|
## 旧模块复用地图
|
|
|
|
|
|
|
|
|
|
|
|
| 旧位置 | 新去向 | 迁移方式 |
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
| command.py、根 __init__.py | integrations/zhenxun | 保留用户指令契约,重写生命周期和参数适配 |
|
|
|
|
|
|
| core/farm.py、core/shop.py | application、domain | 按用例提取,先修计算和交易缺陷 |
|
|
|
|
|
|
| core/database | infrastructure/sqlite | 明确 schema 与事务所有权,不直接照搬 |
|
|
|
|
|
|
| core/player | 领域模型/查询模型 | 首期移除余额权威缓存,不移植后台线程池 |
|
|
|
|
|
|
| utils/darw、HTML | presentation/资源 | 去除真寻 BuildImage 依赖,支持文本降级 |
|
|
|
|
|
|
| utils/request、utils/json | resources | 配置校验、版本固定、下载原子性 |
|
|
|
|
|
|
| event | 提交后副作用 | 逐个核对必要用途,不先移植通用信号层 |
|
|
|
|
|
|
| core/activity/activity.py、effect.py | 后续玩法候选 | 隔离加载失败,不接入首版 |
|
|
|
|
|
|
| resource/db | 版本化作物目录 | 区分内置只读目录与可写玩家数据库 |
|
|
|
|
|
|
|
|
|
|
|
|
## 真实用户数据迁移建议
|
|
|
|
|
|
|
2026-10-20 15:31:15 +08:00
|
|
|
|
当前没有读写任何真实玩家库。以下是真实部署时的建议;已实现的自动迁移
|
|
|
|
|
|
范围见下一节,不能将隔离测试等同于真实玩家数据验收:
|
2026-10-15 14:14:58 +08:00
|
|
|
|
|
|
|
|
|
|
1. 盘点实际部署版本、schema、来源平台、玩家数量和货币含义。
|
|
|
|
|
|
2. 停写并备份,记录 schema、文件哈希和备份位置;备份不入 Git。
|
|
|
|
|
|
3. 使用副本进行只读预检:主键、重复、负数、孤儿地块、未知作物、
|
|
|
|
|
|
作物成熟时间、锁定、签到日期、币种和数值范围。
|
|
|
|
|
|
4. 明确旧裸 UID 到新身份命名空间的映射,不自动跨平台合并。
|
|
|
|
|
|
5. 版本化迁移脚本写入新数据库,保存 migration_id 和 schema_version。
|
|
|
|
|
|
6. 校验用户数、各币种合计、种子/作物数量、地块数及抽样业务状态,
|
|
|
|
|
|
对每一项转换或舍弃生成报告;再次执行不得重复导入。
|
|
|
|
|
|
7. 在目标框架演练最小玩法闭环、时区与资源加载,再切换数据目录。
|
|
|
|
|
|
8. 若失败,停写后恢复旧程序与原备份,不让两个版本并行写同一数据库。
|
|
|
|
|
|
|
|
|
|
|
|
旧代码存在余额和经验重复增加,无法仅凭当前余额还原“正确历史值”。
|
|
|
|
|
|
是否保留已有资产、重置、补偿或人工对账必须由用户明确决定,
|
|
|
|
|
|
不在迁移脚本中暗自纠正或清零。
|
|
|
|
|
|
|
2026-10-20 15:31:15 +08:00
|
|
|
|
## 真寻旧版 farm.db 自动迁移
|
|
|
|
|
|
|
|
|
|
|
|
新版默认使用 `data/farm_db/farm.sqlite3`,只读同目录的旧版 `farm.db`。
|
|
|
|
|
|
首次收到用户农场指令时,按旧裸 UID 查找数据并转换;没有旧账号则沿用
|
|
|
|
|
|
正常注册流程。旧程序应停止写入,切换前自行备份,旧文件不会修改或删除。
|
|
|
|
|
|
|
|
|
|
|
|
- 身份绑定:使用首次请求的 deployment、机器人 ID、平台、用户 ID。
|
|
|
|
|
|
导入记录和资产在同一 SQLite 事务提交,同 UID 在整个目标库只导入一次。
|
|
|
|
|
|
再次请求不重置余额,重启后仍保持绑定;其他机器人或平台请求会被拒绝。
|
|
|
|
|
|
- 账户:保留名称、point、vipPoint、exp;不额外发放注册初始资产。
|
|
|
|
|
|
初始资产写入新版 ledger,并关联 `legacy_import` 操作。
|
|
|
|
|
|
- 仓库:按名称唯一匹配内置作物 ID,合并种子与产物,保留数量与锁定。
|
|
|
|
|
|
同名歧义、未知作物、重复行、非法数值都会回滚,不猜测或清零。
|
|
|
|
|
|
- 土地:按 soil 创建已解锁地块,缺失的行补为空地;保留作物、成熟时间、
|
|
|
|
|
|
收获季数与枯萎状态,土地等级映射为原有产量/经验加成。
|
|
|
|
|
|
旧虫害标志映射为一只虫;当前季保持旧成熟时间,不追溯套用新版生虫时钟,
|
|
|
|
|
|
下一季开始使用新版生长规则。
|
|
|
|
|
|
- 保留:所有含 uid 字段的旧表中该用户的原始行,存入
|
|
|
|
|
|
`operations.result` 的 `legacy_rows`。道具、签到、偷菜、杂草、缺水、
|
|
|
|
|
|
施肥及土地等级原值等新版尚无完整对应玩法的状态可在此核查;这些状态
|
|
|
|
|
|
不宣称已恢复为可用功能。额外表列在 `unsupported_tables`,日志记录表行数。
|
|
|
|
|
|
- 冲突:新账号已经存在时不覆盖、不累加;迁移失败不注册空账号。
|
|
|
|
|
|
检查服务器日志,修复副本并核对后再重试;原始旧库和已提交的新账号均保留。
|
|
|
|
|
|
|
|
|
|
|
|
`farm_preview` 目录与未发布的 `farm-preview.sqlite3` 不在此迁移范围。
|
|
|
|
|
|
本实现使用构造的旧版结构做隔离测试,尚未验证用户服务器上的真实数据库。
|
|
|
|
|
|
|
2026-10-15 14:14:58 +08:00
|
|
|
|
## 首次发布仓库接管
|
|
|
|
|
|
|
|
|
|
|
|
当前本地 Beta 基线不等于三个发布仓库 main。
|
|
|
|
|
|
未来需要取得重新拉取授权后,对比现有功能和依赖,记录有价值的框架
|
|
|
|
|
|
接入代码与差异,再决定复用方式。不能本轮默认把远程现有代码覆盖成
|
|
|
|
|
|
Beta,也不能把已有 AstrBot/NoneBot 实现宣称已经合并进新主仓库。
|
|
|
|
|
|
|
|
|
|
|
|
发布仓库地址已纳入设计,检出已按用户要求删除。仅迁移基线保留在
|
|
|
|
|
|
主仓库,主仓库没有 Git 子模块和发布仓库副本。
|