11package dev.robothanzo.werewolf.audio
22
33import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler
4+ import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter
45import com.sedmelluq.discord.lavaplayer.tools.FriendlyException
56import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist
67import com.sedmelluq.discord.lavaplayer.track.AudioTrack
8+ import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason
79import dev.robothanzo.werewolf.WerewolfApplication
810import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel
911import org.slf4j.LoggerFactory
@@ -12,13 +14,36 @@ import java.util.*
1214object Audio {
1315 private val log = LoggerFactory .getLogger(Audio ::class .java)
1416
15- fun VoiceChannel.play (resource : Resource ) {
17+ fun VoiceChannel.play (resource : Resource , onFinished : (() -> Unit ) ? = null ) {
1618 val resourcePath = " sounds/$resource .mp3"
1719 log.info(" Attempting to play audio resource: {} in channel: {}" , resourcePath, this .name)
1820 try {
1921 val audioManager = this .guild.audioManager
2022 val player = WerewolfApplication .playerManager.createPlayer()
2123
24+ if (onFinished != null ) {
25+ player.addListener(object : AudioEventAdapter () {
26+ override fun onTrackEnd (
27+ player : com.sedmelluq.discord.lavaplayer.player.AudioPlayer ,
28+ track : AudioTrack ,
29+ endReason : AudioTrackEndReason
30+ ) {
31+ if (endReason.mayStartNext) {
32+ onFinished()
33+ }
34+ }
35+
36+ override fun onTrackException (
37+ player : com.sedmelluq.discord.lavaplayer.player.AudioPlayer ,
38+ track : AudioTrack ,
39+ exception : FriendlyException
40+ ) {
41+ log.error(" Track exception for audio resource: {}. Error: {}" , resourcePath, exception.message)
42+ onFinished()
43+ }
44+ })
45+ }
46+
2247 // Always set/update the sending handler to the player we just created for this clip
2348 audioManager.sendingHandler = AudioPlayerSendHandler (player)
2449
@@ -36,25 +61,32 @@ object Audio {
3661
3762 override fun playlistLoaded (playlist : AudioPlaylist ) {
3863 log.debug(" Playlist loaded (unexpected for single clip): {}" , resourceName(resource))
64+ onFinished?.invoke()
3965 }
4066
4167 override fun noMatches () {
4268 log.warn(" No matches found for audio resource: {}" , resourcePath)
69+ onFinished?.invoke()
4370 }
4471
4572 override fun loadFailed (exception : FriendlyException ) {
4673 log.error(" Load failed for audio resource: {}. Error: {}" , resourcePath, exception.message)
74+ onFinished?.invoke()
4775 }
4876 })
4977 } catch (e: Exception ) {
5078 log.error(" Error while trying to play sound resource: {}" , resourcePath, e)
79+ onFinished?.invoke()
5180 }
5281 }
5382
5483 private fun resourceName (resource : Resource ): String = resource.toString()
5584
5685 enum class Resource {
57- EXPEL_POLL , POLICE_ENROLL , POLICE_POLL , TIMER_ENDED , ENROLL_10S_REMAINING , POLL_10S_REMAINING , TIMER_30S_REMAINING ;
86+ MORNING , NIGHT ,
87+ EXPEL_POLL , POLL_10S_REMAINING ,
88+ ENROLL_10S_REMAINING , POLICE_ENROLL , POLICE_POLL ,
89+ TIMER_ENDED , TIMER_30S_REMAINING ;
5890
5991 override fun toString (): String {
6092 return super .toString().lowercase(Locale .ROOT )
0 commit comments