/// <reference types="node" />
import EventEmitter from 'events';
import { Logger } from 'log4js';
import { Chat } from './chat';
import { ConfigMeta, UserConfigs } from './config';
import { MessageChain } from './message';
/** pie消息过滤器类型 */
export declare type PieFilterBuilder = (...args: any[]) => PieFilter;
/** pie消息过滤器 */
export declare class PieFilter {
    /** 消息包含@我 */
    static atMe: PieFilter;
    /** 消息包含@全体成员 */
    static atAll: PieFilter;
    /** 消息来自好友 */
    static fromFriend: PieFilter;
    /** 消息来自群聊 */
    static fromGroup: PieFilter;
    /** 消息来自群成员 */
    static fromMember: PieFilter;
    /** 过滤器签名, 通常要能表达过滤器的意图 */
    sign: string;
    /**
     * 过滤器的验证器
     * @param chat 当前聊天窗口
     * @param chain 当前消息链
     * @param pie 当前pie对象
     */
    handler: (chat: Chat, chain: MessageChain, pie: Pie) => boolean;
    /**
     * 消息包含@指定QQ号群成员
     * @param id 群成员QQ号
     */
    static at: PieFilterBuilder;
    /**
     * 消息来自指定账号
     * @param id QQ号或群号
     */
    static from: PieFilterBuilder;
    /**
     * 消息不来自指定账号
     * @param id QQ号或群号
     */
    static notFrom: PieFilterBuilder;
    /**
     * 消息包含单一消息类型
     * @param type 单一消息类型
     */
    static containsType: PieFilterBuilder;
    /**
     * 消息显示串匹配正则表达式
     * @param regexp 正则表达式
     */
    static displayStringMatch: PieFilterBuilder;
    /**
     * 消息显示串和指定串全等
     * @param displayString 指定字符串
     */
    static displayStringEquals: PieFilterBuilder;
    /**
     * 多个消息过滤器求<strong>或</strong>
     * @param filters 消息过滤器
     */
    static or: PieFilterBuilder;
}
declare type PieMethodOptions<PieInstance> = {
    [key: string]: (this: PieInstance, ...args: any) => any;
};
declare type MessageReceivedListener<PieInstance> = (this: PieInstance, chat: Chat, chain: MessageChain) => any;
declare type LifecycleHookListener<PieInstance> = (this: PieInstance) => any;
declare type PieHookOptions<PieInstance> = {
    /**
     * pie消息监听器, 用以监听消息并处理
     * @param chat 当前聊天窗
     * @param chain 消息链
     * @example
     * // 复读机
     * async received(chat, chain) => {
     *     await chat.send(chain);
     * }
     */
    received?: MessageReceivedListener<PieInstance>;
    /** pie安装完成hook */
    installed?: LifecycleHookListener<PieInstance>;
    /** pie卸载完成hook */
    uninstalled?: LifecycleHookListener<PieInstance>;
    /** pie启用hook */
    enabled?: LifecycleHookListener<PieInstance>;
    /** pie禁用hook */
    disabled?: LifecycleHookListener<PieInstance>;
};
declare type PieOptions<C extends ConfigMeta, D extends object, M extends PieMethodOptions<Pie<C, D, M>>> = {
    /** id(必须为合法标识符) */
    id: string;
    /** 名称 */
    name: string;
    /** 作者 */
    author: string;
    /** 版本号 */
    version: string;
    /** 描述 */
    description?: string;
    /** 作者链接 */
    authorUrl?: string;
    /** 项目链接 */
    projectUrl?: string;
    /**
     * pie用户配置元声明, 用以标识用户配置项
     * @example
     * userConfigMeta: {
     *     base: {
     *         type: Number,
     *         description: '累加器初始值',
     *         default: 0
     *     },
     *     step: {
     *         type: Number,
     *         description: '累加器步长'
     *     }
     * }
     */
    configMeta?: C;
    /** pie中数据 */
    data?: D;
    /**
     * pie中方法, 生成pie实例时会自动挂载到实例上
     * @example
     * methods: {
     *     greet() {
     *         return 'Hello ' + this.author;
     *     }
     * }
     *
     * // "Hello Nepsyn"
     * pie.greet();
     */
    methods?: M;
    /**
     * pie消息过滤器, 用以在执行pie处理器前过滤掉不需要的消息, 多个过滤器求<strong>与</strong>, 为true则执行messageHandler
     * @example
     * filters: [PieFilter.atMe]  // 只响应@我的消息
     * filters: [PieFilter.atMe, PieFilter.atAll]  // 同时响应@我和@全体成员的消息
     * filters: [PieFilter.or(PieFilter.atMe, PieFilter.atAll)]  // 只响应@我或@全体成员的消息
     *
     * // 自行构造过滤器
     * const myFilter = {
     *     sign: 'LuckyTest',
     *     handler: () => Math.random() > 0.1
     * }
     */
    filters?: PieFilter[];
} & PieHookOptions<Pie<C, D, M>> & ThisType<Pie<C, D, M>>;
export declare type Pie<C extends ConfigMeta = {}, D extends object = object, M extends PieMethodOptions<Pie<C, D, M>> = {}> = {
    /** id */
    readonly id: string;
    /** 名称 */
    readonly name: string;
    /** 作者 */
    readonly author: string;
    /** 版本号 */
    readonly version: string;
    /** 描述 */
    description: string;
    /** 作者链接 */
    authorUrl: string;
    /** 项目链接 */
    projectUrl: string;
    /** 配置元定义 */
    readonly configMeta: C;
    /** 用户配置 */
    configs: UserConfigs<C>;
    /** pie 过滤器 */
    filters: PieFilter[];
    /** logger */
    logger: Logger;
    /** 是否为 pie 标识, 恒为 true */
    readonly __isPie: true;
    addListener(e: 'received', listener: MessageReceivedListener<Pie<C, D, M>>): any;
    addListener(e: 'installed', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    addListener(e: 'uninstalled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    addListener(e: 'enabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    addListener(e: 'disabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    once(e: 'received', listener: MessageReceivedListener<Pie<C, D, M>>): any;
    once(e: 'installed', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    once(e: 'uninstalled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    once(e: 'enabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    once(e: 'disabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    on(e: 'received', listener: MessageReceivedListener<Pie<C, D, M>>): any;
    on(e: 'installed', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    on(e: 'uninstalled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    on(e: 'enabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    on(e: 'disabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependListener(e: 'received', listener: MessageReceivedListener<Pie<C, D, M>>): any;
    prependListener(e: 'installed', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependListener(e: 'uninstalled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependListener(e: 'enabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependListener(e: 'disabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependOnceListener(e: 'received', listener: MessageReceivedListener<Pie<C, D, M>>): any;
    prependOnceListener(e: 'installed', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependOnceListener(e: 'uninstalled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependOnceListener(e: 'enabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    prependOnceListener(e: 'disabled', listener: LifecycleHookListener<Pie<C, D, M>>): any;
    emit(e: 'received', chat: Chat, chain: MessageChain): any;
    emit(e: 'installed'): any;
    emit(e: 'uninstalled'): any;
    emit(e: 'enabled'): any;
    emit(e: 'disabled'): any;
    listeners(e: 'received'): MessageReceivedListener<Pie<C, D, M>>[];
    listeners(e: 'installed'): LifecycleHookListener<Pie<C, D, M>>[];
    listeners(e: 'uninstalled'): LifecycleHookListener<Pie<C, D, M>>[];
    listeners(e: 'enabled'): LifecycleHookListener<Pie<C, D, M>>[];
    listeners(e: 'disabled'): LifecycleHookListener<Pie<C, D, M>>[];
} & D & M & EventEmitter;
/**
 * 创建 pie
 * @param options pie 选项
 */
export declare function makePie<C extends ConfigMeta, D extends object, M extends PieMethodOptions<Pie<C, D, M>>>(options: PieOptions<C, D, M>): Pie<C, D, M>;
export {};
//# sourceMappingURL=pie.d.ts.map