import { Client as DiscordCoreClient, MappedEvents } from '@discordjs/core';
import { CreateWebSocketManagerOptions, WebSocketManager } from '@discordjs/ws';
import { RefClusterManager } from './clusterManager';
import { REST, RESTOptions } from '@discordjs/rest';
import { ClusterClient } from './clusterClient';
export type ShardingCoreClientOptions = {
    gateway: Omit<CreateWebSocketManagerOptions, 'token' | 'rest' | 'shardCount' | 'shardIds'>;
    rest?: Partial<RESTOptions>;
    token: string;
};
/** Modified DiscordClient with bunch of new methods. */
export declare class ShardingCoreClient<InternalManager extends RefClusterManager = RefClusterManager> extends DiscordCoreClient {
    /** Cluster associated with this client. */
    cluster: ClusterClient<this, InternalManager>;
    gateway: WebSocketManager;
    /** The REST manager of this client. */
    rest: REST;
    private shardsReady;
    /** Creates an instance of ShardingCoreClient. */
    constructor(options: ShardingCoreClientOptions);
}
export type RefShardingCoreClient = ShardingCoreClient;
export declare interface ShardingCoreClient {
    /** Emit an event. */
    emit: (<K extends keyof MappedEvents>(event: K, ...args: MappedEvents[K]) => boolean) & (<S extends string | symbol>(event: Exclude<S, keyof MappedEvents>, ...args: unknown[]) => boolean);
    /** Remove an event listener. */
    off: (<K extends keyof MappedEvents>(event: K, listener: (...args: MappedEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof MappedEvents>, listener: (...args: unknown[]) => void) => this);
    /** Listen for an event. */
    on: (<K extends keyof MappedEvents>(event: K, listener: (...args: MappedEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof MappedEvents>, listener: (...args: unknown[]) => void) => this);
    /** Listen for an event once. */
    once: (<K extends keyof MappedEvents>(event: K, listener: (...args: MappedEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof MappedEvents>, listener: (...args: unknown[]) => void) => this);
    /** Remove all listeners for an event. */
    removeAllListeners: (<K extends keyof MappedEvents>(event?: K) => this) & (<S extends string | symbol>(event?: Exclude<S, keyof MappedEvents>) => this);
}
