import { Message } from './CQHelper';
import { HttpPlugin } from './HttpPlugin';
import { HistoryMessage } from './Session';
declare type OrPromise<T> = T | Promise<T>;
export declare enum Scope {
    user = "user",
    group = "group",
    both = "both"
}
export declare enum TriggerType {
    at = "at",
    noAt = "noAt",
    both = "both"
}
export declare enum TriggerScope {
    'all' = 7,
    'owner' = 4,
    'admin' = 2,
    'member' = 1
}
export declare enum MessageFromType {
    'userFriend' = "userFriend",
    'userGroup' = "userGroup",
    'userOther' = "userOther",
    'qqGroupNormal' = "qqGroupNormal",
    'qqGroupAnonymous' = "qqGroupAnonymous",
    'unknown' = "unknown"
}
export interface RequestIdentity {
    robot: number;
    messageFromType: MessageFromType;
    fromUser: number | AnonymousUser;
    fromGroup: number | undefined;
}
export interface AnonymousUser {
    id: number;
    name: string;
    flag: string;
}
export interface UserMessageInfo extends RequestIdentity {
    messageFromType: MessageFromType.userFriend | MessageFromType.userGroup | MessageFromType.userOther;
    fromUser: number;
    fromGroup: undefined;
}
export interface QQGroupNormalMessageInfo extends RequestIdentity {
    messageFromType: MessageFromType.qqGroupNormal;
    fromUser: number;
    fromGroup: number;
}
export interface QQGroupAnonymousMessageInfo extends RequestIdentity {
    messageFromType: MessageFromType.qqGroupAnonymous;
    fromUser: AnonymousUser;
    fromGroup: number;
}
interface BaseParams {
    message: Message[];
    rawMessage: string;
    requestBody: any;
}
declare type SetNextFn = (sessionFunctionName: string, expireSeconds?: number) => Promise<void>;
declare type SetEndFn = () => Promise<void>;
export interface ParseParams extends BaseParams, RequestIdentity {
}
export declare type ParseReturn = any;
interface HandlerBaseParams extends BaseParams {
    setNext: SetNextFn;
}
export interface UserHandlerParams<D = unknown> extends HandlerBaseParams, UserMessageInfo {
    data: D;
}
interface GroupHandlerBaseParams<D = unknown> extends HandlerBaseParams {
    isAt: boolean;
    data: D;
}
export declare type GroupHandlerParams<D = unknown> = GroupHandlerBaseParams<D> & (QQGroupAnonymousMessageInfo | QQGroupNormalMessageInfo);
export interface BothHandlerParams<D = unknown> extends HandlerBaseParams, RequestIdentity {
    data: D;
}
export interface SessionHandlerParams extends HandlerBaseParams {
    setEnd: SetEndFn;
    historyMessage: HistoryMessage;
}
export declare type HandlerReturn = {
    atSender: boolean;
    content: string;
} | string[] | string | void;
export declare type UserHandlerReturn = HandlerReturn;
export declare type GroupHandlerReturn = HandlerReturn;
export declare type BothHandlerReturn = HandlerReturn;
export declare type SessionHandlerReturn = HandlerReturn;
export declare abstract class Command<C = unknown, D = unknown> {
    static blackList: string[];
    scope: Scope;
    directives: string[];
    context: C;
    httpPlugin: HttpPlugin;
    includeGroup?: number[];
    excludeGroup?: number[];
    includeUser?: number[];
    excludeUser?: number[];
    triggerType?: TriggerType;
    triggerScope?: TriggerScope;
    constructor();
    static validate(cmd: Command): void;
    directive?(): string[];
    parse?(params: ParseParams): OrPromise<ParseReturn>;
    user?(params: UserHandlerParams<D>): OrPromise<HandlerReturn>;
    group?(params: GroupHandlerParams<D>): OrPromise<HandlerReturn>;
    both?(params: BothHandlerParams<D>): OrPromise<HandlerReturn>;
}
export declare function include(include: number[]): (proto: any, name: any, descriptor: any) => void;
export declare function exclude(exclude: number[]): (proto: any, name: any, descriptor: any) => void;
export declare function trigger(type: TriggerType): (proto: any, name: any, descriptor: any) => void;
export declare function scope(role: TriggerScope): (proto: any, name: any, descriptor: any) => void;
declare type HandlerParams = UserHandlerParams | GroupHandlerParams | BothHandlerParams;
export declare function fromUserMessage(p: HandlerParams): p is UserHandlerParams;
export declare function fromQQGroupMessage(p: HandlerParams): p is GroupHandlerBaseParams & (QQGroupNormalMessageInfo | QQGroupAnonymousMessageInfo);
export declare function fromQQGroupNormalMessage(p: HandlerParams): p is GroupHandlerBaseParams & QQGroupNormalMessageInfo;
export declare function fromQQGroupAnonymousMessage(p: HandlerParams): p is GroupHandlerBaseParams & QQGroupAnonymousMessageInfo;
export {};
