110 lines
3.5 KiB
Kotlin
110 lines
3.5 KiB
Kotlin
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<AudioTrack>()
|
|
/*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() }
|
|
}
|
|
}
|
|
|
|
}
|
|
|