@ -14,6 +14,7 @@ import nl.voidcorp.dbot.log
import java.awt.Color
import java.time.LocalDateTime
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.concurrent.timerTask
import kotlin.math.roundToInt
@ -21,6 +22,8 @@ import kotlin.math.roundToInt
class TrackScheduler ( val player : AudioPlayer , val guild : Guild , val voiceChannel : VoiceChannel ) : AudioEventAdapter ( ) {
val musicChannel : TextChannel
var loop = false
init {
player . addListener ( this )
@ -45,10 +48,16 @@ class TrackScheduler(val player: AudioPlayer, val guild: Guild, val voiceChannel
} * /
override fun onTrackEnd ( player : AudioPlayer , track : AudioTrack , endReason : AudioTrackEndReason ) {
pressedSkip ++
pressedSkip = 0
if ( q . isNotEmpty ( ) ) {
player . playTrack ( q . poll ( ) )
val t = q . poll ( ) !!
if ( loop ) q . addLast ( t . makeClone ( ) . apply { userData = t . userData } )
player . playTrack ( t )
} else {
if ( loop ) {
player . playTrack ( track . makeClone ( ) . apply { userData = track . userData } )
return
}
stopPlay ( endReason )
player . destroy ( )
}
@ -135,52 +144,66 @@ class TrackScheduler(val player: AudioPlayer, val guild: Guild, val voiceChannel
fun getCurrentTrackInfo ( ) : MessageEmbed = getTrackInfo ( player . playingTrack )
fun getTrackInfo ( track : AudioTrack ) : MessageEmbed {
if ( track is YoutubeAudioTrack ) {
if ( track . userData is Member )
return 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 " )
. setTimestamp ( LocalDateTime . now ( ) ) . setColor ( Color . decode ( " #ff0000 " ) ) . build ( )
} else if ( track is SoundCloudAudioTrack ) {
val scsm = track . sourceManager as SoundCloudAudioSourceManager
scsm . updateClientId ( )
val art = khttp . get (
" http://api.soundcloud.com/tracks/ ${track.info.identifier} ?client_id= ${scsm.clientId} " ,
headers = mapOf ( " Content-Type " to " application/json " )
) . jsonObject [ " artwork_url " ] . toString ( ) . replace ( " large " , " t300x300 " )
if ( track . userData is Member )
return 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 )
val eb = EmbedBuilder ( ) . setTimestamp ( LocalDateTime . now ( ) )
if ( track . userData is Member ) {
eb . setFooter (
" Requested by ${(track.userData as Member).effectiveName} " , ( track . userData as Member )
. user . effectiveAvatarUrl
)
}
when ( track ) {
is YoutubeAudioTrack -> eb . setAuthor ( track . info . author ) . setTitle ( track . info . title , track . info . uri )
. setThumbnail ( " https://img.youtube.com/vi/ ${track.info.identifier} /hqdefault.jpg " )
. setColor ( Color . decode ( " #ff0000 " ) )
is SoundCloudAudioTrack -> {
val scsm = track . sourceManager as SoundCloudAudioSourceManager
scsm . updateClientId ( )
val art = khttp . get (
" http://api.soundcloud.com/tracks/ ${track.info.identifier} ?client_id= ${scsm.clientId} " ,
headers = mapOf ( " Content-Type " to " application/json " )
) . jsonObject [ " artwork_url " ] . toString ( ) . replace ( " large " , " t300x300 " )
eb
. setAuthor ( track . info . author ) . setTitle ( track . info . title , track . info . uri )
. setThumbnail ( if ( art == " null " ) null else art )
. setTimestamp ( LocalDateTime . now ( ) ) . set Color ( Color . decode ( " #ff5500 " ) ) . build ( )
. setColor ( Color . decode ( " #ff5500 " ) )
} else if ( track is HttpAudioTrack ) {
if ( track . userData is Member )
return 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 )
. setTimestamp ( LocalDateTime . now ( ) ) . setColor ( Color . decode ( " #005A9C " ) ) . build ( )
}
is HttpAudioTrack -> eb . setAuthor ( track . info . author ) . setTitle ( track . info . title , track . info . uri )
. setColor ( Color . decode ( " #005A9C " ) )
else ->
eb . setAuthor ( track . info . author ) . setTitle ( track . info . title , track . info . uri )
. setColor ( musicChannel . guild . selfMember . color )
}
return 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 )
. setTimestamp ( LocalDateTime . now ( ) ) . setColor ( musicChannel . guild . selfMember . color ) . build ( )
eb . setDescription ( " ${millisToTime(track.position)} / ${millisToTime(track.duration)} " )
return eb . build ( )
}
fun millisToTime ( millis : Long ) : String {
var ms = millis
val days = TimeUnit . MILLISECONDS . toDays ( ms )
ms -= TimeUnit . DAYS . toMillis ( days )
val hours = TimeUnit . MILLISECONDS . toHours ( ms )
ms -= TimeUnit . HOURS . toMillis ( hours )
val minutes = TimeUnit . MILLISECONDS . toMinutes ( ms )
ms -= TimeUnit . MINUTES . toMillis ( minutes )
val seconds = TimeUnit . MILLISECONDS . toSeconds ( ms )
val current = String . format (
" %02d:%02d:%02d:%02d " ,
days , hours , minutes , seconds
) . removePrefix ( " 00: " ) . removePrefix ( " 00: " )
return current
}
fun getTrackList ( member : Member ) : MessageEmbed {
return EmbedBuilder ( ) . setTitle ( " Hey ${member.effectiveName} , here is the playlist " )
return EmbedBuilder ( ) . setTitle ( " Hey ${member.effectiveName} , here is the playlist ${if (loop) ", it loops!" else ""} ")
. setTimestamp ( LocalDateTime . now ( ) ) . setColor ( musicChannel . guild . selfMember . color )
. setFooter ( " Requested by ${member.effectiveName} " , member . user . effectiveAvatarUrl ) . setDescription (
" ** ${player.playingTrack.info.title} **, requested by ${if (player.playingTrack.userData is Member) (player.playingTrack.userData as Member).effectiveName else "someone unknown..."} (*now playing*) \n " +
@ -196,5 +219,11 @@ class TrackScheduler(val player: AudioPlayer, val guild: Guild, val voiceChannel
return press >= half
}
fun clearQueue ( ) {
q . clear ( )
loop = false
player . stopTrack ( )
}
}