import { EventEmitter } from 'events';
import { CreatePlayerOptions, KazagumoOptions as KazagumoOptionsOwO, KazagumoSearchOptions, KazagumoSearchResult, PlayerMovedChannels, PlayerMovedState } from './Modules/Interfaces';
import { Connector, Node, NodeOption, Player, PlayerUpdate, Shoukaku, ShoukakuOptions, TrackExceptionEvent, TrackStuckEvent, VoiceChannelOptions, WebSocketClosedEvent } from 'shoukaku';
import { KazagumoPlayer } from './Managers/KazagumoPlayer';
import { KazagumoTrack } from './Managers/Supports/KazagumoTrack';
import { KazagumoQueue } from './Managers/Supports/KazagumoQueue';
export interface KazagumoEvents {
    /**
     * Emitted when a track is going to play.
     * @event Kazagumo#playerStart
     */
    playerStart: [player: KazagumoPlayer, track: KazagumoTrack];
    /**
     * Emitted when an error occured while resolving track.
     * @event Kazagumo#playerResolveError
     */
    playerResolveError: [player: KazagumoPlayer, track: KazagumoTrack, message?: string];
    /**
     * Emitted when a player got destroyed.
     * @event Kazagumo#playerDestroy
     */
    playerDestroy: [player: KazagumoPlayer];
    /**
     * Emitted when a player created.
     * @event Kazagumo#playerCreate
     */
    playerCreate: [player: KazagumoPlayer];
    /**
     * Emitted when a track ended.
     * @event Kazagumo#playerEnd
     */
    playerEnd: [player: KazagumoPlayer];
    /**
     * Emitted when a player got empty.
     * @event Kazagumo#playerEmpty
     */
    playerEmpty: [player: KazagumoPlayer];
    /**
     * Emitted when a player got closed.
     * @event Kazagumo#playerClosed
     */
    playerClosed: [player: KazagumoPlayer, data: WebSocketClosedEvent];
    /**
     * Emitted when a player got stuck.
     * @event Kazagumo#playerStuck
     */
    playerStuck: [player: KazagumoPlayer, data: TrackStuckEvent];
    /**
     * Emitted when a player got resumed.
     * @event Kazagumo#playerResumed
     */
    playerResumed: [player: KazagumoPlayer];
    /**
     * Emitted only when you use playerMoved plugin and when the bot moved, joined, or left voice channel.
     * @event Kazagumo#playerMoved
     */
    playerMoved: [player: KazagumoPlayer, state: PlayerMovedState, channels: PlayerMovedChannels];
    /**
     * Emitted when an exception occured.
     * @event Kazagumo#playerException
     */
    playerException: [player: KazagumoPlayer, data: TrackExceptionEvent];
    /**
     * Emitted when a player updated.
     * @event Kazagumo#playerUpdate
     */
    playerUpdate: [player: KazagumoPlayer, data: PlayerUpdate];
    /**
     * Emitted for science purpose.
     * @event Kazagumo#playerUpdate
     */
    /**
     * Emitted when a queue updated (track added, changed, etc).
     * @event Kazagumo#queueUpdate
     */
    queueUpdate: [player: KazagumoPlayer, queue: KazagumoQueue];
}
export declare interface Kazagumo {
    on<K extends keyof KazagumoEvents>(event: K, listener: (...args: KazagumoEvents[K]) => void): this;
    once<K extends keyof KazagumoEvents>(event: K, listener: (...args: KazagumoEvents[K]) => void): this;
    off<K extends keyof KazagumoEvents>(event: K, listener: (...args: KazagumoEvents[K]) => void): this;
    emit(event: string | symbol, ...args: any[]): boolean;
}
export declare class Kazagumo extends EventEmitter {
    KazagumoOptions: KazagumoOptionsOwO;
    /** Shoukaku instance */
    shoukaku: Shoukaku;
    /** Kazagumo players */
    readonly players: Map<string, KazagumoPlayer>;
    /**
     * Initialize a Kazagumo instance.
     * @param KazagumoOptions KazagumoOptions
     * @param connector Connector
     * @param nodes NodeOption[]
     * @param options ShoukakuOptions
     */
    constructor(KazagumoOptions: KazagumoOptionsOwO, connector: Connector, nodes: NodeOption[], options?: ShoukakuOptions);
    protected createVoiceConnection(newPlayerOptions: VoiceChannelOptions, kazagumoPlayerOptions: CreatePlayerOptions): Promise<Player>;
    /**
     * Create a player.
     * @param options CreatePlayerOptions
     * @returns Promise<KazagumoPlayer>
     */
    createPlayer<T extends KazagumoPlayer>(options: CreatePlayerOptions): Promise<T | KazagumoPlayer>;
    /**
     * Get a player by guildId.
     * @param guildId Guild ID
     * @returns KazagumoPlayer | undefined
     */
    getPlayer<T extends KazagumoPlayer>(guildId: string): (T | KazagumoPlayer) | undefined;
    /**
     * Destroy a player.
     * @param guildId Guild ID
     * @returns void
     */
    destroyPlayer<T extends KazagumoPlayer>(guildId: string): void;
    /**
     * Get the least used node.
     * @param group The group where you want to get the least used nodes there. Case-sensitive, catch the error when there is no such group
     * @returns Node
     */
    getLeastUsedNode(group?: string): Promise<Node>;
    /**
     * Search a track by query or uri.
     * @param query Query
     * @param options KazagumoOptions
     * @returns Promise<KazagumoSearchResult>
     */
    search(query: string, options?: KazagumoSearchOptions): Promise<KazagumoSearchResult>;
    private buildSearch;
}
