Files
NapCatQQ/.pnpm-store/v3/files/a0/62577e5b942929535aa171c3b6ac6de9101d40f9bcd5d3103a82caa328320af8d2973c2125f4e923b1625105c31687efe71aa220f5150137732223d11d4b63
TanTan e311ca3275
Build NapCat Artifacts / Windows Loader Test (push) Canceled after 0s
Build NapCat Artifacts / Type Check & Test (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Framework (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Shell (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

314 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<string, string | string[] | undefined>;
/** 请求体 */
body: unknown;
/** 请求头 */
headers: Record<string, string | string[] | undefined>;
/** 路由参数 */
params: Record<string, string>;
/** 原始请求对象(用于高级用法) */
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<void>;
/** 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<string | Buffer>;
/** 内存静态文件定义 */
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<void>;
loadPluginById(pluginId: string): Promise<boolean>;
unregisterPlugin(pluginId: string): Promise<void>;
uninstallPlugin(pluginId: string, cleanData?: boolean): Promise<void>;
reloadPlugin(pluginId: string): Promise<boolean>;
loadDirectoryPlugin(dirname: string): Promise<void>;
getPluginDataPath(pluginId: string): string;
getPluginConfigPath(pluginId: string): string;
}
/** 插件配置 UI 控制器 - 用于动态控制配置界面 */
export interface PluginConfigUIController {
/** 更新整个 schema */
updateSchema: (schema: PluginConfigSchema) => void;
/** 更新单个字段 */
updateField: (key: string, field: Partial<PluginConfigItem>) => void;
/** 移除字段 */
removeField: (key: string) => void;
/** 添加字段 */
addField: (field: PluginConfigItem, afterKey?: string) => void;
/** 显示字段 */
showField: (key: string) => void;
/** 隐藏字段 */
hideField: (key: string) => void;
/** 获取当前配置值 */
getCurrentConfig: () => Record<string, unknown>;
}
/**
* 插件日志接口 - 简化的日志 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: <T = PluginModule>(pluginId: string) => T | undefined;
}
export interface PluginModule<T extends OB11EmitEventContent = OB11EmitEventContent, C = unknown> {
plugin_init: (ctx: NapCatPluginContext) => void | Promise<void>;
plugin_onmessage?: (ctx: NapCatPluginContext, event: OB11Message) => void | Promise<void>;
plugin_onevent?: (ctx: NapCatPluginContext, event: T) => void | Promise<void>;
plugin_cleanup?: (ctx: NapCatPluginContext) => void | Promise<void>;
plugin_config_schema?: PluginConfigSchema;
plugin_config_ui?: PluginConfigSchema;
plugin_get_config?: (ctx: NapCatPluginContext) => C | Promise<C>;
plugin_set_config?: (ctx: NapCatPluginContext, config: C) => void | Promise<void>;
/**
* 配置界面控制器 - 当配置界面打开时调用
* 返回清理函数,在界面关闭时调用
*/
plugin_config_controller?: (ctx: NapCatPluginContext, ui: PluginConfigUIController, initialConfig: Record<string, unknown>) => void | (() => void) | Promise<void | (() => void)>;
/**
* 响应式字段变化回调 - 当标记为 reactive 的字段值变化时调用
*/
plugin_on_config_change?: (ctx: NapCatPluginContext, ui: PluginConfigUIController, key: string, value: unknown, currentConfig: Record<string, unknown>) => void | Promise<void>;
}
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;
}