import { VoiceConnection } from "@discordjs/voice";
import { VoiceChannel, TypedEmitter, TrackMetadata, MusicPlayerOptions } from "./types";
import EventEmitter from "events";
/**
 * Manages voice connection, playback, queue, history, and loop modes.
 * Emits events defined in MusicPlayerEvent.
 */
export declare class MusicPlayer extends EventEmitter<TypedEmitter> {
    channel: VoiceChannel;
    private previousQueueOrder;
    private connection;
    private player;
    private volume;
    private queue;
    private history;
    private loopQueue;
    private loopTrack;
    private playing;
    private autoLeaveOnEmptyQueue;
    private autoLeaveOnIdleMs;
    private idleTimer;
    private shuffield;
    private radioMode;
    private radioUrls;
    private connectionData;
    /**
     * Initializes a new MusicPlayer instance.
     * @param channel - Discord voice channel to connect to.
     * @param initialVolume - Initial volume (0–100), defaults to 100.
     * @param options - Options for auto-leave and idle timeout.
     */
    constructor(channel: VoiceChannel, initialVolume?: number, options?: MusicPlayerOptions);
    /**
     * Sets the connection data for the voice channel.
     * @param data - Connection settings.
     * @returns The current MusicPlayer instance.
     */
    setData(data: {
        channelId: string;
        guildId: string;
        adapterCreator: any;
        selfDeaf?: boolean;
        selfMute?: boolean;
        group?: string;
        debug?: boolean;
    }): this;
    /**
     * Joins the voice channel using provided or stored connection data.
     * @param data - Optional connection settings; uses stored data if not provided.
     * @returns The VoiceConnection instance.
     */
    join(data?: {
        channelId: string;
        guildId: string;
        adapterCreator: any;
        selfDeaf?: boolean;
        selfMute?: boolean;
        group?: string;
        debug?: boolean;
    }): VoiceConnection;
    /**
     * Establishes a connection to the voice channel if not already connected.
     */
    private ensureConnection;
    /**
     * Starts a timer to disconnect after inactivity.
     */
    private startIdleTimer;
    /**
     * Clears the idle timer if it exists.
     */
    private clearIdleTimer;
    /**
     * Randomly shuffles an array.
     * @param array - Array to shuffle.
     * @returns New shuffled array.
     */
    private shuffleArray;
    /**
     * Searches Google for song lyrics and returns them, or null if not found.
     * @param title - Song title.
     * @param artist - Optional artist name for better accuracy.
     */
    searchLyrics(title: string, artist?: string): Promise<string | null>;
    /**
     * Resolves a query to a track URL or returns the URL if provided.
     * @param query - Search query or URL.
     * @returns Resolved URL.
     */
    search(query: string): Promise<string>;
    /**
     * Starts radio mode with a list of URLs.
     * @param urls - Array of URLs to play.
     */
    startRadio(urls: string[]): Promise<void>;
    /**
     * Creates a stream from a SoundCloud URL.
     * @param url - SoundCloud URL.
     * @returns Readable stream.
     */
    private createStreamFromScdl;
    /**
     * Creates a stream from a YouTube URL using various ytdl libraries.
     * @param url - YouTube URL.
     * @returns Readable stream or null if failed.
     */
    private createStreamFromYtdl;
    /**
     * Creates a stream from a URL using play-dl.
     * @param url - URL to stream.
     * @returns Readable stream or null if failed.
     */
    private createStreamFromPlayDl;
    /**
     * Fetches metadata for a track URL.
     * @param url - Track URL.
     * @returns Track metadata.
     */
    private fetchMetadata;
    /**
     * Plays a track URL with its metadata.
     * @param url - Track URL.
     * @param metadata - Track metadata.
     */
    private playUrl;
    /**
     * Plays a song by query or URL, adding to queue if already playing.
     * @param input - Search query or URL.
     */
    play(input: string): Promise<void>;
    /**
     * Pauses the current playback.
     */
    pause(): void;
    /**
     * Resumes the current playback.
     */
    resume(): void;
    /**
     * Sets the playback volume.
     * @param percent - Volume percentage (0–200).
     */
    setVolume(percent: number): number;
    /**
     * Handles idle state, looping or playing next track as needed.
     */
    private onIdle;
    /**
     * Skips the current track and moves to the next.
     */
    skip(): void;
    /**
     * Plays the previous track from history.
     */
    previous(): Promise<void>;
    /**
     * Shuffles the queue and saves the previous order.
     */
    shuffle(): void;
    /**
     * Restores the queue to its pre-shuffle order, excluding played tracks.
     */
    undoShuffle(): void;
    /**
     * Toggles queue looping on or off.
     */
    toggleLoopQueue(): boolean;
    /**
     * Checks if queue looping is enabled.
     * @returns True if enabled, false otherwise.
     */
    isLoopQueue(): boolean;
    /**
     * Toggles track looping on or off.
     */
    toggleLoopTrack(): boolean;
    /**
     * Checks if track looping is enabled.
     * @returns True if enabled, false otherwise.
     */
    isLoopTrack(): boolean;
    /**
     * Disconnects from the voice channel and cleans up resources.
     */
    disconnect(): void;
    /**
     * Stops playback and optionally disconnects.
     * @param noLeave - If true, stays connected to the channel.
     */
    stop(noLeave?: boolean): void;
    /**
     * Returns a copy of the current queue.
     * @returns Array of track metadata.
     */
    getQueue(): TrackMetadata[];
    /**
     * Gets the current volume percentage.
     * @returns Volume (0–200).
     */
    getVolume(): number;
    /**
     * Checks if the player is currently playing.
     * @returns True if playing, false otherwise.
     */
    isPlaying(): boolean;
    /**
     * Checks if the player is paused.
     * @returns True if paused, false otherwise.
     */
    isPaused(): boolean;
    /**
     * Checks if the queue is shuffled.
     * @returns True if shuffled, false otherwise.
     */
    isShuffiled(): boolean;
    /**
     * Checks if the bot is actively connected to a voice channel.
     * @param guildId - Optional guild ID; uses stored guild ID if not provided.
     * @returns True if actively connected, false otherwise.
     */
    isConnected(guildId?: string): boolean;
    /**
     * Creates a custom error for the music player.
     * @param message - Error message.
     * @returns Custom error instance.
     */
    private createError;
}
/**
 * @copyright
 * Code by Sobhan-SRZA (mr.sinre) | https://github.com/Sobhan-SRZA
 * Developed for Persian Caesar | https://github.com/Persian-Caesar | https://dsc.gg/persian-caesar
 *
 * If you encounter any issues or need assistance with this code,
 * please make sure to credit "Persian Caesar" in your documentation or communications.
 */ 
