Music could be started and controlled with no way to turn it off for a server. Adds a music_settings table (mirrors the same one velox-dashboard-api's dashboard toggle reads/writes), a /music toggle command gated to Manage Server, and checks in /play, /queue, and /volume so they refuse to run when a server has music turned off.
67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package public
|
|
|
|
import (
|
|
"fmt"
|
|
"velox-bot/internal/commands/music/shared"
|
|
"velox-bot/internal/music"
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
)
|
|
|
|
var Volume = &discordgo.ApplicationCommand{
|
|
Name: "volume",
|
|
Description: "Set playback volume (0-150)",
|
|
Options: []*discordgo.ApplicationCommandOption{
|
|
{
|
|
Type: discordgo.ApplicationCommandOptionInteger,
|
|
Name: "value",
|
|
Description: "Volume percent (0-150)",
|
|
Required: true,
|
|
MinValue: ptrFloat(0),
|
|
MaxValue: 150,
|
|
},
|
|
},
|
|
}
|
|
|
|
func VolumeHandler(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
|
if !shared.RequireMusicEnabled(s, i) {
|
|
return
|
|
}
|
|
_ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
|
|
Type: discordgo.InteractionResponseDeferredChannelMessageWithSource,
|
|
Data: &discordgo.InteractionResponseData{
|
|
Content: "Updating volume...",
|
|
Flags: discordgo.MessageFlagsEphemeral,
|
|
},
|
|
})
|
|
|
|
if !memberHasDJRole(s, i.GuildID, i.Member) {
|
|
_, _ = s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{
|
|
Content: ptr("You need the **DJ** role to use music commands."),
|
|
})
|
|
return
|
|
}
|
|
|
|
data := i.ApplicationCommandData()
|
|
if len(data.Options) == 0 {
|
|
_, _ = s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{
|
|
Content: ptr("Missing volume value."),
|
|
})
|
|
return
|
|
}
|
|
|
|
vol := int(data.Options[0].IntValue())
|
|
if err := music.SetVolume(i.GuildID, vol); err != nil {
|
|
_, _ = s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{
|
|
Content: ptr(fmt.Sprintf("Error: %v", err)),
|
|
})
|
|
return
|
|
}
|
|
|
|
_, _ = s.InteractionResponseEdit(i.Interaction, &discordgo.WebhookEdit{
|
|
Content: ptr(fmt.Sprintf("Volume set to **%d%%**.", vol)),
|
|
})
|
|
}
|
|
|
|
func ptrFloat(v float64) *float64 { return &v }
|