ErisPulse 2.3.4 架构重构了
ErisPulse 2.3.4 发布了,这次改的挺大的。
其实重构的起因很简单,老鼠看了代码说 __init__.py 里塞的东西太多,review 不下去(笑
然后就想,确实乱,就开始改。迭代了几个 dev 版本,最后算是定下来了。虽然对外 API 保持兼容,但内部实现基本上重了一遍。
说说都改了啥吧。
统一的模块发现机制
之前找模块、适配器、CLI 命令的逻辑分散在各处,改起来麻烦还容易出问题。现在统一到了 finders 模块里。
以前是各自找各自的,现在都继承 BaseFinder 基类,统一的接口。
1from ErisPulse.finders import ModuleFinder, AdapterFinder, CLIFinder
2
3# 查找所有模块
4all_modules = ModuleFinder().find_all()
5
6# 查找特定适配器
7my_adapter = AdapterFinder().find_by_name("MyAdapter")
好处就是代码统一了,以后加新的 Finder 也方便,不用到处改。
加载策略系统
添加了自定义策略方法,更方便日后拓展,比如按优先级加载:
1from ErisPulse.loaders import ModuleLoadStrategy
2
3class MyModule(BaseModule):
4 @staticmethod
5 def get_load_strategy():
6 return ModuleLoadStrategy(
7 lazy_load=True, # 懒加载
8 priority=100 # 高优先级,先加载
9 )
should_eager_load() 这个方法还在(兼容),但建议用新的 get_load_strategy(),功能更全。
架构重构
这次把加载相关的代码统一整理到 loaders 目录下了:
ErisPulse/loaders/
├── base.py # BaseLoader 抽象基类
├── module.py # ModuleLoader
└── adapter.py # AdapterLoader
加了 ManagerBase 基类,适配器和模块管理器都继承它,配置接口统一了。还有 ModuleInitializer 统一管理加载流程。
简单说就是代码更规整了,以后加新功能不会乱七八糟。
CLI 和路由优化
CLI 现在会自动发现命令了,不用手动注册。只要继承 Command 基类的类,放在 commands 目录下就行。
WebSocket 路由也优化了,IPv6 回环地址会显示可访问的地址
epsdk run 还会自动创建入口文件,如果不存在的话。
文档更新
这次也把文档补齐了,特别是适配器相关的。
SendDSL 链式修饰方法(这个比较有意思)
新的适配器概念,修饰方法:
1# @用户、回复消息这些修饰方法
2await my_platform.Send.To('group', '123').At('456').Reply('789').Text("你好")
3
4# 还能 @多次
5await my_platform.Send.To('group', '123').At('456').At('789').Text("你们好")
6
7# @全体成员
8await my_platform.Send.To('group', '123').AtAll().Text("大家好")
发送方法(Text、Image 等)返回 Task,修饰方法(At、Reply、AtAll)返回 self。这样就能一直链式调用下去
适配器重构适配
把云湖、Telegram、OneBot11 三个适配器都重构适配了新功能,忙死我了T-T
- 明确了 Send 类发送方法的大驼峰命名规范,包括标准方法、链式修饰方法和协议方法的命名规则
核心模块都优化了一遍:
adapter模块:exists()检查_adapters,enable()/disable()支持自动注册module模块:register()加强验证,unload()改进错误处理router模块:WebSocket 路由注销优化,IPv6 地址显示改进logger模块:get_child()支持非相对路径,set_output_file()改进处理器管理lifecycle模块:添加事件类型验证exceptions模块:改进事件循环异常处理
还移除了 storage 模块的快照功能,用不上的东西就删掉了。
升级说明
⚠️ 虽然对外 API 保持兼容,但如果你用了内部 API(比如 ErisPulse.__init__.py 里的 LazyModule),可能需要改一下。
主要就是 should_eager_load() 改成 get_load_strategy() 了:
1# 旧方式(还能用,但不推荐)
2class MyModule(BaseModule):
3 @staticmethod
4 def should_eager_load():
5 return True
6
7# 新方式(推荐)
8class MyModule(BaseModule):
9 @staticmethod
10 def get_load_strategy():
11 return ModuleLoadStrategy(
12 lazy_load=False,
13 priority=50
14 )
最后
这次重构主要是为了代码更好维护,以后加东西也更方便。
欢迎来 GitHub 看看代码,提 issue 或者 PR 都行~ 秋秋了!
评论