8.9 KiB
8.9 KiB
背景
文件名: 2025-11-08_1_store-system 创建于: 2025-11-08_20:01:03 创建者: LIUBAI095 主分支: main 任务分支: (未创建) Yolo模式: Off
任务描述
开发商店系统,包含整点刷新商品(商品种类与限购数量由其他插件注册)以及用户可销售一种物品并设定数量,交易使用积分。
项目概览
WPS Bot 插件体系,现有 WPSConfigAPI 提供积分管理与签到积分类功能。
分析
目前掌握:
- 插件通过
PluginInterface.execute()注册数据库模型与唤醒回调,调用Architecture.Register管理依赖。 WPSAPI继承BasicWPSInterface,提供消息发送、命令解析与插件注册工具,现有WPSConfigAPI管理user_info表与积分操作。ClockScheduler提供异步定时任务,可通过register_clock()注册延迟任务,内部使用数据库任务队列并按scheduler_tick_ms(默认1分钟)轮询。 新增结论:- 商店列表无需缓存,依赖确定性的(小时级时间哈希 -> 随机种子)算法来生成;商品列表在未新增注册项时稳定。
- 用户出售物品由用户手动触发,不受随机商店列表影响。 新增设计要求:
- 外部系统通过依赖商店插件类并从
Architecture获取实例,使用成员函数注册商品出售模式。 - 注册接口接受物品ID(由
WPSBackpackSystem管理)与限购数量,生成一个商品模式ID;同一物品可注册多种限购模式。 - 随机商品列表从这些模式ID中按整点种子抽取,确保灵活组合。
- 支持限购 -1 表示不限量商品;支持注册常驻商品(不参与随机列表生成)。
- 商店命令:
商店展示列表和帮助;购买 <名称/ID> <数量>执行购买;出售 <名称/ID> <数量>管理用户出售栏。 - 背包系统
WPSBackpackSystem提供物品定义表与用户物品数据,需与商店库存/交易逻辑对接;玩家只能同时出售一种物品。 - 无预设消息模板,需要自行设计输出 Markdown。 待明确:
- 商店与用户出售物品需要的数据库结构及现有表:建议系统商品与玩家出售分表存储,便于按各自逻辑维护;系统商品表需记录模式ID与创建时间用于懒加载刷新。
- 商店刷新仅需在查询时按算法生成,无需计时器任务,不会主动推送消息;仍需定义命令交互的输出格式与多语言提示。
提议的解决方案
WPSStoreSystem只负责商店列表和公共接口,不再直接注册购买/出售指令;保留现有模式注册、懒加载刷新、积分/背包操作接口。- 新增
WPSStoreBuyCommand与WPSStoreSellCommand两个插件类(继承WPSAPI),分别依赖WPSStoreSystem与必要的配置/背包模块:WPSStoreBuyCommand注册购买/buy,在callback中直接接收<名称/ID> <数量>参数,调用WPSStoreSystem提供的购买 API,未匹配商品时返回明确错误信息而非帮助。WPSStoreSellCommand注册出售/sell,处理用户出售逻辑(上架、修改、撤单),同样通过WPSStoreSystem的公共方法执行,并在错误情况下给出具体提示。
- 在
WPSStoreSystem中抽象公共入口:purchase_item(user_id, chat_id, identifier, quantity),区分系统商品/玩家商品,自行调用现有内部方法并返回 Markdown 消息或错误文本。sell_item(user_id, chat_id, identifier, quantity),复用既有出售逻辑。- 保留
_handle_store与辅助方法供商店命令使用,未来如需扩展可新增WPSStoreViewCommand(当前可继续由WPSStoreSystem注册商店命令)。
- 更新
callback流程:WPSStoreSystem的callback只响应商店,并在无参数时直接展示列表;其他指令由独立插件处理,因此不会出现未注册商品时落入帮助信息的问题。 - 重新整理依赖关系与命令注册,确保未注册商品或物品未找到时返回明确错误提示(如“未找到商店商品”“背包未注册物品”)。
- 暴露额外接口:
list_registered_modes()、get_store_snapshot()等辅助方法供其他插件调试或扩展使用。
当前执行步骤:"10. 购买排序优化"
实施清单:
- 重构
WPSStoreSystem:新增purchase_item/sell_item公共方法,并将callback限制为商店指令。 - 创建
WPSStoreBuyCommand插件,注册购买/buy,调用商店公共方法返回明确结果。 - 创建
WPSStoreSellCommand插件,注册出售/sell,调用商店公共方法返回明确结果。 - 更新依赖与注册流程,确保新插件在
ImportPlugins中可被发现;补充帮助与错误信息。 - 运行 lint 并补记任务进度,为进入执行阶段做准备。
任务进度
2025-11-08_21:12:33
- 已修改:
Plugins/WPSStoreSystem.py - 更改:创建商店系统插件基础结构、数据库模型定义以及初始化清理逻辑
- 原因:落实实施清单第1步,搭建插件骨架以支撑后续功能实现
- 阻碍因素:无
- 状态:未确认 2025-11-08_21:13:08
- 已修改:
Plugins/WPSStoreSystem.py - 更改:实现商品模式注册/注销接口,维护常驻与候选模式及版本号
- 原因:完成实施清单第2步,支持外部插件登记商店商品信息
- 阻碍因素:无
- 状态:未确认 2025-11-08_21:14:01
- 已修改:
Plugins/WPSStoreSystem.py - 更改:实现整点懒加载刷新逻辑,含随机抽样、常驻商品同步与种子算法
- 原因:落实实施清单第3步,确保商店列表稳定生成与自动过期重建
- 阻碍因素:无
- 状态:未确认 2025-11-08_21:15:14
- 已修改:
Plugins/WPSStoreSystem.py - 更改:实现商店指令流程,生成系统/常驻/玩家商品列表及帮助信息
- 原因:完成实施清单第4步,提供用户可见的商店展示
- 阻碍因素:无
- 状态:未确认 2025-11-08_21:16:24
- 已修改:
Plugins/WPSStoreSystem.py - 更改:实现购买流程,校验积分与库存,并处理系统/玩家商品交易
- 原因:落实实施清单第5步,支持积分扣除与背包发放
- 阻碍因素:无
- 状态:未确认 2025-11-08_21:18:43
- 已修改:
Plugins/WPSStoreSystem.py - 更改:实现出售流程,包含背包校验、数量更新、撤单与售价生成逻辑
- 原因:完成实施清单第6步,支持玩家自助上架或撤下物品
- 阻碍因素:无
- 状态:未确认 2025-11-08_21:20:06
- 已修改:
Plugins/WPSStoreSystem.py - 更改:补充商店快照接口与通用数据转换,完善帮助信息与并发校验流程
- 原因:完成实施清单第7步,为其他插件提供可复用查询能力
- 阻碍因素:无
- 状态:未确认 2025-11-08_22:35:12
- 已修改:
Plugins/WPSStoreSystem.py - 更改:将 StoreMode / StoreEntry / PlayerListing 替换为 Pydantic BaseModel,并调整相关引用与导入
- 原因:根据最新要求统一使用 BaseModel,保持不可变语义并通过 lint 检查
- 阻碍因素:无
- 状态:未确认 2025-11-08_23:03:28
- 已修改:
Plugins/WPSStoreSystem.pyPlugins/WPSStoreBuyCommand.pyPlugins/WPSStoreSellCommand.py - 更改:抽离购买/出售命令至独立插件,提供公共接口
purchase_item/sell_item并确保错误提示明确 - 原因:满足命令拆分要求,避免未注册商品时误返回帮助信息
- 阻碍因素:无
- 状态:未确认 2025-11-09_19:18:39
- 已修改:
Plugins/WPSStoreSystem.py - 更改:玩家出售与系统商品展示统一使用物品名称,扩展
PlayerListing并在加载时补充物品名 - 原因:确保商店界面不再暴露物品ID,提升可读性
- 阻碍因素:无
- 状态:未确认 2025-11-09_19:35:08
- 已修改:
Plugins/WPSStoreSystem.pyPWF/CoreModules/plugin_interface.py - 更改:出售指令支持
<数量> <单价>参数,调整逻辑使用玩家自定 single price,并在表注册时自动补齐缺失列 - 原因:允许运营自定售价并避免旧表缺列导致的运行错误
- 阻碍因素:无
- 状态:成功 2025-11-09_19:45:00
- 已修改:
Plugins/WPSStoreSystem.py - 更改:购买流程统一收集匹配来源,按价格升序排序;同价时优先玩家,再按系统、常驻顺序处理
- 原因:满足按价格优先购买的需求,确保同价时玩家商品优先售出
- 阻碍因素:无
- 状态:进行中 2025-11-09_19:50:00
- 已修改:
Plugins/WPSAlchemyGame.py - 更改:炼金插件依赖商店系统,在注册炉灰物品后同步为整点刷新候选,单价 8 分、限购 999
- 原因:补充基础货源,便于验证按价格排序的购买流程
- 阻碍因素:无
- 状态:成功 2025-11-09_21:22:44
- 已修改:
Plugins/WPSStoreSystem.py - 更改:玩家出售展示改为调用配置接口获取昵称,避免暴露纯数字ID
- 原因:提升商店玩家出售区的可读性与一致性
- 阻碍因素:无
- 状态:未确认
最终审查
(待补充)