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, }) }