Files
2026-10-22 17:07:08 +08:00

41 lines
1.8 KiB
TypeScript

import type {bot_instance_context} from '../../instance/bot_instance_init.ts';
import type {Json} from '../../../types/bot/workflow/workflow.ts';
import type {WorkflowStartTemplate} from '../../../types/bot/workflow/metadata.ts';
import {describe, output} from '../metadata.ts';
export const config_template: WorkflowStartTemplate = {
name: 'common', version: '1.0.0',
i18n: describe('普通启动', '手动启动工作流,也可在机器人出生后自动启动。'),
config: [{
name: 'auto_start', type: 'select', required: true, default: 'never',
i18n: describe('自动启动', '选择是否在机器人出生后自动启动工作流。'),
options: [
{value: 'never', i18n: describe('不自动启动', '仅通过手动请求启动。')},
{value: 'spawn', i18n: describe('出生时启动', '机器人出生并就绪后自动启动。')},
],
}],
output: {
...output('object', '启动数据', '手动启动时为调用方提供的 JSON 对象;自动启动时为 {event: "spawn"}。'),
additional_properties: output('json', '触发字段', '手动启动时传入的 JSON 字段值。'),
},
};
export function register_common_start(context: Pick<bot_instance_context<any>, 'on' | 'off'>,
start: (trigger: Record<string, Json>) => void, initially_ready = false): () => void {
let disposed = false;
let spawned = false;
const on_spawn = () => {
if (disposed || spawned) return;
spawned = true;
start({event: 'spawn'});
};
try { context.on('spawn', on_spawn); }
catch (error) { context.off('spawn', on_spawn); throw error; }
if (initially_ready) queueMicrotask(() => { if (!disposed && !spawned) on_spawn(); });
return () => {
if (disposed) return;
disposed = true;
context.off('spawn', on_spawn);
};
}