Files
main_plugin_farm/docs/05-migration.md
T

90 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 旧代码与数据迁移
## 本轮实际同步
源: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 | 版本化作物目录 | 区分内置只读目录与可写玩家数据库 |
## 真实用户数据迁移建议
当前没有读写任何真实玩家库。以下是真实部署时的建议;已实现的自动迁移
范围见下一节,不能将隔离测试等同于真实玩家数据验收:
1. 盘点实际部署版本、schema、来源平台、玩家数量和货币含义。
2. 停写并备份,记录 schema、文件哈希和备份位置;备份不入 Git。
3. 使用副本进行只读预检:主键、重复、负数、孤儿地块、未知作物、
作物成熟时间、锁定、签到日期、币种和数值范围。
4. 明确旧裸 UID 到新身份命名空间的映射,不自动跨平台合并。
5. 版本化迁移脚本写入新数据库,保存 migration_id 和 schema_version。
6. 校验用户数、各币种合计、种子/作物数量、地块数及抽样业务状态,
对每一项转换或舍弃生成报告;再次执行不得重复导入。
7. 在目标框架演练最小玩法闭环、时区与资源加载,再切换数据目录。
8. 若失败,停写后恢复旧程序与原备份,不让两个版本并行写同一数据库。
旧代码存在余额和经验重复增加,无法仅凭当前余额还原“正确历史值”。
是否保留已有资产、重置、补偿或人工对账必须由用户明确决定,
不在迁移脚本中暗自纠正或清零。
## 真寻旧版 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` 不在此迁移范围。
本实现使用构造的旧版结构做隔离测试,尚未验证用户服务器上的真实数据库。
## 首次发布仓库接管
当前本地 Beta 基线不等于三个发布仓库 main。
未来需要取得重新拉取授权后,对比现有功能和依赖,记录有价值的框架
接入代码与差异,再决定复用方式。不能本轮默认把远程现有代码覆盖成
Beta,也不能把已有 AstrBot/NoneBot 实现宣称已经合并进新主仓库。
发布仓库地址已纳入设计,检出已按用户要求删除。仅迁移基线保留在
主仓库,主仓库没有 Git 子模块和发布仓库副本。