import type { AllHandlers, Send } from "node-napcat-ts";
import { NCWebsocket, Structs } from "node-napcat-ts";
import axios from "axios";
export { Structs, Send, NCWebsocket, AllHandlers, CyberPluginContext, axios as http };
export declare function getConfig(): Config;
export interface Config {
    napcat: {
        baseUrl: string;
        accessToken: string;
        throwPromise: boolean;
        reconnection: {
            enable: boolean;
            attempts: number;
            delay: number;
        };
        debug: boolean;
    };
    self: {
        uin: number;
        master: Array<number>;
        admins: Array<number>;
        bot_uin: number;
    };
    plugins: {
        system: Array<string>;
        user: Array<string>;
    };
    logger: {
        level: string;
        maxSize: string;
        maxDays: number;
    };
}
export declare const log: any;
export declare class Bot {
    private bot;
    private config;
    private pluginManager;
    private plugins;
    private memoryOptimizationTimer;
    constructor();
    start(): Promise<void>;
    /**
     * 向所有主人发送机器人上线通知
     */
    private sendOnlineNotificationToMasters;
    private setupMemoryOptimization;
    stop(): Promise<void>;
}
export declare function definePlugin(plugin: CyberPlugin): CyberPlugin;
interface PluginInfo {
    version: string;
    description: string;
    type: 'system' | 'user';
    setup: {
        enable: boolean;
        listeners: Array<listener>;
        cron: Array<any>;
    };
}
interface listener {
    event: keyof AllHandlers;
    fn: any;
}
interface pluginUtil {
    getPlugins: () => Map<string, PluginInfo>;
    onPlugin: (pluginName: string) => string;
    offPlugin: (pluginName: string) => string;
    reloadPlugin: (pluginName: string) => Promise<string>;
    getPluginsFromDir: () => string[];
    loadPlugin: (pluginName: string) => Promise<string>;
}
export type ExtendedEvent = {
    reply: (content: string | number | any[] | any, quote?: boolean) => Promise<{
        message_id: number;
    }>;
    kick: (user_id: number, reject_add_request?: boolean) => Promise<void>;
};
export interface BaseMessageEvent {
    raw_message: string;
    message_id: number;
    user_id: number;
    message_type: 'private' | 'group';
    sender: {
        user_id: number;
    };
}
export interface GroupMessageEvent extends BaseMessageEvent {
    message_type: 'group';
    group_id: number;
}
export interface PrivateMessageEvent extends BaseMessageEvent {
    message_type: 'private';
}
export type MessageEvent = GroupMessageEvent | PrivateMessageEvent;
export type CyberMessageEvent = AllHandlers['message'] & ExtendedEvent;
interface CyberPluginContext {
    config: Config;
    /** axios 实例 */
    http: typeof axios;
    bot: NCWebsocket;
    bot_uin: number;
    plugin: pluginUtil;
    /** cron 定时任务
     * @param cronTasks - 定时任务配置
     * 支持两种格式:
     * 1. 单个任务: cron("* * * * * *", () => {})
     * 2. 多个任务数组: cron([
     *      ['* * * * * *', async (ctx, e) => { e.reply("task1") }],
     *      ['0 * * * * *', async (ctx, e) => { e.reply("task2") }]
     *    ])
     */
    cron: (cronTasks: string | Array<[string, (ctx: CyberPluginContext, e: MessageEvent & ExtendedEvent) => any]>, func?: () => any) => any;
    /** 注册事件处理器 */
    handle: <EventName extends keyof AllHandlers>(eventName: EventName, handler: EventName extends "message" | "message.group" | "message.private" ? (e: CyberMessageEvent) => any : (e: AllHandlers[EventName] & ExtendedEvent) => any) => any;
    /** 是否为主人 */
    isMaster: (id: number | {
        sender: {
            user_id: number;
        };
    }) => boolean;
    /** 是否为管理员 */
    isAdmin: (id: number | {
        sender: {
            user_id: number;
        };
    }) => boolean;
    /**
     * 检查用户是否有权限。
     *
     * @param user_id - 用户的ID。
     * @returns 如果用户是管理员或主人，则返回 `true`，否则返回 `false`。
     */
    hasRight: (user_id: number) => boolean;
    /**
     * 发送私聊消息。
     *
     * @param user_id - 目标ID。
     * @param message - 要发送的消息内容，可以是字符串、数字或消息段数组。
     * @returns - 返回发送消息的结果，包含消息ID。
     * @throws - 如果发送消息失败，抛出错误。
     */
    sendPrivateMessage: (user_id: number, message: string | number | Array<any>) => Promise<{
        message_id: number;
    }>;
    /**
     * 发送消息到指定的群组。
     *
     * @param group_id - 目标群组的ID。
     * @param message - 要发送的消息内容，可以是字符串、数字或消息段数组。
     * @returns - 返回发送消息的结果，包含消息ID。
     * @throws - 如果发送消息失败，抛出错误。
     */
    sendGroupMessage: (group_id: number, message: string | number | Array<any>) => Promise<{
        message_id: number;
    }>;
    /**
     * 撤回指定的消息。
     *
     * @param message_id - 要撤回的消息的ID。
     * @throws - 如果撤回消息失败，抛出错误。
     */
    delete_msg: (message_id: number) => Promise<void>;
    /**
     * 将指定用户从群组中踢出。
     *
     * @param group_id - 群ID。
     * @param user_id - 要踢出的用户的ID。
     * @param reject_add_request - 是否拒绝该用户的加群请求。默认值为 `false`。
     * @throws - 如果踢出用户失败，抛出错误。
     */
    kick: (group_id: number, user_id: number, reject_add_request?: boolean) => Promise<void>;
    /**
     * 将指定用户在群组中禁言。
     *
     * @param group_id - 群ID。
     * @param user_id - 要禁言的用户的ID。
     * @param duration - 禁言时长，单位为秒。默认值为 `30` 秒。
     * @throws - 如果禁言用户失败，抛出错误。
     */
    ban: (group_id: number, user_id: number, duration?: number) => Promise<void>;
    /**
     * 设置群组全员禁言状态。
     *
     * @param group_id - 群ID。
     * @param enable - 是否开启全员禁言。默认值为 `false`，即关闭全员禁言。
     * @throws - 如果设置全员禁言状态失败，抛出错误。
     */
    banAll: (group_id: number, enable: boolean) => Promise<void>;
    /**
     * 设置群组名称。
     *
     * @param group_id - 群ID。
     * @param name - 要设置的群组名称。
     * @throws - 如果设置群组名称失败，抛出错误。
     */
    setGroupName: (group_id: number, name: string) => Promise<void>;
    /**
     * 设置群组管理员。
     *
     * @param group_id - 群ID。
     * @param user_id - 要设置或取消管理员权限的用户的ID。
     * @param enable - 是否设置为管理员。默认值为 `true`，即设置为管理员。
     * @throws - 如果设置管理员权限失败，抛出错误。
     */
    setAdmin: (group_id: number, user_id: number, enable: boolean) => Promise<void>;
    /**
     * 设置群组成员的特殊头衔。
     *
     * @param group_id - 群ID。
     * @param user_id - 要设置特殊头衔的用户的ID。
     * @param title - 要设置的特殊头衔。
     * @throws - 如果设置特殊头衔失败，抛出错误。
     */
    setTitle: (group_id: number, user_id: number, title: string) => Promise<void>;
    /**
     * 处理群组加入请求，自动同意请求。
     * @param flag - 从上报消息获取
     * @throws - 如果处理请求失败，抛出错误。
     */
    aprroveGroup: (flag: string) => Promise<void>;
    /**
     * 处理群组加入请求，自动拒绝请求。
     *
     * @param flag - 从上报消息获取
     * @throws - 如果处理请求失败，抛出错误。
     */
    rejectGroup: (flag: string) => Promise<void>;
    /**
     * 检查用户是否是群组管理员或群主。
     *
     * @param group_id - 群ID。
     * @param user_id - 用户的ID。
     * @returns 如果用户是群组管理员或群主，则返回 `true`，否则返回 `false`。
     * @throws - 如果获取群组成员信息失败，抛出错误。
     */
    isGroupAdmin: (group_id: number, user_id: number) => Promise<boolean>;
    /**
     * 检查用户是否是群组群主。
     *
     * @param group_id - 群ID。
     * @param user_id - 用户的ID。
     * @returns 如果用户是群组群主，则返回 `true`，否则返回 `false`。
     * @throws - 如果获取群组成员信息失败，抛出错误。
     */
    isGroupOwner: (group_id: number, user_id: number) => Promise<boolean>;
    /**
     * MD5 加密
     * @param {string} text 待 MD5 加密数据
     * @return {string} MD5 加密后的 hex 字符串
     */
    md5: (text: string) => string;
    /**
     * 生成随机整数
     * @param {number} min 最小值
     * @param {number} max 最大值
     * @return {number} 随机范围内的整数
     */
    randomInt: (min: number, max: number) => number;
    /**
     * 取数组内随机一项
     * @param {Array<T>} array 待操作数组
     * @return {T} 数组内的随机一项
     */
    randomItem: <T>(array: T[]) => T;
    /**
     * 获取群组头像链接
     * @param group_id 群组ID
     * @param size 头像大小，可选值为40、64、100、200
     * @return 群组头像链接
     */
    getGroupAvatarLink: (group_id: number, size?: number) => string;
    /**
     * 获取QQ头像链接
     * @param user_id QQ号
     * @param size 头像大小，可选值为40、64、100、200
     * @return QQ头像链接
     */
    getQQAvatarLink: (user_id: number, size?: number) => string;
    /**
     * 获取图片链接
     * @param raw_message 原始消息
     * @return 图片链接
     */
    getImageLink: (raw_message: string) => string;
    /**
     * 替换 URL 中的 rkey 参数, 获取直链
     * @param url - 原始 URL
     * @returns 替换 rkey 后的新 URL
     */
    getDirectLink: (url: string) => Promise<string>;
    /**
     * 从消息内容中提取回复消息的ID。
     * 该方法使用正则表达式从传入的 `raw_message` 中提取 `[CQ:reply,id=...]` 格式的回复消息ID。
     * 如果找到回复消息ID，则返回该ID；否则，返回空字符串。
     *
     * @param raw_message - 包含回复消息信息的原始消息字符串。
     * @returns 提取的回复消息ID字符串，如果未找到则返回空字符串。
     * @throws 如果在提取过程中发生错误，记录错误日志并返回空字符串。
     */
    getMessageId: (raw_message: string) => string;
    /**
     * 从消息内容中提取 @ 消息的 ID。
     * 该方法使用正则表达式从传入的 `raw_message` 中提取 `[CQ:at,qq=...]` 格式的 @ 消息ID。
     * 如果找到 @ 消息ID，则返回该ID；否则，返回空字符串。
     *
     * @param raw_message - 包含 @ 消息信息的原始消息字符串。
     * @returns 提取的 @ 消息ID字符串，如果未找到则返回空字符串。
     * @throws 如果在提取过程中发生错误，记录错误日志并返回空字符串。
     */
    getMessageAt: (raw_message: string) => number[];
    /**
     * 从消息内容中提取纯文本内容。
     * 该方法使用正则表达式从传入的 `raw_message` 中移除所有的 CQ 码，并返回剩余的纯文本内容。
     *
     * @param raw_message - 包含 CQ 码的原始消息字符串。
     * @returns 提取的纯文本内容字符串。
     * @throws 如果在提取过程中发生错误，记录错误日志并抛出错误。
     */
    getText: (raw_message: string) => string;
    /**
     * 发送伪造消息。
     *
     * @param target_id - 目标用户的ID（如果是私聊）或群组的ID（如果是群聊）。
     * @param message - 要发送的消息内容，格式为 `Send['node'][]`。
     * @param isGroup - 是否发送到群组。默认值为 `true`。
     * @returns - 返回发送消息的结果，包含消息ID和资源ID。
     * @throws - 如果发送消息失败，抛出错误。
     */
    fakeMessage: (target_id: number, message: Send['node'][], isGroup: boolean) => Promise<{
        message_id: number;
        res_id: string;
    }>;
    /** 工具函数 */
    utils: {
        /** 为事件对象添加reply方法 */
        addReplyMethod: <T extends any>(e: T) => T & ExtendedEvent;
    };
}
interface CyberPlugin {
    /** 插件 ID */
    name: string;
    /** 插件版本 */
    version?: string;
    /** 插件描述 */
    description?: string;
    /** 插件初始化，可返回一个函数用于清理 */
    setup?: (ctx: CyberPluginContext) => any;
}
export declare class PluginManager {
    plugins: Map<string, PluginInfo>;
    bot: NCWebsocket;
    private pluginCtxProxies;
    private sharedMethodWrappers;
    private pluginErrorHandlers;
    ctx: CyberPluginContext;
    private tempListener;
    private tempCronJob;
    private jiti;
    private cronTaskPool;
    private gcIntervalId;
    constructor(bot: NCWebsocket, config: Config);
    private createPluginContextProxy;
    init(): Promise<Map<string, PluginInfo>>;
    getPluginsFromDir(): string[];
    loadPlugin(pluginName: string): Promise<any>;
    getPlugins(): Map<string, PluginInfo>;
    /**
     * 保存配置到文件
     * @param pluginName 插件名称
     * @param isEnabled 是否启用
     * @private
     */
    private saveConfig;
    offPlugin(pluginName: string): string;
    onPlugin(pluginName: string): string;
    reloadPlugin(pluginName: string): Promise<any>;
    private cleanPluginModuleCache;
    optimizeMemory(): void;
    /**
     * 释放插件相关的所有资源
     * @param pluginName 插件名称
     */
    private releasePluginResources;
    /**
     * 释放插件的所有定时任务
     * @param pluginName 插件名称
     */
    private releasePluginCronTasks;
    /**
     * 开始定期内存优化
     * @param intervalMinutes 间隔分钟数，默认30分钟
     */
    startPeriodicMemoryOptimization(intervalMinutes?: number): void;
    /**
     * 停止定期内存优化
     */
    stopPeriodicMemoryOptimization(): void;
}
declare global {
    namespace NodeJS {
        interface Global {
            gc?: () => void;
        }
    }
}
//# sourceMappingURL=index.d.ts.map