193 lines
5.3 KiB
Go
193 lines
5.3 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"ticket-pimp/internal/domain"
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
)
|
|
|
|
func (c *client) setFlag(s *discordgo.Session, i *discordgo.InteractionCreate, tag *discordgo.ForumTag) error {
|
|
|
|
th, err := s.Channel(i.ChannelID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
forum, err := s.Channel(th.ParentID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Проверка на существование тега в списке тегов:
|
|
if len(forum.AvailableTags) != 0 {
|
|
for _, some := range forum.AvailableTags {
|
|
if some.Name == tag.Name {
|
|
_, err := s.ChannelEditComplex(i.ChannelID, &discordgo.ChannelEdit{
|
|
AppliedTags: &[]string{some.ID},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *client) ListenPosts(s *discordgo.Session, th *discordgo.ThreadCreate) {
|
|
|
|
// Check if thread starter is not a bot, and thread started at the tasks channel;
|
|
if th.ParentID != c.conf.IsTaskForum || th.OwnerID == s.State.User.ID {
|
|
return
|
|
}
|
|
|
|
msgs, _ := s.ChannelMessages(th.ID, 1, "", "", "")
|
|
|
|
msg, _ := s.ChannelMessage(th.ID, msgs[0].ID)
|
|
|
|
if msg.Author.ID == s.State.User.ID {
|
|
return
|
|
}
|
|
|
|
content := th.Name
|
|
content += "\n" + msg.Content
|
|
|
|
user, _ := s.GuildMember(th.GuildID, msg.Author.ID)
|
|
|
|
t, err := c.controller.WriteTaskToDB(&domain.Task{
|
|
Description: content,
|
|
Creator: user.User.Mention(),
|
|
})
|
|
if err != nil {
|
|
s.ChannelMessageSend(th.ID, fmt.Sprintf("unable to write task to db, %v", err))
|
|
return
|
|
}
|
|
|
|
// [x] -- Отредактировать Thread name как для задачи
|
|
_, err = s.ChannelEditComplex(th.ID, &discordgo.ChannelEdit{
|
|
Name: fmt.Sprintf("Task ID: %d, by %s", t.ID, t.Creator),
|
|
})
|
|
if err != nil {
|
|
log.Printf("th edition is not complete: %v", err)
|
|
}
|
|
|
|
// Fix the original task message:
|
|
taskMessage, err := s.ChannelMessageSendComplex(th.ID, &discordgo.MessageSend{
|
|
Content: content,
|
|
Components: []discordgo.MessageComponent{
|
|
discordgo.ActionsRow{
|
|
Components: []discordgo.MessageComponent{
|
|
discordgo.Button{
|
|
Label: "Start",
|
|
Style: discordgo.SuccessButton,
|
|
Disabled: false,
|
|
CustomID: "task_start",
|
|
},
|
|
discordgo.Button{
|
|
Label: "Close",
|
|
Style: discordgo.DangerButton,
|
|
Disabled: true,
|
|
CustomID: "task_close",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
log.Printf("th start message edition is not complete: %v", err)
|
|
}
|
|
|
|
err = c.controller.UpdateTasksMessageID(context.TODO(), taskMessage.ID, t.ID)
|
|
if err != nil {
|
|
s.ChannelMessageSend(th.ID, fmt.Sprintf("unable to update task at the db, %v", err))
|
|
return
|
|
}
|
|
}
|
|
|
|
func (c *client) HandleTaskButtons() Component {
|
|
return Component{
|
|
Handler: c.handleTaskButton,
|
|
}
|
|
}
|
|
|
|
func (c *client) handleTaskButton(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; ---------------------------------------------------------------------------------
|
|
user := i.Member.User.Mention()
|
|
|
|
var (
|
|
opt int = -1
|
|
doneButtonIsDisabled bool = false
|
|
state domain.TaskState = domain.NewTaskState()
|
|
)
|
|
|
|
// Check what flow was touched: -------------------------------------------------------------------------
|
|
switch i.Interaction.MessageComponentData().CustomID {
|
|
case "task_start":
|
|
opt = 0
|
|
doneButtonIsDisabled = false
|
|
state = domain.InrpogressTaskState()
|
|
case "task_close":
|
|
opt = 1
|
|
doneButtonIsDisabled = true
|
|
state = domain.DoneTaskState()
|
|
}
|
|
|
|
// Send the task update to db --------------------------------------------------------------------------
|
|
convertable, err := c.controller.UpdateTask(i.Message.ID, opt, user)
|
|
if err != nil {
|
|
s.ChannelMessageSend(i.ChannelID, fmt.Sprintf("Unable to update task at the db w/ error: %v", err))
|
|
return
|
|
}
|
|
|
|
// Map DB's response to domain.Task: -------------------------------------------------------------------
|
|
newContent := convertable.
|
|
ExtractDomain().
|
|
DiscordMessage(state)
|
|
|
|
// Send a message to the thread about the task was started: ---------------------------------------------
|
|
_, err = s.ChannelMessageSendComplex(i.ChannelID, &discordgo.MessageSend{
|
|
Content: newContent,
|
|
})
|
|
if err != nil {
|
|
log.Printf("error while sending start task message: %v", err)
|
|
}
|
|
|
|
// Fix the original task message: ----------------------------------------------------------------------
|
|
_, err = s.ChannelMessageEditComplex(&discordgo.MessageEdit{
|
|
Channel: i.ChannelID,
|
|
ID: i.Message.ID,
|
|
Components: []discordgo.MessageComponent{
|
|
discordgo.ActionsRow{
|
|
Components: []discordgo.MessageComponent{
|
|
discordgo.Button{
|
|
Label: "Close",
|
|
Style: discordgo.DangerButton,
|
|
Disabled: doneButtonIsDisabled,
|
|
CustomID: "task_close",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
log.Printf("th start message edition is not complete: %v", err)
|
|
}
|
|
|
|
// Устанавливаем тэги статуса на тред ---------------------------------------------------------------------
|
|
err = c.setFlag(s, i, &c.Tags[opt])
|
|
if err != nil {
|
|
log.Printf("error while `start` tag setting: %v", err)
|
|
}
|
|
}
|