CoolQ C++ SDK 封装了跟 DLL 接口相关的底层逻辑,包括:
- 将所有从酷 Q 传来的字符串转成 UTF-8,并将所有传入酷 Q 的字符串转成 GB18030
- 封装了
Message和MessageSegment类,使构造消息内容更为方便 MessageSegment类提供了快速构造消息段(CQ 码)的接口- 处理了消息内容中的 emoji 到 Unicode 的转换
- 封装了酷 Q 事件的数据,在事件处理函数中传入
- 将 QQ 相关的事件分为三个大类别:
MessageEvent、NoticeEvent、RequestEvent - 封装了数据类,如
User、Group、GroupMember等 - ……
并且对外提供了更现代的 C++ 接口,从而为更方便地编写插件提供可能。
本项目使用 CMake 构建,依赖项通过 Vcpkg 管理。如果你没有使用过这两个工具,请先前往它们的官方网站了解基本用法。
可以直接用 VS Code 或 VS 打开项目,项目中的所有代码文件全部使用 UTF-8 编码,你后续添加的所有代码文件都需要使用 UTF-8 编码。注意,如果你使用 VS,则它默认使用 ANSI 编码保存文件,需要手动修改为 UTF-8。com.example.demo.json 文件将在 scripts/post_build.ps1 脚本中被转换为酷 Q 要求的 GB18030 编码。
Vcpkg 使用如下 triplet:
set(VCPKG_TARGET_ARCHITECTURE x86)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_PLATFORM_TOOLSET v141)你需要在 Vcpkg 的 triplets 文件夹中创建一个名为 my-x86-windows-static.cmake 的文件(文件名可以换为其它,但建议保留 x86-windows-static 这部分,似乎 Vcpkg 使用了文件名来判断要安装的包的版本),内容如上。创建了这个 triplet 之后,你需要将 scripts/generate.ps1 中的 $vcpkg_root(vcpkg 根目录)和 $vcpkg_triplet(triplet 名称,例如 my-x86-windows-static)设置成你系统中的相应值(或设置环境变量),如果你使用 VS Code 或 VS 编辑项目,可以直接修改 .vscode/tasks.json(VS Code)或 CMakeSettings.json(VS)中的 VCPKG_ROOT 和 VCPKG_TRIPLET 环境变量,注意,.vscode/tasks.json 中有两个 task 需要改。
除此之外,还需要安装如下依赖(使用上面的 triplet):
| 模块 | 依赖项 |
|---|---|
cqsdk |
boost-algorithmlibiconv |
安装命令如下:
cd vcpkg
.\vcpkg --vcpkg-root . --triplet my-x86-windows-static install boost-algorithm libiconv构建成功后,可以在 build/Debug/Debug 或 build/Release/Release 中找到生成的 DLL 和 JSON 文件,直接拷贝到酷 Q 的 app 目录即可测试使用(酷 Q 需要开启开发模式)。
如果不想每次构建都手动拷贝这两个文件,可以在 scripts 目录添加文件 install.ps1(会被 post_build.ps1 在构建成功之后自动执行)如下:
$lib_name = $args[0]
$out_dir = $args[1]
$dll_name = "${lib_name}.dll"
$dll_path = "${out_dir}\${dll_name}"
$json_name = "${lib_name}.json"
$json_path = "${out_dir}\${json_name}"
Copy-Item -Force $dll_path "C:\Applications\CQA\app\${dll_name}"
Copy-Item -Force $json_path "C:\Applications\CQA\app\${json_name}"注意上面脚本中需要适当修改酷 Q 的路径。
接口的具体文档暂时就不写了,顺着 cqsdk.h 头文件找进去或者查看示例代码 demo.cpp 基本就可以看明白。
请注意你在编写自己的插件时,一定要确保你的 JSON 描述文件和 com.example.demo.json 文件的 event 中的 function 字段完全一致,因为 DLL 导出函数名已经在 app.cpp 和 event.cpp 写死了。
+-----------------------------------------+
| Enabled At Start |
+-----------------------------------------+
| on_initialize |
| + |
| | |
| v |
| on_coolq_start |
| + |
| | |
| v disabled by user |
| on_enable +--------------> on_disable |
| + + |
| | | |
| v | |
| on_coolq_exit <-------------------+ |
+-----------------------------------------+
+---------------------------------------+
| Disabled At Start |
+---------------------------------------+
| on_initialize +------+ |
| + |enabled by user |
| | | |
| | v |
| | on_coolq_start |
| | + |
| | | |
| | v |
| | on_enable |
| | + |
| | | |
| v | |
| on_coolq_exit <------+ |
+---------------------------------------+