ottobotv2/src/main/kotlin/nl/voidcorp/discord/music/TrackScheduler.kt

55 lines
1.6 KiB
Kotlin

package nl.voidcorp.discord.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 java.util.*
class TrackScheduler(
private val player: AudioPlayer,
private val announcer: MusicAnnouncer,
private val delet: () -> Unit
) :
AudioEventAdapter() {
private val queue = ArrayDeque<AudioTrack>()
private var loop = false
fun queue(track: AudioTrack) {
if (!player.startTrack(track, true)) {
queue.addLast(track)
announcer.sendQueueTrack(track)
}
}
override fun onTrackStart(player: AudioPlayer, track: AudioTrack) {
announcer.sendPlayTrack(track)
}
override fun onTrackEnd(player: AudioPlayer, track: AudioTrack, endReason: AudioTrackEndReason) {
if (loop && endReason.mayStartNext) {
queue.addLast(track.makeClone())
}
if ((endReason.mayStartNext || endReason == AudioTrackEndReason.STOPPED) && queue.isNotEmpty()) {
player.startTrack(queue.pop(), true)
} else if (queue.isEmpty()) {
announcer.close()
delet()
}
}
val playing
get() = player.playingTrack != null
val totalList: List<AudioTrack>
get() = if (player.playingTrack == null) listOf() else mutableListOf(player.playingTrack).apply { addAll(queue) }
fun skip() = player.stopTrack()
fun loop(): Boolean {
loop = !loop
return loop
}
}