diff --git a/client/discord/discord.go b/client/discord/discord.go index 7cdc5e9..d2c7dfa 100644 --- a/client/discord/discord.go +++ b/client/discord/discord.go @@ -16,12 +16,12 @@ import ( ) var ( - minLength int = 3 - repoType string = "repo_type" - projectRepo string = "project_repo" - buildRepo string = "build_repo" - nameOption string = "name" - tagsPreset = [3]discordgo.ForumTag{ + // minLength int = 3 + // repoType string = "repo_type" + // projectRepo string = "project_repo" + // buildRepo string = "build_repo" + // nameOption string = "name" + tagsPreset = [3]discordgo.ForumTag{ { Name: "В работе", Moderated: true, @@ -38,88 +38,89 @@ var ( EmojiName: "🚧", }, } - commands = []discordgo.ApplicationCommand{ - { - Name: "ping", - Description: "pongs in a reply", - }, - { - Name: "coda_ticket", - Description: "Creates ticket in Coda.io w/ provided info", - }, - { - 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, - }, - }, - }, - { - Name: "project", - Description: "Create new development ticket", - Options: []*discordgo.ApplicationCommandOption{ - { - Type: discordgo.ApplicationCommandOptionString, - Name: "project_name", - Description: "Temporary project name", - Required: true, - MinLength: &minLength, - }, - }, - }, - { - Name: "info", - Description: "Get project's info", - }, - { - Name: "repo", - Description: "Creates repository of selected type. Name used for projects channels only", - Options: []*discordgo.ApplicationCommandOption{ - { - Type: discordgo.ApplicationCommandOptionString, - Name: repoType, - Description: "The type of repo", - Required: true, - Choices: []*discordgo.ApplicationCommandOptionChoice{ - { - Name: "Unity project repo", - Value: projectRepo, - }, - { - Name: "XCode build repo", - Value: buildRepo, - }, - }, - }, - { - Type: discordgo.ApplicationCommandOptionString, - Name: nameOption, - Description: "Type the repository's name", - Required: false, - MinLength: &minLength, - }, - }, - }, - { - Name: "folder", - Description: "Command for cloud folder creation", - Options: []*discordgo.ApplicationCommandOption{ - { - Type: discordgo.ApplicationCommandOptionString, - Name: nameOption, - Description: "Type the folder's name", - Required: false, - MinLength: &minLength, - }, - }, - }, - } + +// commands = []discordgo.ApplicationCommand{ +// { +// Name: "ping", +// Description: "pongs in a reply", +// }, +// { +// Name: "coda_ticket", +// Description: "Creates ticket in Coda.io w/ provided info", +// }, +// { +// 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, +// }, +// }, +// }, +// { +// Name: "project", +// Description: "Create new development ticket", +// Options: []*discordgo.ApplicationCommandOption{ +// { +// Type: discordgo.ApplicationCommandOptionString, +// Name: "project_name", +// Description: "Temporary project name", +// Required: true, +// MinLength: &minLength, +// }, +// }, +// }, +// { +// Name: "info", +// Description: "Get project's info", +// }, +// { +// Name: "repo", +// Description: "Creates repository of selected type. Name used for projects channels only", +// Options: []*discordgo.ApplicationCommandOption{ +// { +// Type: discordgo.ApplicationCommandOptionString, +// Name: repoType, +// Description: "The type of repo", +// Required: true, +// Choices: []*discordgo.ApplicationCommandOptionChoice{ +// { +// Name: "Unity project repo", +// Value: projectRepo, +// }, +// { +// Name: "XCode build repo", +// Value: buildRepo, +// }, +// }, +// }, +// { +// Type: discordgo.ApplicationCommandOptionString, +// Name: nameOption, +// Description: "Type the repository's name", +// Required: false, +// MinLength: &minLength, +// }, +// }, +// }, +// { +// Name: "folder", +// Description: "Command for cloud folder creation", +// Options: []*discordgo.ApplicationCommandOption{ +// { +// Type: discordgo.ApplicationCommandOptionString, +// Name: nameOption, +// Description: "Type the folder's name", +// Required: false, +// MinLength: &minLength, +// }, +// }, +// }, +// } ) func initBotWith(token string) *discordgo.Session { @@ -195,36 +196,43 @@ func updateForum(conf *domain.Config, s *discordgo.Session) ([]discordgo.ForumTa return dchan.AvailableTags, nil } -func commandRegistration(s *discordgo.Session, commands []discordgo.ApplicationCommand) []*discordgo.ApplicationCommand { - oldCommands, err := s.ApplicationCommands(s.State.User.ID, s.State.Application.GuildID) - if err != nil { - log.Panicf("Cannot get old commands: %v", err) - } +// commandRegistration +// unused, cause method was deprecated; +// func commandRegistration(s *discordgo.Session, commands []discordgo.ApplicationCommand) []*discordgo.ApplicationCommand { +// oldCommands, err := s.ApplicationCommands(s.State.User.ID, s.State.Application.GuildID) +// if err != nil { +// log.Panicf("Cannot get old commands: %v", err) +// } - var removedCommands []string - for _, cmd := range oldCommands { - err := s.ApplicationCommandDelete(s.State.User.ID, s.State.Application.GuildID, cmd.ID) - if err != nil { - log.Printf("commands removed: %v", removedCommands) - log.Panicf("removing old comands failed with %s command, err: %v", cmd.Name, err) - } - removedCommands = append(removedCommands, cmd.Name) - } - log.Printf("commands removed: %v", removedCommands) +// var removedCommands []string +// for _, cmd := range oldCommands { +// err := s.ApplicationCommandDelete(s.State.User.ID, s.State.Application.GuildID, cmd.ID) +// if err != nil { +// log.Printf("commands removed: %v", removedCommands) +// log.Panicf("removing old comands failed with %s command, err: %v", cmd.Name, err) +// } +// removedCommands = append(removedCommands, cmd.Name) +// } +// log.Printf("commands removed: %v", removedCommands) - log.Println("Adding commands...") - var cmds []*discordgo.ApplicationCommand - for _, cmd := range commands { - cmd, err := s.ApplicationCommandCreate(s.State.User.ID, "", &cmd) - if err != nil { - log.Panicf("Cannot create '%v' command: %v", cmd.Name, err) - } - cmds = append(cmds, cmd) - log.Println(cmd.Name + " command added") - } - return cmds -} +// log.Println("Adding commands...") +// var cmds []*discordgo.ApplicationCommand +// for _, cmd := range commands { +// cmd, err := s.ApplicationCommandCreate(s.State.User.ID, "", &cmd) +// if err != nil { +// log.Panicf("Cannot create '%v' command: %v", cmd.Name, err) +// } +// cmds = append(cmds, cmd) +// log.Println(cmd.Name + " command added") +// } +// return cmds +// } +// Run - метод +// +// 1. Инициализирует бота Discord, создаёт некоторое подобие роутера +// 2. Объявляет доступные роутинги +// 3. Объявляет доступные для роутов хэндлеры func Run(conf *domain.Config, opts DiscordOptions) error { // bot init @@ -239,19 +247,21 @@ func Run(conf *domain.Config, opts DiscordOptions) error { r := discord_router.NewApp(s) - var commonMw = []discord_router.Middleware{ - h.WithInitialResponse, - h.RejectPM, - } + // Depretated + // var commonMw = []discord_router.Middleware{ + // h.WithInitialResponse, + // h.RejectPM, + // } - r.Use(commonMw...). - Route("ping", h.Ping). - Route("project", h.CreateProject). - Route("info", h.ProjectInfo). - Route("repo", h.CreateGit). - Route("folder", h.CreateFolder). - Route("init_project", h.InitChannelAsProject). - Route("coda_ticket", h.CreateCoda) + // Depretated + // r.Use(commonMw...). + // Route("ping", h.Ping). + // Route("project", h.CreateProject). + // Route("info", h.ProjectInfo). + // Route("repo", h.CreateGit). + // Route("folder", h.CreateFolder). + // Route("init_project", h.InitChannelAsProject). + // Route("coda_ticket", h.CreateCoda) // and components r. @@ -280,7 +290,7 @@ func Run(conf *domain.Config, opts DiscordOptions) error { h.SetAvailableTags(tags) // commands registration - cmds := commandRegistration(s, commands) + // cmds := commandRegistration(s, commands) // gracefull shutdown defer s.Close() @@ -289,12 +299,12 @@ func Run(conf *domain.Config, opts DiscordOptions) error { <-stop log.Println("Graceful shutdown") - log.Println("Removing commands...") - for _, h := range cmds { - err := s.ApplicationCommandDelete(s.State.User.ID, "", h.ID) - if err != nil { - log.Panicf("Cannot delete '%v' command: %v", h.Name, err) - } - } + // log.Println("Removing commands...") + // for _, h := range cmds { + // err := s.ApplicationCommandDelete(s.State.User.ID, "", h.ID) + // if err != nil { + // log.Panicf("Cannot delete '%v' command: %v", h.Name, err) + // } + // } return nil } diff --git a/client/discord/discord_handler/discord_handler.go b/client/discord/discord_handler/discord_handler.go index 6281095..063ee43 100644 --- a/client/discord/discord_handler/discord_handler.go +++ b/client/discord/discord_handler/discord_handler.go @@ -119,10 +119,9 @@ func (h *Handler) Ping(s *discordgo.Session, i *discordgo.InteractionCreate) { } // 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) { // Check if thread starter is not a bot, and thread started at the tasks channel; @@ -133,6 +132,12 @@ func (h *Handler) ListenPosts(s *discordgo.Session, th *discordgo.ThreadCreate) // Get all messages from the channel: msgs, _ := s.ChannelMessages(th.ID, 1, "", "", "") + if len(msgs) == 0 { + log.Println("msgs are empty") + s.ChannelMessageSend(th.ID, "чет пошло не так, пингани @naudachu плиз") + return + + } // Take the first one: msg, _ := s.ChannelMessage(th.ID, msgs[0].ID) @@ -313,10 +318,9 @@ func (h *Handler) HandleTaskButtons(s *discordgo.Session, i *discordgo.Interacti } // CreateFolder -/* - - creates project's cloud folder; - - writed folder link to db; -*/ +// +// - creates project's cloud folder; +// - writed folder link to db; func (h *Handler) CreateFolder(s *discordgo.Session, i *discordgo.InteractionCreate) { const ( nameOption string = "folder_name" @@ -347,14 +351,14 @@ func (h *Handler) CreateFolder(s *discordgo.Session, i *discordgo.InteractionCre // Creating request: var req controller.FolderRequest name, insertedValueNotNil := optionMap[nameOption] - dchan, err := s.Channel(i.ChannelID) + currentChannel, err := s.Channel(i.ChannelID) if err != nil { log.Printf("error while identifying channel: %v", err) } else { - if dchan.ParentID == h.conf.IsProjectChannel { - req.ChannelID = dchan.ID + if currentChannel.ParentID == h.conf.IsProjectChannel { + req.ChannelID = currentChannel.ID if insertedValueNotNil { req.InsertedName = name.StringValue() } diff --git a/internal/controller/control_project.go b/internal/controller/control_project.go index 460805f..895afc9 100644 --- a/internal/controller/control_project.go +++ b/internal/controller/control_project.go @@ -11,6 +11,10 @@ import ( "github.com/jackc/pgx/v5/pgtype" ) +// Get - *not used* +// +// Достаёт запись из таблицы config +// config - ключ приложений и номер последнего созданного приложения (// todo или следующего?) func (wc *WorkflowController) Get(ctx context.Context) (*domain.ApplicationConfig, error) { c, err := wc.q.GetConfig(ctx) return &domain.ApplicationConfig{ diff --git a/internal/controller/control_task.go b/internal/controller/control_task.go index 345ee28..3371729 100644 --- a/internal/controller/control_task.go +++ b/internal/controller/control_task.go @@ -12,12 +12,11 @@ import ( ) // WriteTaskToDB -/* -Makes an SQL query to create new tasks row from domain.Task entity - - Creator field: telegram nickname or Discord's Mention(); - - Creator link (tg ID) in telegram case; - - Description from telegram/discord message bodies; -*/ +// +// Makes an SQL query to create new tasks row from domain.Task entity +// - Creator field: telegram nickname or Discord's Mention(); +// - Creator link (tg ID) in telegram case; +// - Description from telegram/discord message bodies; func (wc *WorkflowController) WriteTaskToDB(t *domain.Task) (*domain.Task, error) { dbtask, err := wc.q.InsertTask(context.TODO(), db.InsertTaskParams{ Creator: pgtype.Text{String: t.Creator, Valid: true}, diff --git a/internal/external/coda.go b/internal/external/coda.go index 6d04afe..d77f792 100644 --- a/internal/external/coda.go +++ b/internal/external/coda.go @@ -76,21 +76,6 @@ func (c *Coda) CreateApp(task domain.CodaApplication) (string, error) { return "", fmt.Errorf("unexpected coda response: %s", whResponse.ReqID) } - // arr := strings.Split(whResponse.ReqID, sep) - // if arr[0] == "mutate" { - // mutate = arr[1] - // } - - // mutateResponse, err := c.R(). - // SetContentType("application/json"). - // SetBearerAuthToken(c.Config.Develop). - // Get(fmt.Sprintf("/mutationStatus/%s", mutate)) - - // if err != nil { - // return "", fmt.Errorf("unable to get coda mutate result: %s", mutate) - // } - - // _ = mutateResponse return whResponse.ReqID, nil } diff --git a/readme.md b/readme.md index 486af4c..39ce625 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ Подготовка контейнера проекта: 1. Поменять в коде файл окружения на '.env' 2. Собрать контейнер: `docker build -t naudachu/pimp-containerized:latest --pull .` -3. Затолкать контейнер в docker hub: `docker push naudachu/pimp-containerized:latest` +3. Затолкать контейнер в docker hub: `docker push naudachu/pimp-containerized:latest` (надо залогинится мб `docker login -u naudachu --password-stdin`) # Запуск контейнера на сервере: 1. Вытягиваем новый образ: `scp ./compose.yaml root@serverhost:~/compose.yaml`