import { NapCatCore } from '../../../napcat-core'; import { NapCatOneBot11Adapter, OB11Message } from '../../index'; import { ActionMap } from '../../action'; import { OB11EmitEventContent } from '../../network/index'; import { NetworkAdapterConfig } from '../../config/config'; export interface PluginPackageJson { name?: string; plugin?: string; version?: string; main?: string; description?: string; author?: string; } export interface PluginConfigItem { key: string; type: 'string' | 'number' | 'boolean' | 'select' | 'multi-select' | 'html' | 'text'; label: string; description?: string; default?: unknown; options?: { label: string; value: string | number; }[]; placeholder?: string; /** 标记此字段为响应式:值变化时触发 schema 刷新 */ reactive?: boolean; /** 是否隐藏此字段 */ hidden?: boolean; } export type PluginConfigSchema = PluginConfigItem[]; /** NapCatConfig 类的静态方法接口(用于 typeof NapCatConfig) */ export interface INapCatConfigStatic { text(key: string, label: string, defaultValue?: string, description?: string, reactive?: boolean): PluginConfigItem; number(key: string, label: string, defaultValue?: number, description?: string, reactive?: boolean): PluginConfigItem; boolean(key: string, label: string, defaultValue?: boolean, description?: string, reactive?: boolean): PluginConfigItem; select(key: string, label: string, options: { label: string; value: string | number; }[], defaultValue?: string | number, description?: string, reactive?: boolean): PluginConfigItem; multiSelect(key: string, label: string, options: { label: string; value: string | number; }[], defaultValue?: (string | number)[], description?: string, reactive?: boolean): PluginConfigItem; html(content: string): PluginConfigItem; plainText(content: string): PluginConfigItem; combine(...items: PluginConfigItem[]): PluginConfigSchema; } /** NapCatConfig 类型(包含静态方法) */ export type NapCatConfigClass = INapCatConfigStatic; /** HTTP 请求对象(包装类型) */ export interface PluginHttpRequest { /** 请求路径 */ path: string; /** 请求方法 */ method: string; /** 查询参数 */ query: Record; /** 请求体 */ body: unknown; /** 请求头 */ headers: Record; /** 路由参数 */ params: Record; /** 原始请求对象(用于高级用法) */ raw: unknown; } /** HTTP 响应对象(包装类型) */ export interface PluginHttpResponse { /** 设置状态码 */ status(code: number): PluginHttpResponse; /** 发送 JSON 响应 */ json(data: unknown): void; /** 发送文本响应 */ send(data: string | Buffer): void; /** 设置响应头 */ setHeader(name: string, value: string): PluginHttpResponse; /** 发送文件 */ sendFile(filePath: string): void; /** 重定向 */ redirect(url: string): void; /** 原始响应对象(用于高级用法) */ raw: unknown; } /** 下一步函数类型 */ export type PluginNextFunction = (err?: unknown) => void; /** 插件请求处理器类型 */ export type PluginRequestHandler = (req: PluginHttpRequest, res: PluginHttpResponse, next: PluginNextFunction) => void | Promise; /** HTTP 方法类型 */ export type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all'; /** 插件 API 路由定义 */ export interface PluginApiRouteDefinition { /** HTTP 方法 */ method: HttpMethod; /** 路由路径(相对于插件路由前缀) */ path: string; /** 请求处理器 */ handler: PluginRequestHandler; } /** 插件页面定义 */ export interface PluginPageDefinition { /** 页面路径(用于路由,如 'settings') */ path: string; /** 页面标题(显示在 Tab 上) */ title: string; /** 页面图标(可选,支持 emoji 或图标名) */ icon?: string; /** 页面 HTML 文件路径(相对于插件目录) */ htmlFile: string; /** 页面描述 */ description?: string; } /** 内存文件生成器 - 用于动态生成静态文件内容 */ export type MemoryFileGenerator = () => string | Buffer | Promise; /** 内存静态文件定义 */ export interface MemoryStaticFile { /** 文件路径(相对于 urlPath) */ path: string; /** 文件内容或生成器 */ content: string | Buffer | MemoryFileGenerator; /** 可选的 MIME 类型 */ contentType?: string; } /** 插件路由注册器 */ export interface PluginRouterRegistry { /** * 注册单个 API 路由(需要认证,挂载到 /api/Plugin/ext/{pluginId}/) * @param method HTTP 方法 * @param path 路由路径 * @param handler 请求处理器 */ api(method: HttpMethod, path: string, handler: PluginRequestHandler): void; /** 注册 GET API(需要认证) */ get(path: string, handler: PluginRequestHandler): void; /** 注册 POST API(需要认证) */ post(path: string, handler: PluginRequestHandler): void; /** 注册 PUT API(需要认证) */ put(path: string, handler: PluginRequestHandler): void; /** 注册 DELETE API(需要认证) */ delete(path: string, handler: PluginRequestHandler): void; /** * 注册单个无认证 API 路由(挂载到 /plugin/{pluginId}/api/) * @param method HTTP 方法 * @param path 路由路径 * @param handler 请求处理器 */ apiNoAuth(method: HttpMethod, path: string, handler: PluginRequestHandler): void; /** 注册 GET API(无认证) */ getNoAuth(path: string, handler: PluginRequestHandler): void; /** 注册 POST API(无认证) */ postNoAuth(path: string, handler: PluginRequestHandler): void; /** 注册 PUT API(无认证) */ putNoAuth(path: string, handler: PluginRequestHandler): void; /** 注册 DELETE API(无认证) */ deleteNoAuth(path: string, handler: PluginRequestHandler): void; /** * 注册插件页面 * @param page 页面定义 */ page(page: PluginPageDefinition): void; /** * 注册多个插件页面 * @param pages 页面定义数组 */ pages(pages: PluginPageDefinition[]): void; /** * 提供静态文件服务 * @param urlPath URL 路径 * @param localPath 本地文件夹路径(相对于插件目录或绝对路径) */ static(urlPath: string, localPath: string): void; /** * 提供内存生成的静态文件服务 * @param urlPath URL 路径 * @param files 内存文件列表 */ staticOnMem(urlPath: string, files: MemoryStaticFile[]): void; } /** 插件管理器公共接口 */ export interface IPluginManager { readonly config: NetworkAdapterConfig; getPluginPath(): string; getPluginConfig(): PluginStatusConfig; getAllPlugins(): PluginEntry[]; getLoadedPlugins(): PluginEntry[]; getPluginInfo(pluginId: string): PluginEntry | undefined; setPluginStatus(pluginId: string, enable: boolean): Promise; loadPluginById(pluginId: string): Promise; unregisterPlugin(pluginId: string): Promise; uninstallPlugin(pluginId: string, cleanData?: boolean): Promise; reloadPlugin(pluginId: string): Promise; loadDirectoryPlugin(dirname: string): Promise; getPluginDataPath(pluginId: string): string; getPluginConfigPath(pluginId: string): string; } /** 插件配置 UI 控制器 - 用于动态控制配置界面 */ export interface PluginConfigUIController { /** 更新整个 schema */ updateSchema: (schema: PluginConfigSchema) => void; /** 更新单个字段 */ updateField: (key: string, field: Partial) => void; /** 移除字段 */ removeField: (key: string) => void; /** 添加字段 */ addField: (field: PluginConfigItem, afterKey?: string) => void; /** 显示字段 */ showField: (key: string) => void; /** 隐藏字段 */ hideField: (key: string) => void; /** 获取当前配置值 */ getCurrentConfig: () => Record; } /** * 插件日志接口 - 简化的日志 API */ export interface PluginLogger { /** 普通日志 */ log(...args: unknown[]): void; /** 调试日志 */ debug(...args: unknown[]): void; /** 信息日志 */ info(...args: unknown[]): void; /** 警告日志 */ warn(...args: unknown[]): void; /** 错误日志 */ error(...args: unknown[]): void; } export interface NapCatPluginContext { core: NapCatCore; oneBot: NapCatOneBot11Adapter; actions: ActionMap; pluginName: string; pluginPath: string; configPath: string; dataPath: string; /** NapCatConfig 配置构建器 */ NapCatConfig: NapCatConfigClass; adapterName: string; /** 插件管理器实例 */ pluginManager: IPluginManager; /** 插件日志器 - 自动添加插件名称前缀 */ logger: PluginLogger; /** * WebUI 路由注册器 * 用于注册插件的 HTTP API 路由,路由将挂载到 /api/Plugin/ext/{pluginId}/ * 静态资源将挂载到 /plugin/{pluginId}/files/{urlPath}/ */ router: PluginRouterRegistry; /** * 获取其他插件的导出模块 * @param pluginId 目标插件 ID * @returns 插件导出的模块,如果插件未加载则返回 undefined */ getPluginExports: (pluginId: string) => T | undefined; } export interface PluginModule { plugin_init: (ctx: NapCatPluginContext) => void | Promise; plugin_onmessage?: (ctx: NapCatPluginContext, event: OB11Message) => void | Promise; plugin_onevent?: (ctx: NapCatPluginContext, event: T) => void | Promise; plugin_cleanup?: (ctx: NapCatPluginContext) => void | Promise; plugin_config_schema?: PluginConfigSchema; plugin_config_ui?: PluginConfigSchema; plugin_get_config?: (ctx: NapCatPluginContext) => C | Promise; plugin_set_config?: (ctx: NapCatPluginContext, config: C) => void | Promise; /** * 配置界面控制器 - 当配置界面打开时调用 * 返回清理函数,在界面关闭时调用 */ plugin_config_controller?: (ctx: NapCatPluginContext, ui: PluginConfigUIController, initialConfig: Record) => void | (() => void) | Promise void)>; /** * 响应式字段变化回调 - 当标记为 reactive 的字段值变化时调用 */ plugin_on_config_change?: (ctx: NapCatPluginContext, ui: PluginConfigUIController, key: string, value: unknown, currentConfig: Record) => void | Promise; } export type PluginRuntimeStatus = 'loaded' | 'error' | 'unloaded'; export interface PluginRuntime { /** 运行时状态 */ status: PluginRuntimeStatus; /** 错误信息(当 status 为 'error' 时) */ error?: string; /** 插件模块(当 status 为 'loaded' 时) */ module?: PluginModule; /** 插件上下文(当 status 为 'loaded' 时) */ context?: NapCatPluginContext; } export interface PluginEntry { /** 插件 ID(包名或目录名) */ id: string; /** 文件系统目录名 */ fileId: string; /** 显示名称 */ name?: string; /** 版本号 */ version?: string; /** 描述 */ description?: string; /** 作者 */ author?: string; /** 插件目录路径 */ pluginPath: string; /** 入口文件路径 */ entryPath?: string; /** package.json 内容 */ packageJson?: PluginPackageJson; /** 是否启用(用户配置) */ enable: boolean; /** 运行时是否已加载 */ loaded: boolean; /** 运行时信息 */ runtime: PluginRuntime; } export interface PluginStatusConfig { [key: string]: boolean; }