55 lines
1.6 KiB
Kotlin
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
|
|
}
|
|
} |