playerUtils.ts
1 import { AudioPlayer, AudioPlayerState, AudioPlayerStatus, createAudioResource, StreamType } from "@discordjs/voice"; 2 import { players, playlists } from "../cache/players"; 3 import { stationType } from "../typings/firebase"; 4 import { database } from "../cache/db"; 5 import { getStream } from "firebase/storage"; 6 import { getRandomStation } from "./functions"; 7 8 export const buildResource = (object: stationType<false>) => { 9 const audioRef = database.audioRef(object.id); 10 11 const audioStream = getStream(audioRef) 12 return createAudioResource(audioStream as any, { 13 inputType: StreamType.Arbitrary, 14 metadata: { 15 title: object.title 16 } 17 }) 18 } 19 export const stateChange = (player: AudioPlayer, before: AudioPlayerState, after: AudioPlayerState, guildId: string) => { 20 const data = players.get(guildId); 21 const playlist = playlists.get(guildId) ?? []; 22 23 if (!data) return; 24 if (before.status === AudioPlayerStatus.Playing && after.status === AudioPlayerStatus.Idle) { 25 if (!data.looping && playlist.length === 0) { 26 player.stop(); 27 28 data.connection.destroy(); 29 players.delete(guildId) 30 } else if (playlist.length > 0) { 31 const nextTrack = playlist.shift() 32 playlists.set(guildId, playlist); 33 34 const res = buildResource(nextTrack); 35 36 data.currentTrack = nextTrack; 37 data.startedAt = Date.now() 38 player.play(res); 39 40 players.set(guildId, data); 41 } else { 42 const nextTrack = getRandomStation(); 43 const res = buildResource(nextTrack); 44 45 data.startedAt = Date.now() 46 data.currentTrack = nextTrack; 47 48 player.play(res); 49 players.set(guildId, data); 50 } 51 } 52 }