package nl.voidcorp.dbot.music import com.sedmelluq.discord.lavaplayer.player.AudioPlayer import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter import com.sedmelluq.discord.lavaplayer.track.AudioTrack import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason import net.dv8tion.jda.core.EmbedBuilder import net.dv8tion.jda.core.MessageBuilder import net.dv8tion.jda.core.entities.Guild import net.dv8tion.jda.core.entities.Member import net.dv8tion.jda.core.entities.TextChannel import net.dv8tion.jda.core.entities.VoiceChannel import nl.voidcorp.dbot.commands.AudioPlayerSendHandler import nl.voidcorp.dbot.commands.guildMusicMap import nl.voidcorp.dbot.log import java.time.LocalDateTime import java.util.* import kotlin.concurrent.thread class TrackScheduler(val player: AudioPlayer, val guild: Guild, channel: VoiceChannel) : AudioEventAdapter() { val musicChannel: TextChannel init { player.addListener(this) val audio = guild.audioManager audio.sendingHandler = AudioPlayerSendHandler(player) audio.openAudioConnection(channel) musicChannel = guild.getTextChannelsByName("music", true).firstOrNull() ?: (guild.getTextChannelsByName("general", true).firstOrNull() ?: guild.defaultChannel!!) } private val q = ArrayDeque() /*override fun onEvent(event: AudioEvent) { if (event is TrackEndEvent) { } }*/ override fun onTrackEnd(player: AudioPlayer, track: AudioTrack, endReason: AudioTrackEndReason) { if (q.isNotEmpty()) { player.playTrack(q.remove()) } else { stopPlay(endReason) player.destroy() } } override fun onTrackStart(player: AudioPlayer, track: AudioTrack) { if (track.userData is Member) musicChannel.sendMessage(EmbedBuilder() .setFooter("Requested by ${(track.userData as Member).effectiveName}", (track.userData as Member) .user.effectiveAvatarUrl).setAuthor(track.info.author).setTitle(track.info.title, track.info.uri) .setThumbnail("https://img.youtube.com/vi/${track.info.identifier}/hqdefault.jpg\n") .setTimestamp(LocalDateTime.now()).build()).append("Now playing").queue() } fun queue(track: AudioTrack, member: Member) { track.userData = member if (q.isEmpty() && player.playingTrack == null) { log.info("Queue is empty, playing a track") player.playTrack(track) } else { log.info("Track Queue'd") q.addLast(track) } } fun insertFront(track: AudioTrack, member: Member) { track.userData = member if (q.isEmpty() && player.playingTrack == null) { log.info("Queue is empty, playing a track") player.playTrack(track) } else { log.info("Track inserted") q.addFirst(track) } } fun skip() { if (q.isNotEmpty()) { log.info("skipped Track!") player.playTrack(q.remove()) } else { stopPlay(AudioTrackEndReason.REPLACED) player.destroy() } } fun isQueueEmpty() = q.isEmpty() fun stopPlay(endReason: AudioTrackEndReason) { if (endReason != AudioTrackEndReason.REPLACED) { guildMusicMap.remove(guild.idLong) musicChannel.sendMessage("Playlist has ended, leaving the voice channel!").queue() thread { guild.audioManager.closeAudioConnection() } } } }