import { AudioPlayer, AudioPlayerStatus } from "@discordjs/voice"; import { player } from "./main"; import { CacheType, ChatInputCommandInteraction } from "discord.js"; import { getAudioFile } from "./util/downloader"; import { playSong } from "./util/helpers"; import { add_to_history } from "./util/history"; const queue: Queue = { songList: [], current: null, loop: null, } export function toggleLoop(): AudioFile | null { if (queue.loop) queue.loop = null else queue.loop = queue.current return queue.loop } export async function requestSong( url: string, data: Partial ) { getAudioFile(url).then((path) => { queue.songList.push({ path, url }) add_to_history({ url, user: data.user }) updatePlayer() }) } export async function forceRequestSong( url: string, data: Partial ) { const path = await getAudioFile(url) const audio = { path, url } queue.songList.push(audio) add_to_history({ url, user: data.user }) queue.current = audio playSong(player, path); } export async function updatePlayer() { if (player.state.status === AudioPlayerStatus.Idle) { const nextSong = queue.loop ?? queue.songList.shift() if (!nextSong) { queue.current = null return }; queue.current = nextSong; playSong(player, nextSong.path); } } export function skip_song(): AudioFile | null { if (player.state.status === AudioPlayerStatus.Playing) { const skipped = queue.current const nextSong = queue.songList.shift() if (!nextSong) { queue.current = null player.stop() return null }; queue.current = nextSong; playSong(player, nextSong.path); return skipped } return null } export function pause_playback(player: AudioPlayer) { player.pause() } export function stop_playback(player: AudioPlayer) { player.stop() } export function resume_playback(player: AudioPlayer) { player.unpause() } export function getQueue(): Queue { return queue }