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.