- middleware for whole interactions array
- Create Project handler method refactoring
This commit is contained in:
parent
b9614e4c45
commit
bbe678fa46
|
|
@ -21,35 +21,6 @@ func (h *Handler) defaultFollowUp(answer string, s *discordgo.Session, i *discor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) AllInteractions(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
|
||||||
|
|
||||||
dchan, err := s.Channel(i.ChannelID)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if dchan.Type == discordgo.ChannelTypeDM {
|
|
||||||
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
|
|
||||||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
|
||||||
Data: &discordgo.InteractionResponseData{
|
|
||||||
Content: "Yo, fella! I'm not working in private!",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Моментальный ответ для избежания столкновения с протуханием токена
|
|
||||||
initialResponse := discordgo.InteractionResponse{
|
|
||||||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
|
||||||
Data: &discordgo.InteractionResponseData{
|
|
||||||
Flags: discordgo.MessageFlagsEphemeral,
|
|
||||||
Content: "👩🍳 Cooking your query..",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
s.InteractionRespond(i.Interaction, &initialResponse)
|
|
||||||
}
|
|
||||||
|
|
||||||
// setFlag
|
// setFlag
|
||||||
// sets tag with In progress and Done text to discords channel;
|
// sets tag with In progress and Done text to discords channel;
|
||||||
func (h *Handler) setFlag(s *discordgo.Session, i *discordgo.InteractionCreate, tag *discordgo.ForumTag) error {
|
func (h *Handler) setFlag(s *discordgo.Session, i *discordgo.InteractionCreate, tag *discordgo.ForumTag) error {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"ticket-pimp/adapters"
|
"ticket-pimp/adapters"
|
||||||
"ticket-pimp/internal/controller"
|
"ticket-pimp/internal/controller"
|
||||||
"ticket-pimp/internal/domain"
|
"ticket-pimp/internal/domain"
|
||||||
|
"ticket-pimp/internal/helpers"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
)
|
)
|
||||||
|
|
@ -22,23 +23,30 @@ func New(
|
||||||
controller *controller.WorkflowController,
|
controller *controller.WorkflowController,
|
||||||
conf *domain.DiscordConfig,
|
conf *domain.DiscordConfig,
|
||||||
tg adapters.IDummyTelegram,
|
tg adapters.IDummyTelegram,
|
||||||
tags []discordgo.ForumTag,
|
|
||||||
) *Handler {
|
) *Handler {
|
||||||
return &Handler{
|
return &Handler{
|
||||||
controller: controller,
|
controller: controller,
|
||||||
conf: conf,
|
conf: conf,
|
||||||
telegramDummyClient: tg,
|
telegramDummyClient: tg,
|
||||||
tags: tags,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) SetAvailableTags(tags []discordgo.ForumTag) {
|
||||||
|
h.tags = append(h.tags, tags...)
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Handler) Ping(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
func (h *Handler) Ping(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
|
|
||||||
err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
|
var content string = fmt.Sprintf(
|
||||||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
"**Pong to:** %s\n**App ID:** %s\n**Guild ID:** %s\nC**hannelID:** %s",
|
||||||
Data: &discordgo.InteractionResponseData{
|
i.Member.User.Mention(),
|
||||||
Content: "Pong to: " + i.Member.User.Mention(),
|
i.AppID,
|
||||||
},
|
i.GuildID,
|
||||||
|
i.ChannelID,
|
||||||
|
)
|
||||||
|
|
||||||
|
_, err := s.FollowupMessageCreate(i.Interaction, false, &discordgo.WebhookParams{
|
||||||
|
Content: content,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
|
@ -46,8 +54,10 @@ func (h *Handler) Ping(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenPosts
|
// ListenPosts
|
||||||
// ..listens to new posts in specific channel
|
/*
|
||||||
// to act them like a task
|
..listens to new posts in specific channel
|
||||||
|
to act them like a task
|
||||||
|
*/
|
||||||
func (h *Handler) ListenPosts(s *discordgo.Session, th *discordgo.ThreadCreate) {
|
func (h *Handler) ListenPosts(s *discordgo.Session, th *discordgo.ThreadCreate) {
|
||||||
|
|
||||||
// Check if thread starter is not a bot, and thread started at the tasks channel;
|
// Check if thread starter is not a bot, and thread started at the tasks channel;
|
||||||
|
|
@ -77,7 +87,7 @@ func (h *Handler) ListenPosts(s *discordgo.Session, th *discordgo.ThreadCreate)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// [x] -- Отредактировать Thread name как для задачи
|
// Отредактировать Thread name как для задачи
|
||||||
_, err = s.ChannelEditComplex(th.ID, &discordgo.ChannelEdit{
|
_, err = s.ChannelEditComplex(th.ID, &discordgo.ChannelEdit{
|
||||||
Name: fmt.Sprintf("Task ID: %d, by %s", t.ID, t.Creator),
|
Name: fmt.Sprintf("Task ID: %d, by %s", t.ID, t.Creator),
|
||||||
})
|
})
|
||||||
|
|
@ -118,16 +128,10 @@ func (h *Handler) ListenPosts(s *discordgo.Session, th *discordgo.ThreadCreate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleTaskBurrons
|
// handleTaskButtons
|
||||||
// .. handler function to work with the Action Buttons over a task
|
// .. handler function to work with the Action Buttons over a task
|
||||||
func (h *Handler) HandleTaskButtons(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
func (h *Handler) HandleTaskButtons(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
|
|
||||||
// Send an empty interaction response; ----------------------------------------------------------------
|
|
||||||
// s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
|
|
||||||
// Type: discordgo.InteractionResponseUpdateMessage,
|
|
||||||
// Data: &discordgo.InteractionResponseData{},
|
|
||||||
// })
|
|
||||||
|
|
||||||
// Get assignee value; ---------------------------------------------------------------------------------
|
// Get assignee value; ---------------------------------------------------------------------------------
|
||||||
user := i.Member.User.Mention()
|
user := i.Member.User.Mention()
|
||||||
|
|
||||||
|
|
@ -212,6 +216,11 @@ func (h *Handler) HandleTaskButtons(s *discordgo.Session, i *discordgo.Interacti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateFolder
|
||||||
|
/*
|
||||||
|
- creates project's cloud folder;
|
||||||
|
- writed folder link to db;
|
||||||
|
*/
|
||||||
func (h *Handler) CreateFolder(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
func (h *Handler) CreateFolder(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
const (
|
const (
|
||||||
nameOption string = "folder_name"
|
nameOption string = "folder_name"
|
||||||
|
|
@ -276,6 +285,11 @@ func (h *Handler) CreateFolder(s *discordgo.Session, i *discordgo.InteractionCre
|
||||||
h.defaultFollowUp(result, s, i)
|
h.defaultFollowUp(result, s, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateGit
|
||||||
|
/*
|
||||||
|
-creates project's git repository;
|
||||||
|
- writed git link to db;
|
||||||
|
*/
|
||||||
func (h *Handler) CreateGit(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
func (h *Handler) CreateGit(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
const (
|
const (
|
||||||
repoType = "repo_type"
|
repoType = "repo_type"
|
||||||
|
|
@ -352,20 +366,12 @@ func (h *Handler) CreateGit(s *discordgo.Session, i *discordgo.InteractionCreate
|
||||||
h.defaultFollowUp(result, s, i)
|
h.defaultFollowUp(result, s, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROJECT
|
// ProjectInfo
|
||||||
|
/*
|
||||||
|
Message in chat with related project information
|
||||||
|
*/
|
||||||
func (h *Handler) ProjectInfo(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
func (h *Handler) ProjectInfo(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
|
var result string
|
||||||
|
|
||||||
// Get channel from the request
|
// Get channel from the request
|
||||||
|
|
@ -392,19 +398,12 @@ func (h *Handler) ProjectInfo(s *discordgo.Session, i *discordgo.InteractionCrea
|
||||||
h.defaultFollowUp(result, s, i)
|
h.defaultFollowUp(result, s, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InitChannelAsProject
|
||||||
|
/*
|
||||||
|
- makes channel-project raw in the db storage;
|
||||||
|
*/
|
||||||
func (h *Handler) InitChannelAsProject(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
func (h *Handler) InitChannelAsProject(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
|
var result string
|
||||||
|
|
||||||
// Get channel from the request
|
// Get channel from the request
|
||||||
|
|
@ -454,18 +453,12 @@ func (h *Handler) InitChannelAsProject(s *discordgo.Session, i *discordgo.Intera
|
||||||
h.defaultFollowUp(result, s, i)
|
h.defaultFollowUp(result, s, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) CreateTicket(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
// CreateProject
|
||||||
|
/*
|
||||||
// Моментальный ответ для избежания столкновения с протуханием токена
|
- creates new proejct in the db;
|
||||||
initialResponse := discordgo.InteractionResponse{
|
- creates new channel and writes it to db;
|
||||||
Type: discordgo.InteractionResponseChannelMessageWithSource,
|
*/
|
||||||
Data: &discordgo.InteractionResponseData{
|
func (h *Handler) CreateProject(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
Flags: discordgo.MessageFlagsEphemeral,
|
|
||||||
Content: "👩🍳 Cooking your query..",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
s.InteractionRespond(i.Interaction, &initialResponse)
|
|
||||||
|
|
||||||
var result string
|
var result string
|
||||||
// Access options in the order provided by the user.
|
// Access options in the order provided by the user.
|
||||||
|
|
@ -477,40 +470,63 @@ func (h *Handler) CreateTicket(s *discordgo.Session, i *discordgo.InteractionCre
|
||||||
optionMap[opt.Name] = opt
|
optionMap[opt.Name] = opt
|
||||||
}
|
}
|
||||||
|
|
||||||
if option, ok := optionMap["project_name"]; ok {
|
// Get Project's title from the request:
|
||||||
dchan, err := s.GuildChannelCreate(i.GuildID, option.StringValue(), discordgo.ChannelTypeGuildText)
|
var projectTitle string
|
||||||
if err != nil {
|
if option, ok := optionMap["project_name"]; !ok {
|
||||||
result = fmt.Sprintf("chan creation problem: %v\n", err)
|
return
|
||||||
} else {
|
} else {
|
||||||
p, err := h.controller.ProjectCreate(context.TODO(), domain.Project{
|
projectTitle = option.StringValue()
|
||||||
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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create channel with specified title
|
||||||
|
dchan, err := s.GuildChannelCreate(i.GuildID, projectTitle, discordgo.ChannelTypeGuildText)
|
||||||
|
if err != nil {
|
||||||
|
result = fmt.Sprintf("chan creation problem: %v\n", err)
|
||||||
|
h.defaultFollowUp(result, s, i)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create DB raw with new project:
|
||||||
|
p, err := h.controller.ProjectCreate(context.TODO(), domain.Project{
|
||||||
|
ChannelID: dchan.ID,
|
||||||
|
Name: projectTitle,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
result = fmt.Sprintf("unable to create project: %v\n", err)
|
||||||
|
|
||||||
|
// Revert channel creation:
|
||||||
|
_, err := s.ChannelDelete(dchan.ID)
|
||||||
|
if err != nil {
|
||||||
|
result += fmt.Sprintf("\nunable to clean channel: %v\n", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
h.defaultFollowUp(result, s, i)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit created channel:
|
||||||
|
edit := discordgo.ChannelEdit{
|
||||||
|
Name: p.Key + "-" + helpers.Cut(projectTitle),
|
||||||
|
ParentID: h.conf.IsProjectChannel,
|
||||||
|
}
|
||||||
|
|
||||||
|
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.Key, err)
|
||||||
|
h.defaultFollowUp(result, s, i)
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Отправить сообщение о создании проекта:
|
||||||
|
_, err = s.ChannelMessageSend(dchan.ID, p.DiscordString())
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("message send problem: %v\n", err)
|
||||||
|
result = "Project was created, but there is some problem with init channel message"
|
||||||
|
h.defaultFollowUp(result, s, i)
|
||||||
|
}
|
||||||
|
result = fmt.Sprintf("Project was created: https://discord.com/channels/%s/%s", i.GuildID, dchan.ID)
|
||||||
|
|
||||||
h.defaultFollowUp(result, s, i)
|
h.defaultFollowUp(result, s, i)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue