79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
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,
|
|
},
|
|
})
|
|
},
|
|
}
|
|
}
|