import type { Node } from "./node.js";
import * as Protocol from "lavalink-protocol";
import type * as API from "lavalink-api-client";
import type { Cluster } from "./cluster/client.js";
import { ClusterNode } from "./cluster/node.js";
import { PlayerVoice } from "./playerVoice.js";
import { TypedEmitter } from "tiny-typed-emitter";
export declare class Player<$Node extends Node = Node> extends TypedEmitter<PlayerEvents> {
    readonly id: string;
    readonly voice: PlayerVoice;
    api: API.PlayerAPI;
    node: $Node;
    playing: boolean;
    playingTimestamp?: number;
    track: Protocol.Track | null;
    filters: Protocol.Filters;
    position: number;
    volume: number;
    paused: boolean;
    lastUpdate?: number;
    constructor(node: $Node, id: string);
    get cluster(): $Node extends ClusterNode ? Cluster : Cluster | null;
    get adjustedPosition(): number;
    play<T>(track: {
        encoded: string;
        userData: T;
        userDataSchema: Protocol.AnySchema<T>;
    }, options?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "track" | "voice">): Promise<this>;
    play(track: string | {
        encoded: string;
        userData: Record<string, unknown>;
    }, options?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "track" | "voice">): Promise<this>;
    stop(other?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "track" | "voice">): Promise<this>;
    pause(paused?: boolean, other?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "paused" | "voice">): Promise<this>;
    resume(other?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "paused" | "voice">): Promise<this>;
    seek(position: number, other?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "position" | "voice">): Promise<this>;
    setVolume(volume: number, other?: Omit<Protocol.RESTPatchAPIPlayerJSONBody, "volume" | "voice">): Promise<this>;
    setFilters(filters: Protocol.Filters): Promise<this>;
    setFilters<K extends keyof Protocol.Filters>(filter: K, value: Protocol.Filters[K]): Promise<this>;
    setFilters(filter: string, value: unknown, plugin: true): Promise<this>;
    fetch(): Promise<boolean>;
    update(body: Protocol.RESTPatchAPIPlayerJSONBody, noReplace?: boolean): Promise<this>;
    patch(data: Protocol.Player): this;
    patchWithState(data: Protocol.PlayerState): this;
    transfer(to: $Node): Promise<void>;
    handleEvent(event: Protocol.Event): void;
}
export interface PlayerEvents {
    disconnected: (code: number, reason: string, byRemote: boolean) => void;
    updated: () => void;
    trackStart: (track: Protocol.Track) => void;
    trackEnd: (track: Protocol.Track, reason: Protocol.TrackEndReason) => void;
    trackException: (track: Protocol.Track, exception: Protocol.Exception) => void;
    trackStuck: (track: Protocol.Track, thresholdMs: number) => void;
}
//# sourceMappingURL=player.d.ts.map