diff --git a/commands.go b/commands.go index ac5b332..c2d832d 100644 --- a/commands.go +++ b/commands.go @@ -161,6 +161,22 @@ func parseCommand(user *gumble.User, username, command string) { dj.SendPrivateMessage(user, NO_PERMISSION_MSG) } + // Shuffleon command + case dj.conf.Aliases.ShuffleOnAlias: + if dj.HasPermission(username, dj.conf.Permissions.AdminShuffleToggle) { + toggleAutomaticShuffle(true, user, username) + } else { + dj.SendPrivateMessage(user, NO_PERMISSION_MSG) + } + + // Shuffleoff command + case dj.conf.Aliases.ShuffleOffAlias: + if dj.HasPermission(username, dj.conf.Permissions.AdminShuffleToggle) { + toggleAutomaticShuffle(false, user, username) + } else { + dj.SendPrivateMessage(user, NO_PERMISSION_MSG) + } + default: dj.SendPrivateMessage(user, COMMAND_DOESNT_EXIST_MSG) } @@ -410,3 +426,19 @@ func shuffleSongs(user *gumble.User, username string) { dj.SendPrivateMessage(user, CANT_SHUFFLE_MSG) } } + +// handles toggling of automatic shuffle playing +func toggleAutomaticShuffle(activate bool, user *gumble.User, username string){ + if (dj.conf.General.AutomaticShuffleOn != activate){ + dj.conf.General.AutomaticShuffleOn = activate + if (activate){ + dj.client.Self.Channel.Send(fmt.Sprintf(SHUFFLE_ON_MESSAGE, username), false) + } else{ + dj.client.Self.Channel.Send(fmt.Sprintf(SHUFFLE_OFF_MESSAGE, username), false) + } + } else if (activate){ + dj.SendPrivateMessage(user, SHUFFLE_ACTIVATED_ERROR_MESSAGE) + } else{ + dj.SendPrivateMessage(user, SHUFFLE_DEACTIVATED_ERROR_MESSAGE) + } +} diff --git a/config.gcfg b/config.gcfg index 1b6a6a2..0b24d99 100644 --- a/config.gcfg +++ b/config.gcfg @@ -26,6 +26,10 @@ DefaultComment = "Hello! I am a bot. Type !help for a list of commands." # Default Value: 0 MaxSongDuration = 0 +# Is playlist shuffling enabled when the bot starts? +# Default Value: false +AutomaticShuffleOn = false + [Cache] # Cache songs as they are downloaded? @@ -130,6 +134,14 @@ KillAlias = "kill" # DEFAULT VALUE: "shuffle" ShuffleAlias = "shuffle" +# Alias used for shuffleon command +# DEFAULT VALUE: "shuffleon" +ShuffleOnAlias = "shuffleon" + +# Alias used for shuffleoff command +# DEFAULT VALUE: "shuffleoff" +ShuffleOffAlias = "shuffleoff" + [Permissions] # Enable admins diff --git a/parseconfig.go b/parseconfig.go index f0ff824..e3dc403 100644 --- a/parseconfig.go +++ b/parseconfig.go @@ -17,11 +17,12 @@ import ( // DjConfig is a Golang struct representation of mumbledj.gcfg file structure for parsing. type DjConfig struct { General struct { - CommandPrefix string - SkipRatio float32 - PlaylistSkipRatio float32 - DefaultComment string - MaxSongDuration int + CommandPrefix string + SkipRatio float32 + PlaylistSkipRatio float32 + DefaultComment string + MaxSongDuration int + AutomaticShuffleOn bool } Cache struct { Enabled bool @@ -51,27 +52,30 @@ type DjConfig struct { NumCachedAlias string CacheSizeAlias string KillAlias string - ShuffleAlias string + ShuffleAlias string + ShuffleOnAlias string + ShuffleOffAlias string } Permissions struct { - AdminsEnabled bool - Admins []string - AdminAdd bool - AdminAddPlaylists bool - AdminSkip bool - AdminHelp bool - AdminVolume bool - AdminMove bool - AdminReload bool - AdminReset bool - AdminNumSongs bool - AdminNextSong bool - AdminCurrentSong bool - AdminSetComment bool - AdminNumCached bool - AdminCacheSize bool - AdminKill bool - AdminShuffle bool + AdminsEnabled bool + Admins []string + AdminAdd bool + AdminAddPlaylists bool + AdminSkip bool + AdminHelp bool + AdminVolume bool + AdminMove bool + AdminReload bool + AdminReset bool + AdminNumSongs bool + AdminNextSong bool + AdminCurrentSong bool + AdminSetComment bool + AdminNumCached bool + AdminCacheSize bool + AdminKill bool + AdminShuffle bool + AdminShuffleToggle bool } } diff --git a/songqueue.go b/songqueue.go index c596fb1..4000477 100644 --- a/songqueue.go +++ b/songqueue.go @@ -64,6 +64,10 @@ func (q *SongQueue) NextSong() { // PeekNext peeks at the next Song and returns it. func (q *SongQueue) PeekNext() (Song, error) { if q.Len() > 1 { + if (dj.conf.General.AutomaticShuffleOn){ //Shuffle mode is active + swapIndex := 1 + rand.Intn(q.Len()) + q.queue[offset], q.queue[swapIndex] = q.queue[swapIndex], q.queue[offset] + } return q.queue[1], nil } return nil, errors.New("There isn't a Song coming up next.") diff --git a/strings.go b/strings.go index 6a59fad..5d17e25 100644 --- a/strings.go +++ b/strings.go @@ -74,8 +74,20 @@ const CACHE_NOT_ENABLED_MSG = "The cache is not currently enabled." // Message shown to user when they attempt to shuffle the a playlist with less than 2 elements. const CANT_SHUFFLE_MSG = "Can't shuffle the playlist if there is less than 2 songs." -// Message shown to user when the playlist has been successfully shuffled. -const SHUFFLE_SUCCESS_MSG = "The playlist has been successfully shuffled by %s (starting from next song)." +// Message shown to users when the playlist has been successfully shuffled. +const SHUFFLE_SUCCESS_MSG = "The current playlist has been successfully shuffled by %s (starting from next song)." + +// Message shown to users when automatic shuffle is activated +const SHUFFLE_ON_MESSAGE = "%s has turned automatic shuffle on." + +// Message shown to users when automatic shuffle is deactivated +const SHUFFLE_OFF_MESSAGE = "%s has turned automatic shuffle off." + +// Message shown to user when they attempt to enable automatic shuffle while it's already activated +const SHUFFLE_ACTIVATED_ERROR_MESSAGE = "Automatic shuffle is already activated." + +// Message shown to user when they attempt to disable automatic shuffle while it's already deactivated +const SHUFFLE_DEACTIVATED_ERROR_MESSAGE = "Automatic shuffle is already deactivated." // Message shown to channel when a song is added to the queue by a user. const SONG_ADDED_HTML = ` @@ -113,7 +125,9 @@ const HELP_HTML = `

!reset - An admin command that resets the song queue.

!forceskip - An admin command that forces a song skip.

!forceskipplaylist - An admin command that forces a playlist skip.

-

!shuffle - An admin command that shuffles the playlist.

+

!shuffle - An admin command that shuffles the current playlist.

+

!shuffleon - An admin command that enables auto shuffling.

+

!shuffleoff - An admin command that disables auto shuffling.

!move - Moves MumbleDJ into channel if it exists.

!reload - Reloads mumbledj.gcfg configuration settings.

!setcomment - Sets the comment for the bot.