import { CommandAttributes, CommandClient } from '../commandclient';
import { CommandRatelimit, CommandRatelimitItem, CommandRatelimitOptions } from '../commandratelimit';
import { Message } from '../structures/message';
import { ArgumentOptions, Argument, ArgumentDefault, ArgumentType } from './argument';
import { ArgumentParser, ParsedArgs, ParsedErrors } from './argumentparser';
import { Context } from './context';
export declare type CommandRatelimitInfo = {
    item: CommandRatelimitItem;
    ratelimit: CommandRatelimit;
    remaining: number;
};
export declare type CommandRatelimitMetadata = {
    global: boolean;
    now: number;
};
export declare type FailedPermissions = Array<bigint>;
/**
 * @category Command
 */
export declare type CommandCallbackDmBlocked = (context: Context) => Promise<any | Message> | any | Message;
/**
 * @category Command
 */
export declare type CommandCallbackBefore = (context: Context) => Promise<boolean> | boolean;
/**
 * @category Command
 */
export declare type CommandCallbackBeforeRun = (context: Context, args: ParsedArgs) => Promise<boolean> | boolean;
/**
 * @category Command
 */
export declare type CommandCallbackCancel = (context: Context) => Promise<any | Message> | any | Message;
/**
 * @category Command
 */
export declare type CommandCallbackCancelRun = (context: Context, args: ParsedArgs) => Promise<any | Message> | any | Message;
/**
 * @category Command
 */
export declare type CommandCallbackError = (context: Context, args: ParsedArgs, error: any) => Promise<any> | any;
/**
 * @category Command
 */
export declare type CommandCallbackPermissionsFail = (context: Context, permissions: FailedPermissions) => Promise<any | Message> | any | Message;
/**
 * @category Command
 */
export declare type CommandCallbackSuccess = (context: Context, args: ParsedArgs) => Promise<any> | any;
/**
 * @category Command
 */
export declare type CommandCallbackRatelimit = (context: Context, ratelimits: Array<CommandRatelimitInfo>, metadata: CommandRatelimitMetadata) => Promise<any | Message> | any | Message;
/**
 * @category Command
 */
export declare type CommandCallbackRun = (context: Context, args: ParsedArgs) => Promise<any | Message> | any | Message;
/**
 * @category Command
 */
export declare type CommandCallbackRunError = (context: Context, args: ParsedArgs, error: any) => Promise<any> | any;
/**
 * @category Command
 */
export declare type CommandCallbackTypeError = (context: Context, args: ParsedArgs, errors: ParsedErrors) => Promise<any | Message> | any | Message;
/**
 * Command Options
 * @category Command Options
 */
export interface CommandOptions extends ArgumentOptions {
    _file?: string;
    args?: Array<ArgumentOptions>;
    disableDm?: boolean;
    disableDmReply?: boolean;
    metadata?: Record<string, any>;
    name: string;
    permissions?: Array<bigint | number>;
    permissionsClient?: Array<bigint | number>;
    permissionsIgnoreClientOwner?: boolean;
    priority?: number;
    ratelimit?: boolean | CommandRatelimitOptions | null;
    ratelimits?: Array<CommandRatelimitOptions>;
    responseOptional?: boolean;
    triggerTypingAfter?: number;
    onDmBlocked?: CommandCallbackDmBlocked;
    onBefore?: CommandCallbackBefore;
    onBeforeRun?: CommandCallbackBeforeRun;
    onCancel?: CommandCallbackCancel;
    onCancelRun?: CommandCallbackCancelRun;
    onError?: CommandCallbackError;
    onPermissionsFail?: CommandCallbackPermissionsFail;
    onPermissionsFailClient?: CommandCallbackPermissionsFail;
    onRatelimit?: CommandCallbackRatelimit;
    run?: CommandCallbackRun;
    onRunError?: CommandCallbackRunError;
    onSuccess?: CommandCallbackSuccess;
    onTypeError?: CommandCallbackTypeError;
}
/**
 * Command itself
 * Command flow is ratelimit check -> dm/permission check -> `onBefore` -> arg parse -> `onBeforeRun` -> `run` -> `onSuccess | onRunError`
 * @category Command
 */
export declare class Command<ParsedArgsFinished = ParsedArgs> {
    readonly _file?: string;
    readonly argParser: ArgumentParser;
    readonly commandClient: CommandClient;
    arg: Argument;
    disableDm: boolean;
    disableDmReply: boolean;
    metadata: Record<string, any>;
    permissions?: Array<bigint>;
    permissionsClient?: Array<bigint>;
    permissionsIgnoreClientOwner?: boolean;
    priority: number;
    ratelimits: Array<CommandRatelimit>;
    responseOptional: boolean;
    triggerTypingAfter: number;
    onDmBlocked?(context: Context): Promise<any | Message> | any | Message;
    onBefore?(context: Context): Promise<boolean> | boolean;
    onBeforeRun?(context: Context, args: ParsedArgs): Promise<boolean> | boolean;
    onCancel?(context: Context): Promise<any | Message> | any | Message;
    onCancelRun?(context: Context, args: ParsedArgs): Promise<any | Message> | any | Message;
    onError?(context: Context, args: ParsedArgs, error: any): Promise<any> | any;
    onPermissionsFail?(context: Context, permissions: FailedPermissions): Promise<any | Message> | any | Message;
    onPermissionsFailClient?(context: Context, permissions: FailedPermissions): Promise<any | Message> | any | Message;
    onRatelimit?(context: Context, ratelimits: Array<CommandRatelimitInfo>, metadata: CommandRatelimitMetadata): Promise<any | Message> | any | Message;
    run?(context: Context, args: ParsedArgsFinished): Promise<any | Message> | any | Message;
    onRunError?(context: Context, args: ParsedArgsFinished, error: any): Promise<any | Message> | any | Message;
    onSuccess?(context: Context, args: ParsedArgsFinished): Promise<any> | any;
    onTypeError?(context: Context, args: ParsedArgs, errors: ParsedErrors): Promise<any | Message> | any | Message;
    constructor(commandClient: CommandClient, options: CommandOptions);
    get aliases(): Array<string>;
    set aliases(value: Array<string>);
    set args(value: Array<ArgumentOptions>);
    get choices(): Array<any> | undefined;
    set choices(value: Array<any> | undefined);
    get default(): ArgumentDefault;
    set default(value: ArgumentDefault);
    get fullName(): string;
    get help(): string;
    set help(value: string);
    get label(): string;
    set label(value: string);
    get name(): string;
    set name(value: string);
    get names(): string[];
    set prefixes(value: Array<string>);
    set type(value: ArgumentType);
    setAliases(value: Array<string>): this;
    setArgs(value: Array<ArgumentOptions>): this;
    setChoices(value: Array<any> | undefined): this;
    setDefault(value: ArgumentDefault): this;
    setHelp(value: string): this;
    setLabel(value: string): this;
    setName(value: string): this;
    setPrefixes(value: Array<string>): this;
    setType(value: ArgumentType): this;
    check(name: string): boolean;
    getArgs(attributes: CommandAttributes, context: Context): Promise<{
        errors: ParsedErrors;
        parsed: ParsedArgs;
    }>;
    getName(content: string): null | string;
}
