EntryLib 是由本人设计开发,基于 Mirai-Console 的一个插件,用于实现群词条、自定义回复或更多功能。
Mirai 是一个 QQ 机器人框架,相当于一个 QQ 客户端,但同时可以通过指令控制机器人完成各种事务。
第三方机器人框架在酷Q跑路后伤亡惨重,如今较为成熟的框架仅剩 Mirai、go-cqhttp、nonebot,但最终几乎都使用 Mirai 作为终端,因此基于 Mirai-Console 进行应用开发会显得更为明智(nonebot:人生苦短,我选python)。
本文将会记录下并不定时更新本人开发 EntryLib 词条库时的一些心得。
数据库的选择
在进行总体设计时,已经考虑到庞大的数据量最好需要引入数据库,使用文件索引的方式记录繁杂而凌乱,恰好是数据库专长的领域。
可选的数据库有:SQL Server、MySQL、SQLite 等…
由于 Mirai 可以在 Linux 环境下运行,因此使用 SQL Server 不太合适,并且 SQL Server 笨重的安装过程会劝退不少新用户。
我在 MySQL 与 SQLite 间纠结了很久,两者都较为轻便且支持 Linux 环境。
最终我的选择是 SQLite,原因有以下几点:
- 几乎所有 Linux 都默认装有 SQLite,无需重新安装
- 在 Windows 平台下 SQLite 的安装只需要下载很少的文件并添加环境变量即可
- SQLite 的数据库以可视的形式储存,方便插件和用户进行管理
但在设计时我并没有考虑到的问题是:SQLite 并没有直接的命令支持正则匹配寻找,因此这需要我提取出所有数据内容,再使用程序代码对正则匹配进行实现,这样显得不太优雅而且更加费时。
优化人机交互
在以往设计命令格式与回复时,一般都是指定一种命令格式,偶尔允许用户修改部分命令文本,但这样自由度依然欠佳。
在 EntryLib 的命令输入时,我采用了键值对的方式。首先将指令分类为若干类,然后允许用户编辑键值对来自定义命令输入内容。在代码处理时,创建一个解析类用于解析输入。这样可以实现多对一的输入交互,自由度大大增加了。
在 EntryLib 的回复输出时,采用了以往自由度较高的方式:将输出的变量用${variable1},${variable2},...
的形式表示,让用户编辑带有变量的字符串作为输出内容。代码处理时将字符串中的变量逐一替换即可。