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) } }