mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-20 02:55:38 +08:00
格式化工具部分: 1. pre-commit 引入 python 的格式化工具,包括 black(代码格式化)和 isort(对“包导入顺序”的规范) 2. 允许 prettier 对文档站的 markdown 文件格式化 3. 不允许 prettier 对 markdown 文件中的代码块的代码本身进行格式化 4. 升级了 pre-commit 的各个 hook 的版本 5. 优化了 pre-commit 的日志文本显示 容器总览部分: 1. 由原来的单一轻量环境转为区分空环境、轻量环境和全量环境 2. 空环境是裸 Linux 镜像(Ubuntu),为默认环境 3. 轻量环境适合开发文档站前端 4. 全量环境适合开发 MaaCore 5. 目前,全量环境完整包含了轻量环境,轻量环境完整包含了空环境 6. 在仓库 README.md 中更新了三个环境的描述,并将链接分别设置为对应环境的创建链接 **注意:没有修改文档站中的对应文件** 7. 在各个语言的开发指南的最后,移除了 Codespace 部分的“安装额外依赖”相关描述,且将链接设置为全量环境的创建链接 **注意:没有添加“开发文档站”的指南和对应 codespace 的使用方式** 容器的轻量环境和全量环境共有部分: 1. 安装 black 和 isort 包 2. 调整 VS Code 设置,取消先前(对 markdown 文件单独指定 markdownlint 扩展作为格式化工具)的错误设置,现在 markdown 文件仍然使用默认的 prettier 扩展作为格式化工具 3. 引入 markdown-all-in-one 扩展作为语法提示工具 4. 将 node_modules 和 3rdparty 排除在 VS Code 的文本的搜索路径之外 容器的全量环境部分: 1. 为 tools 下的所有 python 脚本安装依赖 2. 使用 tools/maadeps-download.py 下载 maadeps,且将必要二进制文件软链接到 /usr/local/bin/ 3. 使用 apt 安装 cmake 和 clangd-20,将后者通过 update-alternatives 设置为系统 clangd 的默认版本 4. 使用 cmake tools 扩展,并按照 Linux 编译方法进行配置 5. 使用 clang-format 作为 c/cpp 的格式化工具,clang-format 程序主体来自 maadeps(已经软链接到 /usr/local/bin/) 6. 使用 clangd 作为 c/cpp 的语法提示工具 7. 将 MaaDeps、install 和 build 排除在 VS Code 的文本搜索路径之外 其它手动调整: 1. 更新文档站的 package.json,指定 pnpm 包管理器的版本 2. 手动保证 markdown 文件中的列表前后有空行(注意到 MarkdownLint 官方规则不一定能精准定位所有“列表前后空行”的问题,详见:https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md032---lists-should-be-surrounded-by-blank-lines ) 3. 修改了部分 markdown 文件中的 json 代码块的语法问题 **注意:相同的问题并未全部发现,仅修改了两处** 4. 在 tools 目录中,一处 python 脚本的包名误用(本地包名和某个 pip 包重名),这里修改了相应代码 5. 在 tools 目录中,一处 python 脚本使用了弃用的包 cchardet 的问题,这里更换了推荐使用的功能相近的包并修改了相应代码 自动化脚本提交的修改: 1. 自动格式化了大量 tools 中的 python 脚本 2. 自动格式化了大量 docs 中的 markdown 文件 Commits: * chore: pre-commit引入black和isort规范py文件 * chore: Auto update by pre-commit hooks [skip changelog] * chore: devcontainer添加isort扩展,排序python导入 * chore: pre-commit任务命名及更名 * style: isort fix * chore: Auto update by pre-commit hooks [skip changelog] * chore: 更新pre-commit的hook版本 * fix: 模块名与第三方库重名,大忌 * chore: 容器构建时额外安装isort * docs: md -> markdown * chore: 容器安装python包和maadeps * fix: 修复过时python包 * chore: 指定pnpm版本 * chore: container支持选择轻量环境 * chore: 去掉rust * chore: add plain env * chore: 使用clangd语言服务器 * chore: 无需单独设置markdown的格式化工具 * chore: 更新安装的clangd版本 * docs: 简易文档适配 * docs: 在仓库README中重新编排codespaces相关指引 * chore: Auto update by pre-commit hooks [skip changelog] * style: 调整缩进 * chore: 格式化工具不用特意排除被gitignore忽略的文件 * chore: sh文件在gitattributes中单列一类 * chore: 格式化docs下的markdown文件 * chore: 暂时不修改md文件中的代码块 * style: 人为明确markdown中的部分列表相关格式 * docs: 补上部分markdown的json代码块中缺失的逗号 * chore: Auto update by pre-commit hooks [skip changelog] * chore: Auto update by pre-commit hooks [skip changelog] * fix: 补上tools的服务器排序相关代码中缺失的逗号 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore: 使用maadeps的clangd * build: 更新maadeps工具链版本 * style: prettier fix * revert: 还原maadeps版本 * revert: 取消使用maadeps的clangd依赖,改用系统apt安装 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
518 lines
14 KiB
Markdown
518 lines
14 KiB
Markdown
---
|
||
order: 2
|
||
icon: material-symbols:u-turn-left
|
||
---
|
||
|
||
# 回调消息协议
|
||
|
||
::: info 注意
|
||
回调消息随版本更新飞速迭代中,本文档可能过时。如需获取最新内容可参考 [C# 集成源码](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/MaaWpfGui/Main/AsstProxy.cs)
|
||
:::
|
||
|
||
## 回调函数原型
|
||
|
||
```cpp
|
||
typedef void(ASST_CALL* AsstCallback)(int msg, const char* details, void* custom_arg);
|
||
```
|
||
|
||
## 参数总览
|
||
|
||
- `int msg`
|
||
消息类型
|
||
|
||
```cpp
|
||
enum class AsstMsg
|
||
{
|
||
/* Global Info */
|
||
InternalError = 0, // 内部错误
|
||
InitFailed = 1, // 初始化失败
|
||
ConnectionInfo = 2, // 连接相关信息
|
||
AllTasksCompleted = 3, // 全部任务完成
|
||
AsyncCallInfo = 4, // 外部异步调用信息
|
||
Destroyed = 5, // 实例已销毁
|
||
|
||
/* TaskChain Info */
|
||
TaskChainError = 10000, // 任务链执行/识别错误
|
||
TaskChainStart = 10001, // 任务链开始
|
||
TaskChainCompleted = 10002, // 任务链完成
|
||
TaskChainExtraInfo = 10003, // 任务链额外信息
|
||
TaskChainStopped = 10004, // 任务链手动停止
|
||
|
||
/* SubTask Info */
|
||
SubTaskError = 20000, // 原子任务执行/识别错误
|
||
SubTaskStart = 20001, // 原子任务开始
|
||
SubTaskCompleted = 20002, // 原子任务完成
|
||
SubTaskExtraInfo = 20003, // 原子任务额外信息
|
||
SubTaskStopped = 20004, // 原子任务手动停止
|
||
|
||
/* Web Request */
|
||
ReportRequest = 30000, // 上报请求
|
||
};
|
||
```
|
||
|
||
- `const char* details`
|
||
消息详情,json 字符串,详见 [字段解释](#字段解释)
|
||
- `void* custom_arg`
|
||
调用方自定义参数,会原样传出 `AsstCreateEx` 接口中的 `custom_arg` 参数,C 系语言可利用该参数传出 `this` 指针
|
||
|
||
## 字段解释
|
||
|
||
### InternalError
|
||
|
||
`details` 字段为空。
|
||
|
||
### InitFailed
|
||
|
||
:::: field-group
|
||
::: field name="what" type="string" required
|
||
错误类型。
|
||
:::
|
||
::: field name="why" type="string" required
|
||
错误原因。
|
||
:::
|
||
::: field name="details" type="object" required
|
||
错误详情。
|
||
:::
|
||
::::
|
||
|
||
### ConnectionInfo
|
||
|
||
:::: field-group
|
||
::: field name="what" type="string" required
|
||
信息类型。
|
||
:::
|
||
::: field name="why" type="string" required
|
||
信息原因。
|
||
:::
|
||
::: field name="uuid" type="string"
|
||
设备唯一码(连接失败时为空)。
|
||
:::
|
||
::: field name="details" type="object" required
|
||
连接详情。其结构如下:
|
||
|
||
- `adb` (string, required): `AsstConnect` 接口 `adb_path` 参数。
|
||
- `address` (string, required): `AsstConnect` 接口 `address` 参数。
|
||
- `config` (string, required): `AsstConnect` 接口 `config` 参数。
|
||
|
||
:::
|
||
::::
|
||
|
||
### 常见 `What` 字段
|
||
|
||
- `ConnectFailed`
|
||
连接失败
|
||
- `Connected`
|
||
已连接,注意此时的 `uuid` 字段值为空(下一步才是获取)
|
||
- `UuidGot`
|
||
已获取到设备唯一码
|
||
- `UnsupportedResolution`
|
||
分辨率不被支持
|
||
- `ResolutionError`
|
||
分辨率获取错误
|
||
- `Reconnecting`
|
||
连接断开(adb / 模拟器 炸了),正在重连
|
||
- `Reconnected`
|
||
连接断开(adb / 模拟器 炸了),重连成功
|
||
- `Disconnect`
|
||
连接断开(adb / 模拟器 炸了),并重试失败
|
||
- `ScreencapFailed`
|
||
截图失败(adb / 模拟器 炸了),并重试失败
|
||
- `TouchModeNotAvailable`
|
||
不支持的触控模式
|
||
|
||
### AsyncCallInfo
|
||
|
||
:::: field-group
|
||
::: field name="uuid" type="string" required
|
||
设备唯一码。
|
||
:::
|
||
::: field name="what" type="string" required
|
||
回调类型,例如 `Connect` | `Click` | `Screencap` 等。
|
||
:::
|
||
::: field name="async_call_id" type="number" required
|
||
异步请求 id,即调用 `AsstAsyncXXX` 时的返回值。
|
||
:::
|
||
::: field name="details" type="object" required
|
||
异步调用详情。其结构如下:
|
||
|
||
- `ret` (boolean, required): 实际调用的返回值。
|
||
- `cost` (number, required): 耗时,单位毫秒。
|
||
|
||
:::
|
||
::::
|
||
|
||
### AllTasksCompleted
|
||
|
||
:::: field-group
|
||
::: field name="taskchain" type="string" required
|
||
最后的任务链。
|
||
:::
|
||
::: field name="uuid" type="string" required
|
||
设备唯一码。
|
||
:::
|
||
::: field name="finished_tasks" type="array<number>" required
|
||
已经运行过的任务 id 列表。
|
||
:::
|
||
::::
|
||
|
||
#### 常见 `taskchain` 字段
|
||
|
||
- `StartUp`
|
||
开始唤醒
|
||
- `CloseDown`
|
||
关闭游戏
|
||
- `Fight`
|
||
刷理智
|
||
- `Mall`
|
||
信用点及购物
|
||
- `Recruit`
|
||
自动公招
|
||
- `Infrast`
|
||
基建换班
|
||
- `Award`
|
||
领取日常奖励
|
||
- `Roguelike`
|
||
无限刷肉鸽
|
||
- `Copilot`
|
||
自动抄作业
|
||
- `SSSCopilot`
|
||
自动抄保全作业
|
||
- `Depot`
|
||
仓库识别
|
||
- `OperBox`
|
||
干员 box 识别
|
||
- `Reclamation`
|
||
生息演算
|
||
- `Custom`
|
||
自定义任务
|
||
- `SingleStep`
|
||
单步任务
|
||
- `VideoRecognition`
|
||
视频识别任务
|
||
- `Debug`
|
||
调试
|
||
|
||
### TaskChain 相关消息
|
||
|
||
:::: field-group
|
||
::: field name="taskchain" type="string" required
|
||
当前的任务链。
|
||
:::
|
||
::: field name="taskid" type="number" required
|
||
当前任务 TaskId。
|
||
:::
|
||
::: field name="uuid" type="string" required
|
||
设备唯一码。
|
||
:::
|
||
::::
|
||
|
||
### TaskChainExtraInfo
|
||
|
||
`details` 字段为空。
|
||
|
||
### SubTask 相关消息
|
||
|
||
:::: field-group
|
||
::: field name="subtask" type="string" required
|
||
子任务名。
|
||
:::
|
||
::: field name="class" type="string" required
|
||
子任务符号名。
|
||
:::
|
||
::: field name="taskchain" type="string" required
|
||
当前任务链。
|
||
:::
|
||
::: field name="taskid" type="number" required
|
||
当前任务 TaskId。
|
||
:::
|
||
::: field name="details" type="object" required
|
||
详情。
|
||
:::
|
||
::: field name="uuid" type="string" required
|
||
设备唯一码。
|
||
:::
|
||
::::
|
||
|
||
#### 常见 `subtask` 字段
|
||
|
||
- `ProcessTask`
|
||
`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="task" type="string" required
|
||
任务名。
|
||
:::
|
||
::: field name="action" type="number" required
|
||
Action ID。
|
||
:::
|
||
::: field name="exec_times" type="number" required
|
||
已执行次数。
|
||
:::
|
||
::: field name="max_times" type="number" required
|
||
最大执行次数。
|
||
:::
|
||
::: field name="algorithm" type="number" required
|
||
识别算法。
|
||
:::
|
||
::::
|
||
|
||
- Todo 其他
|
||
|
||
##### 常见 `task` 字段
|
||
|
||
- `StartButton2`
|
||
开始战斗
|
||
- `MedicineConfirm`
|
||
使用理智药
|
||
- `ExpiringMedicineConfirm`
|
||
使用 48 小时内过期的理智药
|
||
- `StoneConfirm`
|
||
碎石
|
||
- `RecruitRefreshConfirm`
|
||
公招刷新标签
|
||
- `RecruitConfirm`
|
||
公招确认招募
|
||
- `RecruitNowConfirm`
|
||
公招使用加急许可
|
||
- `ReportToPenguinStats`
|
||
汇报到企鹅数据统计
|
||
- `ReportToYituliu`
|
||
汇报到一图流大数据
|
||
- `InfrastDormDoubleConfirmButton`
|
||
基建宿舍的二次确认按钮,仅当干员冲突时才会有,请提示用户
|
||
- `StartExplore`
|
||
肉鸽开始探索
|
||
- `StageTraderInvestConfirm`
|
||
肉鸽投资了源石锭
|
||
- `StageTraderInvestSystemFull`
|
||
肉鸽投资达到了游戏上限
|
||
- `ExitThenAbandon`
|
||
肉鸽放弃了本次探索
|
||
- `MissionCompletedFlag`
|
||
肉鸽战斗完成
|
||
- `MissionFailedFlag`
|
||
肉鸽战斗失败
|
||
- `StageTraderEnter`
|
||
肉鸽关卡:诡异行商
|
||
- `StageSafeHouseEnter`
|
||
肉鸽关卡:安全的角落
|
||
- `StageEncounterEnter`
|
||
肉鸽关卡:不期而遇/古堡馈赠
|
||
- `StageCombatDpsEnter`
|
||
肉鸽关卡:普通作战
|
||
- `StageEmergencyDps`
|
||
肉鸽关卡:紧急作战
|
||
- `StageDreadfulFoe`
|
||
肉鸽关卡:险路恶敌
|
||
- `StartGameTask`
|
||
打开客户端失败(配置文件与传入 client_type 不匹配)
|
||
- Todo 其他
|
||
|
||
### SubTaskExtraInfo
|
||
|
||
:::: field-group
|
||
::: field name="taskchain" type="string" required
|
||
当前任务链。
|
||
:::
|
||
::: field name="class" type="string" required
|
||
子任务类型。
|
||
:::
|
||
::: field name="what" type="string" required
|
||
信息类型。
|
||
:::
|
||
::: field name="details" type="object" required
|
||
信息详情。
|
||
:::
|
||
::: field name="uuid" type="string" required
|
||
设备唯一码。
|
||
:::
|
||
::::
|
||
|
||
#### 常见 `what` 及 `details` 字段
|
||
|
||
- `StageDrops`
|
||
关卡材料掉落信息。`details` 字段结构如下:
|
||
- `drops` (array, required): 本次识别到的掉落材料,数组每一项包含:
|
||
- `itemId` (string, required): 材料 ID。
|
||
- `quantity` (number, required): 掉落数量。
|
||
- `itemName` (string, required): 材料名称。
|
||
- `stage` (object, required): 关卡信息,包含:
|
||
- `stageCode` (string, required): 关卡编号。
|
||
- `stageId` (string, required): 关卡 ID。
|
||
- `stars` (number, required): 行动结束星级。
|
||
- `stats` (array, required): 本次执行期间总的材料掉落,数组每一项包含:
|
||
- `itemId` (string, required): 材料 ID。
|
||
- `itemName` (string, required): 材料名称。
|
||
- `quantity` (number, required): 总计数量。
|
||
- `addQuantity` (number, required): 本次新增的掉落数量。
|
||
|
||
- `RecruitTagsDetected`
|
||
公招识别到了 Tags。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="tags" type="array<string>" required
|
||
识别到的 Tag 列表。
|
||
:::
|
||
::::
|
||
|
||
- `RecruitSpecialTag`
|
||
公招识别到了特殊 Tag。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="tag" type="string" required
|
||
特殊 Tag 名称,例如 `高级资深干员`。
|
||
:::
|
||
::::
|
||
|
||
- `RecruitResult`
|
||
公招识别结果。`details` 字段结构如下:
|
||
- `tags` (array, required): 所有识别到的 tags,目前固定为 5 个。
|
||
- `level` (number, required): 组合的最高星级。
|
||
- `result` (array, required): 具体的组合结果,数组每一项包含:
|
||
- `tags` (array, required): 参与组合的 tags。
|
||
- `level` (number, required): 这组 tags 的星级。
|
||
- `opers` (array, required): 可能招募到的干员,数组每一项包含:
|
||
- `name` (string, required): 干员名称。
|
||
- `level` (number, required): 干员星级。
|
||
|
||
- `RecruitTagsRefreshed`
|
||
公招刷新了 Tags。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="count" type="number" required
|
||
当前槽位已刷新次数。
|
||
:::
|
||
::: field name="refresh_limit" type="number" required
|
||
当前槽位刷新次数上限。
|
||
:::
|
||
::::
|
||
|
||
- `RecruitNoPermit`
|
||
公招无招聘许可。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="continue" type="boolean" required
|
||
是否继续刷新。
|
||
:::
|
||
::::
|
||
|
||
- `RecruitTagsSelected`
|
||
公招选择了 Tags。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="tags" type="array<string>" required
|
||
选择的 Tag 列表。
|
||
:::
|
||
::::
|
||
|
||
- `RecruitSlotCompleted`
|
||
当前公招槽位任务完成。`details` 字段为空。
|
||
|
||
- `RecruitError`
|
||
公招识别错误。`details` 字段为空。
|
||
|
||
- `EnterFacility`
|
||
基建进入了设施。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="facility" type="string" required
|
||
设施名。
|
||
:::
|
||
::: field name="index" type="number" required
|
||
设施序号。
|
||
:::
|
||
::::
|
||
|
||
- `NotEnoughStaff`
|
||
基建可用干员不足。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="facility" type="string" required
|
||
设施名。
|
||
:::
|
||
::: field name="index" type="number" required
|
||
设施序号。
|
||
:::
|
||
::::
|
||
|
||
- `ProductOfFacility`
|
||
基建产物。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="product" type="string" required
|
||
产物名。
|
||
:::
|
||
::: field name="facility" type="string" required
|
||
设施名。
|
||
:::
|
||
::: field name="index" type="number" required
|
||
设施序号。
|
||
:::
|
||
::::
|
||
|
||
- `StageInfo`
|
||
自动作战关卡信息。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="name" type="string" required
|
||
关卡名。
|
||
:::
|
||
::::
|
||
|
||
- `StageInfoError`
|
||
自动作战关卡识别错误。`details` 字段为空。
|
||
|
||
- `PenguinId`
|
||
企鹅物流 ID。`details` 字段内容如下:
|
||
|
||
:::: field-group
|
||
::: field name="id" type="string" required
|
||
企鹅物流 ID。
|
||
:::
|
||
::::
|
||
|
||
- `Depot`
|
||
仓库识别结果。`details` 字段结构如下:
|
||
- `done` (boolean, required): 是否已经识别完了,为 `false` 表示仍在识别中(过程中的数据)。
|
||
- `arkplanner` (object, required): [ArkPlanner](https://penguin-stats.cn/planner) 格式的数据。
|
||
- `lolicon` (object, required): [lolicon](https://arkntools.app/#/material) (Arkntools) 格式的数据。
|
||
|
||
- `OperBox`
|
||
干员识别结果。`details` 字段结构如下:
|
||
- `done` (boolean, required): 是否已经识别完了,为 `false` 表示仍在识别中(过程中的数据)。
|
||
- `all_oper` (array, required): 全干员列表,数组每一项包含:
|
||
- `id` (string, required): 干员 ID。
|
||
- `name` (string, required): 干员名称。
|
||
- `own` (boolean, required): 是否拥有。
|
||
- `rarity` (number, required): 干员稀有度 [1, 6]。
|
||
- `own_opers` (array, required): 已拥有干员的详细信息列表,数组每一项包含:
|
||
- `id` (string, required): 干员 ID。
|
||
- `name` (string, required): 干员名称。
|
||
- `own` (boolean, required): 是否拥有。
|
||
- `elite` (number, required): 精英等级 [0, 2]。
|
||
- `level` (number, required): 干员等级。
|
||
- `potential` (number, required): 干员潜能 [1, 6]。
|
||
- `rarity` (number, required): 干员稀有度 [1, 6]。
|
||
|
||
- `UnsupportedLevel`
|
||
自动抄作业,不支持的关卡名。`details` 字段为空。
|
||
|
||
### ReportRequest
|
||
|
||
该字段主要用于核心模块向 UI 层传递网络请求信息,UI 负责执行具体的 HTTP 上报操作。
|
||
|
||
:::: field-group
|
||
::: field name="url" type="string" required
|
||
请求的完整 URL,例如 `https://penguin-stats.io/PenguinStats/api/v2/report`。
|
||
:::
|
||
::: field name="headers" type="object" required
|
||
请求头键值对(不包含 `Content-Type`,UI 层自行添加)。
|
||
:::
|
||
::: field name="body" type="string" required
|
||
请求体内容(通常是 JSON 格式的字符串)。
|
||
:::
|
||
::: field name="subtask" type="string" required
|
||
子任务名称,标识具体上报任务,如 `ReportToPenguinStats`、`ReportToYituliu`。
|
||
:::
|
||
::::
|