import _ from "lodash";
import Chan from "./models/chan";
import Msg, { MessageType, UserInMessage } from "./models/msg";
import SqliteMessageStorage from "./plugins/messageStorage/sqlite";
import Network, { NetworkWithIrcFramework } from "./models/network";
import ClientManager from "./clientManager";
import { MessageStorage, SearchQuery } from "./plugins/messageStorage/types";
declare type OrderItem = Chan["id"] | Network["uuid"];
declare type Order = OrderItem[];
declare type ClientPushSubscription = {
    endpoint: string;
    keys: {
        p256dh: string;
        auth: string;
    };
};
export declare type UserConfig = {
    log: boolean;
    password: string;
    sessions: {
        [token: string]: {
            lastUse: number;
            ip: string;
            agent: string;
            pushSubscription?: ClientPushSubscription;
        };
    };
    clientSettings: {
        [key: string]: any;
    };
    browser?: {
        language?: string;
        ip?: string;
        hostname?: string;
        isSecure?: boolean;
    };
};
export declare type Mention = {
    chanId: number;
    msgId: number;
    type: MessageType;
    time: Date;
    text: string;
    from: UserInMessage;
};
declare class Client {
    awayMessage: string;
    lastActiveChannel: number;
    attachedClients: {
        [socketId: string]: {
            token: string;
            openChannel: number;
        };
    };
    config: UserConfig & {
        networks?: Network[];
    };
    id: number;
    idMsg: number;
    idChan: number;
    name: string;
    networks: Network[];
    mentions: Mention[];
    manager: ClientManager;
    messageStorage: MessageStorage[];
    highlightRegex: RegExp | null;
    highlightExceptionRegex: RegExp | null;
    messageProvider?: SqliteMessageStorage;
    fileHash: string;
    constructor(manager: ClientManager, name?: string, config?: UserConfig);
    createChannel(attr: Partial<Chan>): Chan;
    emit(event: string, data?: any): void;
    find(channelId: number): false | {
        network: Network;
        chan: Chan;
    };
    connect(args: Record<string, any>, isStartup?: boolean): void;
    generateToken(callback: (token: string) => void): void;
    calculateTokenHash(token: string): string;
    updateSession(token: string, ip: string, request: any): void;
    setPassword(hash: string, callback: (success: boolean) => void): void;
    input(data: any): void;
    inputLine(data: any): void;
    compileCustomHighlights(): void;
    more(data: any): {
        chan: number;
        messages: Msg[];
        totalMessages: number;
    } | null;
    clearHistory(data: any): void;
    search(query: SearchQuery): Promise<Omit<SearchQuery, "channelName" | "offset"> & {
        results: Message[];
        target: string;
        offset: number;
    }>;
    open(socketId: string, target: number): void;
    sort(data: {
        order: Order;
        type: "networks" | "channels";
        target: string;
    }): void;
    names(data: {
        target: number;
    }): void;
    part(network: Network, chan: Chan): void;
    quit(signOut?: boolean): void;
    clientAttach(socketId: string, token: string): void;
    clientDetach(socketId: string): void;
    registerPushSubscription(session: any, subscription: ClientPushSubscription, noSave?: boolean): {
        endpoint: string;
        keys: {
            p256dh: string;
            auth: string;
        };
    } | undefined;
    unregisterPushSubscription(token: string): void;
    save: _.DebouncedFunc<(this: Client) => void>;
}
export default Client;
export declare type IrcEventHandler = (this: Client, irc: NetworkWithIrcFramework["irc"], network: NetworkWithIrcFramework) => void;
