/** * 模块基类 * 所有功能模块都应继承此类 */ import { Command, Context, Session } from 'koishi'; import type { DataManager } from '../data'; import type { Config } from '../../types'; /** 模块元信息 */ export interface ModuleMeta { /** 模块名称 */ name: string; /** 模块描述 */ description: string; /** 模块版本 */ version?: string; /** 模块作者 */ author?: string; } /** 命令定义选项 */ export interface CommandDef { /** 命令名称(不包含模块前缀) */ name: string; /** 命令描述 */ desc: string; /** 参数定义(如 ' [count:number]')*/ args?: string; /** 权限节点名称(默认使用命令名) */ permNode?: string; /** 权限节点描述(默认使用命令描述) */ permDesc?: string; /** 跳过权限检查(默认 false) */ skipAuth?: boolean; /** 使用方法说明(用于动态生成帮助) */ usage?: string; /** 命令示例 */ examples?: string[]; } /** 模块状态 */ export type ModuleState = 'unloaded' | 'loading' | 'loaded' | 'error'; export declare abstract class BaseModule { protected ctx: Context; protected data: DataManager; private _config; /** 模块元信息 */ abstract readonly meta: ModuleMeta; /** 模块状态 */ protected _state: ModuleState; /** 错误信息 */ protected _error: Error | null; constructor(ctx: Context, data: DataManager, _config: Config); /** * 获取配置(动态获取,支持实时更新) * 模块应通过此 getter 访问配置,而非直接使用 _config */ protected get config(): Config; /** 获取模块状态 */ get state(): ModuleState; /** 获取错误信息 */ get error(): Error | null; /** * 初始化模块 * 子类应重写此方法来注册命令、中间件等 */ init(): Promise; /** * 子类实现的初始化逻辑 */ protected abstract onInit(): Promise; /** * 销毁模块 */ dispose(): Promise; /** * 子类实现的销毁逻辑 */ protected onDispose(): Promise; /** * 获取群配置 */ protected getGroupConfig(guildId: string): import("../../types").GroupConfig; /** * 记录日志并推送订阅 */ protected log(session: Session, command: string, target: string, result: string, success?: boolean): Promise; /** * 注册命令并自动绑定权限节点 * @param def 命令定义 * @returns Koishi Command 对象,可继续链式调用 * * 权限节点命名规则:{模块名}.{命令名} * 例如:warn 模块的 add 命令 → warn.add */ protected registerCommand(def: CommandDef): Command; /** * 注册权限节点(不绑定命令) * 用于注册非命令类权限,如 WebUI 操作权限 */ protected registerPermission(id: string, name: string, description: string): void; protected logCommand(session: any, command: string, target: string, result: string, success?: boolean): void; }