221 lines
6.1 KiB
Go
221 lines
6.1 KiB
Go
package handler
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"log"
|
||
"ticket-pimp/internal/domain"
|
||
|
||
"github.com/bwmarrin/discordgo"
|
||
)
|
||
|
||
func (c *client) GetInfo() Command {
|
||
return Command{
|
||
Command: discordgo.ApplicationCommand{
|
||
Name: "info",
|
||
Description: "Get project's info",
|
||
},
|
||
Handler: c.getInfo,
|
||
}
|
||
}
|
||
|
||
func (c *client) getInfo(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||
|
||
// Моментальный ответ для избежания столкновения с протуханием токена
|
||
initialResponse := discordgo.InteractionResponse{
|
||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
||
Data: &discordgo.InteractionResponseData{
|
||
Flags: discordgo.MessageFlagsEphemeral,
|
||
Content: "👩🍳 Cooking your query..",
|
||
},
|
||
}
|
||
|
||
s.InteractionRespond(i.Interaction, &initialResponse)
|
||
|
||
var result string
|
||
|
||
// Get channel from the request
|
||
dchan, err := s.Channel(i.ChannelID)
|
||
if err != nil {
|
||
result = "unable to get channel from the message"
|
||
} else {
|
||
project, err := c.controller.GetProjectByChannelID(context.TODO(), dchan.ID)
|
||
if err != nil {
|
||
result = err.Error()
|
||
} else {
|
||
if project != nil {
|
||
result = project.DiscordString()
|
||
if err != nil {
|
||
result += "Errors: " + err.Error()
|
||
}
|
||
} else {
|
||
result = "Something wrong with retrieving project from db"
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
c.defaultFollowUp(result, s, i)
|
||
}
|
||
|
||
func (c *client) InitProjectFromChannel(minLength int) Command {
|
||
return Command{
|
||
Command: discordgo.ApplicationCommand{
|
||
Name: "init_project",
|
||
Description: "Connect project with Coda ID",
|
||
Options: []*discordgo.ApplicationCommandOption{
|
||
{
|
||
Type: discordgo.ApplicationCommandOptionString,
|
||
Name: "key",
|
||
Description: "Project's key from Coda.io",
|
||
Required: true,
|
||
MinLength: &minLength,
|
||
},
|
||
},
|
||
},
|
||
Handler: c.initProjectFromChannel,
|
||
}
|
||
}
|
||
|
||
func (c *client) initProjectFromChannel(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||
|
||
// Моментальный ответ для избежания столкновения с протуханием токена
|
||
initialResponse := discordgo.InteractionResponse{
|
||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
||
Data: &discordgo.InteractionResponseData{
|
||
Flags: discordgo.MessageFlagsEphemeral,
|
||
Content: "👩🍳 Cooking your query..",
|
||
},
|
||
}
|
||
|
||
s.InteractionRespond(i.Interaction, &initialResponse)
|
||
|
||
var result string
|
||
|
||
// Get channel from the request
|
||
dchan, err := s.Channel(i.ChannelID)
|
||
if err != nil {
|
||
result = "unable to get channel from the message"
|
||
} else {
|
||
if dchan.ParentID != c.conf.IsProjectChannel {
|
||
// Sending result:
|
||
_, err := s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{
|
||
Content: "This channel is not at the project's group",
|
||
})
|
||
|
||
if err != nil {
|
||
s.FollowupMessageCreate(i.Interaction, true, &discordgo.WebhookParams{
|
||
Content: fmt.Sprintf("Something went wrong: %v", err),
|
||
})
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
// 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["key"]; ok {
|
||
var errMsg error = nil
|
||
|
||
project, err := c.controller.InitProjectInChannel(context.TODO(), i.ChannelID, option.StringValue())
|
||
if err != nil {
|
||
result = fmt.Sprintf("unable to init project: %v", err)
|
||
} else {
|
||
result = project.DiscordString()
|
||
if errMsg != nil {
|
||
result += "Errors: " + errMsg.Error()
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
c.defaultFollowUp(result, s, i)
|
||
}
|
||
|
||
func (c *client) CreateTicketHandler(repoNameMinLength int) Command {
|
||
return Command{
|
||
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: c.createTicketHandler,
|
||
}
|
||
}
|
||
|
||
func (c *client) createTicketHandler(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||
|
||
// Моментальный ответ для избежания столкновения с протуханием токена
|
||
initialResponse := discordgo.InteractionResponse{
|
||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
||
Data: &discordgo.InteractionResponseData{
|
||
Flags: discordgo.MessageFlagsEphemeral,
|
||
Content: "👩🍳 Cooking your query..",
|
||
},
|
||
}
|
||
|
||
s.InteractionRespond(i.Interaction, &initialResponse)
|
||
|
||
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 := c.controller.ProjectCreate(context.TODO(), domain.Project{
|
||
ChannelID: dchan.ID,
|
||
})
|
||
if err != nil {
|
||
result = fmt.Sprintf("unable to create project: %v\n", err)
|
||
_, err := s.ChannelDelete(dchan.ID)
|
||
if err != nil {
|
||
result += fmt.Sprintf("\nunable to clean channel: %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 %s created, but unable to edit follow up message: %v\n", p.ShortName, err)
|
||
|
||
} else {
|
||
_, err = s.ChannelMessageSend(dchan.ID, "Hello!")
|
||
if err != nil {
|
||
log.Printf("message send problem: %v\n", err)
|
||
}
|
||
result = "Project " + p.ShortName + "Was created"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
c.defaultFollowUp(result, s, i)
|
||
}
|