package commands import ( "strings" "github.com/bwmarrin/discordgo" ) func newSetupCommand() *Cmd { return &Cmd{ Command: &discordgo.ApplicationCommand{ Name: "setup", Description: "Configure your Thoughtful instance", }, Handler: handleSetup, } } func handleSetup(s *discordgo.Session, ic *discordgo.InteractionCreate) { err := s.InteractionRespond(ic.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseModal, Data: &discordgo.InteractionResponseData{ CustomID: "setup_modal", Title: "Thoughtful Setup", Components: []discordgo.MessageComponent{ discordgo.ActionsRow{ Components: []discordgo.MessageComponent{ discordgo.TextInput{ CustomID: "instance_url", Label: "Instance URL", Style: discordgo.TextInputShort, Placeholder: "https://your-thoughtful-instance.com", Required: true, }, }, }, discordgo.ActionsRow{ Components: []discordgo.MessageComponent{ discordgo.TextInput{ CustomID: "api_key", Label: "API Key", Style: discordgo.TextInputShort, Placeholder: "Your API Key", Required: true, }, }, }, }, }, }) if err != nil { // fallback if modal fails (rare) } } func handleSetupSubmit(s *discordgo.Session, ic *discordgo.InteractionCreate) { data := ic.ModalSubmitData() url := "" key := "" for _, comp := range data.Components { // ActionsRow -> TextInput if row, ok := comp.(*discordgo.ActionsRow); ok { for _, c := range row.Components { if input, ok := c.(*discordgo.TextInput); ok { if input.CustomID == "instance_url" { url = strings.TrimSpace(input.Value) } else if input.CustomID == "api_key" { key = strings.TrimSpace(input.Value) } } } } } // Normalize URL url = strings.TrimSuffix(url, "/") if url == "" || key == "" { s.InteractionRespond(ic.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Content: "Both URL and API Key are required.", Flags: discordgo.MessageFlagsEphemeral, }, }) return } user := ic.User if user == nil { user = ic.Member.User } err := SaveUserConfig(user.ID, UserConfig{ InstanceURL: url, APIKey: key, }) content := "Configuration saved successfully!" if err != nil { content = "Error saving configuration: " + err.Error() } s.InteractionRespond(ic.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Content: content, Flags: discordgo.MessageFlagsEphemeral, }, }) }