Skip to content
On this page

设计

AmiyaBot 是一款 QQ 机器人框架,基于异步I/O构建,并提供了装饰器模式(Decorator Pattern)以及插件化动态导入(Dynamic import)的编程方式。 内置多种适配器兼容不同的服务来源以及丰富的消息构建类型,旨在帮助你更高效地编写业务逻辑,实现你的创意。

框架结构可分为业务模块通讯模块数据处理模块存储模块运转中心五个组成部分。它们独立运作,并在彼此之间相互提供数据。

业务模块

业务模块由插件(Plugin)账号实例(AmiyaBot)多账号实例(MultipleAccounts) 组成。它们一般会被组织成层层嵌套的树状结构。账号实例和多账号实例是同质的,它们均可以被运转中心(CenterProcessor)直接访问,运转中心无法访问插件。

运转中心在访问这些对象时,顶级对象会组合所有子级对象的属性提供给运转中心。

插件设计

实现上述模式的思路来源于 Vue 的 组件设计 ,所以在代码层面,插件与账号实例都属于“组件”,理论上账号实例之间也能互相嵌套。但在设计时加入了限制,防止这种关系的出现。

业务设计

业务模块通过各种装饰器来定义业务逻辑以及规则。这些装饰器都来源于它们继承的工厂对象(BotHandlerFactory),工厂对象是业务模块与运转中心的桥梁,业务函数会被工厂对象收集并封装,最终提供给运转中心调用。

账号实例图解

通讯与数据处理模块

通讯模块主要形式为适配器(Adapter),用于对接由机器人运营方提供的服务。

适配器

账号实例里面有一个重要参数:adapter,它指定了通讯模块的运行方式(选择适配器)以适配不同运营方的连接协议。

通讯模块负责解决对接收和发送的数据进行解包与封包,所以它与数据处理模块紧密相连。适配器必须为数据处理模块提供统一的接口,在与不同的运营方服务通讯过程中,运转中心获取到的源数据格式都必须是一致的。而接收到运转中心需要发出的数据时,适配器需要把数据封包为运营方协定的格式,完成发送。

账号实例也可以脱离运转中心的调控随时调用适配器与运营方服务通讯,完成一些特殊情况下的操作。

运转中心

运转中心包含事件处理消息处理分配器日志 等各种将所有模块相连的处理单元,是业务层的主要调度模块。在接收到由适配器传入的消息后,运转中心会将消息归类并分发到不同的处理模块。

消息处理

分配到消息处理的数据,将会对数据和业务模块收集的消息响应器(on_message)进行匹配,并将匹配成功的消息响应器按优先级排序,选取最高优先级的执行。

消息响应器的执行结果会经由运转中心返回到适配器,进行封包后发送。

这个过程在运转中心内称为“生命周期”,工厂对象可以介入这些周期影响消息处理的分配与执行结果。

结语

存储模块以及运转中心的日志等模块,在本文将忽略不谈。这些模块依赖第三方库或 Python 的标准库,本框架仅对其做了适度的封装。