示例与约定
本页说明插件编写时的常见分类和约束。示例来源包括 packages/server/src/plugin/builtins/ 中的内置插件。
utility 插件的常见场景
以下场景通常适合使用 utility 插件:
- 过滤候选目标
- 调整候选打分
- 监听广播事件
- 推送面板数据
- 调用外部服务并回写结果
对应的内置参考包括:
snr-filterworked-station-biasqso-session-inspectorheartbeat-demowatched-callsign-autocallwatched-novelty-autocall
守候型自动起呼插件
如果插件的目标是“发现目标后自动起呼”,当前推荐使用 onAutoCallCandidate(...):
- 返回 proposal,而不是在广播 Hook 中直接
ctx.operator.call(...) priority用于表达插件意图强弱lastMessage建议始终带上,方便 Host 在同优先级下按命中消息顺序稳定仲裁,并据此推导正确的回复时隙- 插件内部仍应自己判断 trigger mode、是否纯待机、是否被其他操作员占用、是否满足自己的黑白名单规则
当前内置参考:
watched-callsign-autocall:显式 watch list,默认优先级更高watched-novelty-autocall:守候新 DXCC / 新网格 / 新呼号,适合和其他守候插件一起启用
偏好排序型插件
如果插件的目标是“影响候选排序”,推荐实现 onScoreCandidates(...),而不是直接控制发射:
- 输入是
ScoredCandidate[] - 插件通过给每个候选增加或减少
score表达偏好 - 多个评分插件会自然叠加
- 最终是否选中某个目标,仍由 Host 和当前活跃策略共同决定
当前内置 worked-station-bias 就是标准示例:它查询目标是否已通联,再给新台加分、已通联台减分,而不是直接起呼。
strategy 插件的常见场景
以下场景通常需要 strategy 插件:
- 替换默认自动化流程
- 维护独立的 QSO 状态推进逻辑
- 生成自定义 TX 文本
- 根据特定竞赛或活动规则组织流程
对应的内置参考是 standard-qso。
编写顺序
- 先确定插件属于
utility还是strategy - 再确定需要的
hooks、settings、panels和存储范围 - 最后补充日志、README 和本地化文件
实现约定
逻辑拆分
建议把 Hook 中的业务逻辑拆分到独立函数,避免把过滤、状态更新和 UI 推送全部写在单个回调中。
配置命名
settings 中的键名会直接影响配置结构与界面显示,建议保持与实际用途一致,并配套提供本地化字段。
日志内容
插件日志建议至少包含以下信息:
- 当前 Hook 名称
- 触发条件
- 关键判断参数
- 最终动作
这些字段便于在 pluginLog 或主日志中定位问题。
自动起呼优先级建议
如果你的插件暴露 autocallPriority 之类的设置,建议把它理解为“跨插件仲裁优先级”,而不是插件内部列表排序:
100+:强指令型守候,例如显式 watch list、sked、朋友台60~99:高价值机会型守候,例如新 DXCC / 新网格 / 新呼号1~59:弱偏好型补充0:未显式设置优先级时的默认层级
通常建议把这类优先级做成 operator scope 设置,让不同操作员可以独立调整。
评分插件与过滤插件的边界
这两个类型建议明确分工:
onFilterCandidates:用于“绝不考虑”的硬过滤onScoreCandidates:用于“更倾向于考虑”的软偏置
例如:
- “只允许某些前缀”适合
onFilterCandidates - “已通联过的台降低优先级”适合
onScoreCandidates
分发文件
可分发的插件目录通常至少包含以下文件:
- 入口文件,如
plugin.js或index.js locales/目录README.md
该结构与主项目 docs/plugin-system.md 中的目录约定一致。