package public import ( "context" "strconv" "velox-bot/internal/commands/meeting/shared" "velox-bot/internal/db/services" "github.com/bwmarrin/discordgo" ) var Meeting = &discordgo.ApplicationCommand{ Name: "meeting", Description: "Meeting room settings", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionSubCommand, Name: "set-lobby", Description: "Set the voice lobby channel used to create meetings", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionChannel, Name: "channel", Description: "Voice channel lobby", Required: true, ChannelTypes: []discordgo.ChannelType{discordgo.ChannelTypeGuildVoice}, }, }, }, }, } func MeetingHandler(s *discordgo.Session, i *discordgo.InteractionCreate) { if !shared.RequireGuild(s, i) || !shared.RequireManageGuild(s, i) || !shared.RequireMeetingService(s, i) { return } data := i.ApplicationCommandData() if len(data.Options) == 0 { shared.RespondEphemeral(s, i, "Missing subcommand.") return } switch data.Options[0].Name { case "set-lobby": handleSetLobby(s, i) default: shared.RespondEphemeral(s, i, "Unknown subcommand.") } } func handleSetLobby(s *discordgo.Session, i *discordgo.InteractionCreate) { guildID, ok := shared.ParseGuildID(s, i) if !ok { return } optMap := shared.SubcommandOptionMap(i) channelOpt, ok := optMap["channel"] if !ok { shared.RespondEphemeral(s, i, "Missing channel option.") return } ch := channelOpt.ChannelValue(s) if ch == nil || ch.Type != discordgo.ChannelTypeGuildVoice { shared.RespondEphemeral(s, i, "Invalid voice channel.") return } channelID, err := strconv.ParseInt(ch.ID, 10, 64) if err != nil { shared.RespondEphemeral(s, i, "Invalid channel ID.") return } if err := services.Global.Meeting.SetLobbyChannel(context.Background(), guildID, channelID); err != nil { shared.RespondEphemeral(s, i, "Failed to set meeting lobby.") return } shared.RespondEphemeral(s, i, "Meeting lobby set to "+ch.Mention()+".") }