Files
FernandoJVideira d7edfea45e feat: integrate music commands with Lavalink support
- Added new music commands: play, queue, and volume.
- Implemented music management using disgolink for Lavalink integration.
- Updated bot initialization to include Lavalink host and password.
- Enhanced interaction handling for music commands, requiring DJ role for usage.
- Introduced now playing message with interactive buttons for controlling playback.
- Updated dependencies in go.mod for disgolink and snowflake.
2026-03-18 03:47:42 +00:00

109 lines
2.6 KiB
Go

package music
import (
"strings"
"github.com/bwmarrin/discordgo"
)
func HandleComponent(s *discordgo.Session, i *discordgo.InteractionCreate) {
// DJ role is required for all music controls.
if !memberHasDJRoleForComponents(s, i.GuildID, i.Member) {
_ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Content: "You need the **DJ** role to use music commands.",
Flags: discordgo.MessageFlagsEphemeral,
},
})
return
}
customID := i.MessageComponentData().CustomID
parts := strings.Split(customID, ":")
if len(parts) < 2 {
return
}
action := parts[1]
guildID := i.GuildID
// Ignore controls from old now-playing messages
currentMsgID := CurrentNowPlayingMessageID(guildID)
if currentMsgID != "" && i.Message != nil && i.Message.ID != currentMsgID {
_ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Content: "These controls are outdated.",
Flags: discordgo.MessageFlagsEphemeral,
},
})
return
}
// Acknowledge immediately to avoid "This interaction failed".
_ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseDeferredMessageUpdate,
})
var err error
content := ""
switch action {
case "pause":
err = Pause(guildID, true)
content = "Paused."
case "resume":
err = Pause(guildID, false)
content = "Resumed."
case "toggle_pause":
paused, _ := pausedAndVolume(guildID)
err = Pause(guildID, !paused)
if paused {
content = "Resumed."
} else {
content = "Paused."
}
updateNowPlayingButtons(i.ChannelID, i.Message.ID, guildID)
case "skip":
err = Skip(guildID)
content = "Skipped."
case "stop":
err = Stop(guildID)
content = "Stopped."
case "repeat_song":
rs, rq := ToggleRepeatSong(guildID)
_ = rs
_ = rq
updateNowPlayingButtons(i.ChannelID, i.Message.ID, guildID)
if rs {
content = "Repeat song enabled."
} else {
content = "Repeat song disabled."
}
case "repeat_queue":
rs, rq := ToggleRepeatQueue(guildID)
_ = rs
_ = rq
updateNowPlayingButtons(i.ChannelID, i.Message.ID, guildID)
if rq {
content = "Repeat queue enabled."
} else {
content = "Repeat queue disabled."
}
}
if content == "" {
content = "Done."
}
if err != nil {
content = "Error: " + err.Error()
}
// send ephemeral confirmation
_, _ = s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{
Content: content,
Flags: discordgo.MessageFlagsEphemeral,
})
}