package handler import ( "context" "fmt" "log" "ticket-pimp/internal/domain" "github.com/bwmarrin/discordgo" ) func (h *router) CreateTicketHandler(repoNameMinLength int) route { return route{ Command: discordgo.ApplicationCommand{ Name: "project", Description: "Create new development ticket", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionString, Name: "project_name", Description: "Temporary project name", Required: true, MinLength: &repoNameMinLength, }, }, }, Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { var result string // Access options in the order provided by the user. options := i.ApplicationCommandData().Options // Or convert the slice into a map optionMap := make(map[string]*discordgo.ApplicationCommandInteractionDataOption, len(options)) for _, opt := range options { optionMap[opt.Name] = opt } if option, ok := optionMap["project_name"]; ok { dchan, err := s.GuildChannelCreate(i.GuildID, option.StringValue(), discordgo.ChannelTypeGuildText) if err != nil { result = fmt.Sprintf("chan creation problem: %v\n", err) } else { p, err := h.controller.ProjectCreate(context.TODO(), domain.Project{ ChannelID: dchan.ID, }) if err != nil { result = fmt.Sprintf("unable to create project: %v\n", err) } else { edit := discordgo.ChannelEdit{ Name: p.ShortName, ParentID: "1150719794853716028", } dchan, err = s.ChannelEdit(dchan.ID, &edit) if err != nil { result = fmt.Sprintf("channel created, but unable to edit: %v\n", err) } else { _, err = s.ChannelMessageSend(dchan.ID, "Hello!") if err != nil { log.Printf("message send problem: %v\n", err) } result = dchan.ID } } } } s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ // Ignore type for now, they will be discussed in "responses" Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Content: result, }, }) }, } }