import { Message } from 'wechaty'; import { Assistant } from './assistant'; import { ConversationContext } from './context'; import { MaybePromise } from './typescript'; export interface Hook infer U ? U extends Promise ? V : U : void> { exposed: Exposed; normalized: Normalized; result: Result; } export type LifeCycleHook = Hook<(controller: AbortController, assistant: Assistant, ...args: T) => MaybePromise>; export type ExtendsHook = Hook<(controller: AbortController, extendable: T, assistant: Assistant) => MaybePromise>; /** * List of hooks */ export interface Hooks { /** * 消息接收 */ onMessage: LifeCycleHook<[Message]>; /** * 私人消息 */ onIndividualMessage: LifeCycleHook<[Message]>; /** * 房间消息 */ onRoomMessage: LifeCycleHook<[Message]>; /** * 在房间被提及 */ onRoomMentionSelfMessage: LifeCycleHook<[Message]>; /** * 上下文创建后 */ onContextCreated: ExtendsHook; /** * 上下文销毁后 */ onContextDestroyed: ExtendsHook; /** * 处理文本消息 */ onPrepareTextMessage: ExtendsHook; /** * 处理文件消息 */ onPrepareFileMessage: ExtendsHook; } /** * Name of hooks */ export type HooksName = keyof Hooks; /** * Exposed hooks API that can be accessed by a plugin */ export type HooksExposed = { [K in HooksName]: Hooks[K]['exposed']; }; /** * Normalized hooks */ export type HooksNormalized = { [K in HooksName]: Hooks[K]['normalized']; }; /** * Result of hooks */ export type HooksResult = { [K in HooksName]: Hooks[K]['result']; }; /** * Hook item */ export interface HookItem { pluginName: string; hook: HooksNormalized[T]; } /** * Hook items queue */ export interface HookQueue { name: T; items: HookItem[]; add: (item: HookItem) => void; process: (...args: Parameters) => Promise; }