Skip to content

NapCat Types 定义参考

字数
1195 字
阅读时间
7 分钟

本文档列出了开发插件时最常用的类型定义。完整的类型定义请参考 napcat-types 源码。

注意

随着 napcat-types 的更新,部分内容可能已过时,本文仅供参考。请以 napcat-types 最新源码为准。

插件上下文

typescript
export interface NapCatPluginContext {
    core: NapCatCore;
    oneBot: NapCatOneBot11Adapter;
    actions: ActionMap;
    pluginName: string;
    pluginPath: string;
    configPath: string;
    dataPath: string;
    NapCatConfig: NapCatConfigClass;
    adapterName: string;
    pluginManager: IPluginManager;
    logger: PluginLogger;
    router: PluginRouterRegistry;
    getPluginExports: <T = PluginModule>(pluginId: string) => T | undefined;
}

插件模块定义

typescript
export interface PluginModule<T extends OB11EmitEventContent = OB11EmitEventContent, C = unknown> {
    // 必选:插件初始化
    plugin_init: (ctx: NapCatPluginContext) => void | Promise<void>;
    // 可选:消息/事件处理(需通过 event.post_type 判断事件类型)
    plugin_onmessage?: (ctx: NapCatPluginContext, event: OB11Message) => void | Promise<void>;
    // 可选:事件处理(非消息类 OneBot 事件)
    plugin_onevent?: (ctx: NapCatPluginContext, event: T) => void | Promise<void>;
    // 可选:插件卸载/清理
    plugin_cleanup?: (ctx: NapCatPluginContext) => void | Promise<void>;
    // 可选:配置 Schema(用于 WebUI 自动生成配置面板)
    plugin_config_schema?: PluginConfigSchema;
    // 可选:配置 UI(同 plugin_config_schema)
    plugin_config_ui?: PluginConfigSchema;
    // 可选:自定义配置读取
    plugin_get_config?: (ctx: NapCatPluginContext) => C | Promise<C>;
    // 可选:自定义配置保存
    plugin_set_config?: (ctx: NapCatPluginContext, config: C) => void | Promise<void>;
    // 可选:配置 UI 控制器(运行时动态控制配置界面)
    plugin_config_controller?: (
        ctx: NapCatPluginContext,
        ui: PluginConfigUIController,
        initialConfig: Record<string, unknown>
    ) => void | (() => void) | Promise<void | (() => void)>;
    // 可选:配置变更回调
    plugin_on_config_change?: (
        ctx: NapCatPluginContext,
        ui: PluginConfigUIController,
        key: string,
        value: unknown,
        currentConfig: Record<string, unknown>
    ) => void | Promise<void>;
}

配置 UI 定义

typescript
export type PluginConfigSchema = PluginConfigItem[];

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;
}

配置 UI 控制器

typescript
export interface PluginConfigUIController {
    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>;
}

日志接口

typescript
export interface PluginLogger {
    log(...args: unknown[]): void;
    debug(...args: unknown[]): void;
    info(...args: unknown[]): void;
    warn(...args: unknown[]): void;
    error(...args: unknown[]): void;
}

路由相关类型

typescript
export type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';

export interface PluginRouterRegistry {
    // 需要鉴权
    api(method: HttpMethod, path: string, handler: PluginRequestHandler): void;
    get(path: string, handler: PluginRequestHandler): void;
    post(path: string, handler: PluginRequestHandler): void;
    put(path: string, handler: PluginRequestHandler): void;
    delete(path: string, handler: PluginRequestHandler): void;
    // 无需鉴权
    apiNoAuth(method: HttpMethod, path: string, handler: PluginRequestHandler): void;
    getNoAuth(path: string, handler: PluginRequestHandler): void;
    postNoAuth(path: string, handler: PluginRequestHandler): void;
    putNoAuth(path: string, handler: PluginRequestHandler): void;
    deleteNoAuth(path: string, handler: PluginRequestHandler): void;
    // 页面
    page(page: PluginPageDefinition): void;
    pages(pages: PluginPageDefinition[]): void;
    // 静态文件
    static(urlPath: string, localPath: string): void;
    staticOnMem(urlPath: string, files: MemoryStaticFile[]): void;
}

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;
}

export interface PluginHttpResponse {
    status(code: number): PluginHttpResponse;
    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>;

export interface PluginPageDefinition {
    path: string;        // 页面路径
    title: string;       // 页面标题
    icon?: string;       // 页面图标
    htmlFile: string;    // HTML 文件路径(相对于插件目录)
    description?: string; // 页面描述
}

export type MemoryFileGenerator = () => string | Buffer | Promise<string | Buffer>;

export interface MemoryStaticFile {
    path: string;                                    // 文件路径
    content: string | Buffer | MemoryFileGenerator;  // 文件内容或生成器
    contentType?: string;                            // MIME 类型
}

插件管理器接口

typescript
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;
}

export interface PluginEntry {
    id: string;
    fileId: string;
    name?: string;
    version?: string;
    description?: string;
    author?: string;
    pluginPath: string;
    entryPath?: string;
    packageJson?: PluginPackageJson;
    enable: boolean;
    loaded: boolean;
    runtime: PluginRuntime;
}

export type PluginRuntimeStatus = 'loaded' | 'error' | 'unloaded';

export interface PluginRuntime {
    status: PluginRuntimeStatus;
    error?: string;
    module?: PluginModule;
    context?: NapCatPluginContext;
}

NapCatConfig 构建器

typescript
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;
}

事件类型枚举

typescript
export enum EventType {
    META = "meta_event",
    REQUEST = "request",
    NOTICE = "notice",
    MESSAGE = "message",
    MESSAGE_SENT = "message_sent"
}

plugin_onmessage 中需要通过 event.post_type 判断事件类型:

typescript
if (event.post_type !== EventType.MESSAGE) return;

ActionMap

ActionMap 提供 call 方法调用 OneBot11 Action:

typescript
// call 方法签名
actions.call(
    actionName: string,     // Action 名称
    params: unknown,        // 请求参数,无参数时传 void 0
    adapter: string,        // 适配器名称,使用 ctx.adapterName
    config: NetworkAdapterConfig  // 网络配置,使用 ctx.pluginManager.config
): Promise<any>

消息发送参数

typescript
export interface OB11PostSendMsg {
    message_type?: "private" | "group";  // 消息类型
    user_id?: string;                    // 用户 QQ 号(私聊时)
    group_id?: string;                   // 群号(群聊时)
    message: string | MessageSegment[];  // 消息内容
    auto_escape?: boolean | string;      // 是否作为纯文本发送
}