diff --git a/README.md b/README.md index 7a16373..3ab9cf6 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Initially this project was created for integrating Gitlab and Gitea into Matrix, because there was no good incoming webhooks support. But it can be used for anything that provides Slack Webhooks support. +Join #opensaps:pztrn.name Matrix room for help and chat! + # Installation ``` diff --git a/context/context.go b/context/context.go index a8dee20..d5f603e 100644 --- a/context/context.go +++ b/context/context.go @@ -81,7 +81,7 @@ func (c *Context) RegisterSlackAPIServerInterface(sasi slackapiserverinterface.S c.SlackAPIServer.Initialize() } -func (c *Context) SendToParser(name string, message slackmessage.SlackMessage) map[string]string { +func (c *Context) SendToParser(name string, message slackmessage.SlackMessage) map[string]interface{} { parser, found := c.Parsers[strings.ToLower(name)] if !found { c.Log.Errorf("Parser '%s' not found, will use default one!", name) diff --git a/opensaps.go b/opensaps.go index f624a82..0450334 100644 --- a/opensaps.go +++ b/opensaps.go @@ -27,8 +27,6 @@ import ( "gitlab.com/pztrn/opensaps/config" "gitlab.com/pztrn/opensaps/context" "gitlab.com/pztrn/opensaps/parsers/default" - "gitlab.com/pztrn/opensaps/parsers/gitea" - "gitlab.com/pztrn/opensaps/parsers/gitlab" "gitlab.com/pztrn/opensaps/pushers/matrix" "gitlab.com/pztrn/opensaps/pushers/telegram" "gitlab.com/pztrn/opensaps/slack" @@ -50,8 +48,6 @@ func main() { // Initialize parsers. defaultparser.New(c) - giteaparser.New(c) - gitlabparser.New(c) // Initialize pushers. matrixpusher.New(c) diff --git a/parsers/default/defaultparser.go b/parsers/default/defaultparser.go index 974fc54..10fa327 100644 --- a/parsers/default/defaultparser.go +++ b/parsers/default/defaultparser.go @@ -18,6 +18,9 @@ package defaultparser import ( + // stdlib + "regexp" + // local "gitlab.com/pztrn/opensaps/slack/message" ) @@ -28,10 +31,26 @@ func (dp DefaultParser) Initialize() { c.Log.Infoln("Initializing default parser...") } -func (dp DefaultParser) ParseMessage(message slackmessage.SlackMessage) map[string]string { +func (dp DefaultParser) ParseMessage(message slackmessage.SlackMessage) map[string]interface{} { c.Log.Debugln("Parsing default message...") - data := make(map[string]string) - data["message"] = message.Text + msg := message.Text + "\n" + for _, attachment := range message.Attachments { + msg += attachment.Text + "\n" + } + + // Get all links from message. + r := regexp.MustCompile("((https??://[a-zA-Z0-9.#!*/ _-]+)\\|([a-zA-Z0-9.#!*/ _+-]+))") + foundLinks := r.FindAllStringSubmatch(msg, -1) + + // Replace them. + /*for _, link := range foundLinks { + c.Log.Debugln("Link:", link) + msg = strings.Replace(msg, "<"+link[0]+">", ""+link[3]+"", 1) + }*/ + + data := make(map[string]interface{}) + data["message"] = msg + data["links"] = foundLinks return data } diff --git a/parsers/gitea/exported.go b/parsers/gitea/exported.go deleted file mode 100644 index e1c2701..0000000 --- a/parsers/gitea/exported.go +++ /dev/null @@ -1,34 +0,0 @@ -// OpenSAPS - Open Slack API server for everyone. -// -// Copyright (c) 2017, Stanislav N. aka pztrn. -// All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -package giteaparser - -import ( - // local - "gitlab.com/pztrn/opensaps/context" - "gitlab.com/pztrn/opensaps/parsers/interface" -) - -var ( - c *context.Context -) - -func New(cc *context.Context) { - c = cc - gp := GiteaParser{} - c.RegisterParserInterface("gitea", parserinterface.ParserInterface(gp)) -} diff --git a/parsers/gitea/giteaparser.go b/parsers/gitea/giteaparser.go deleted file mode 100644 index eb8ed5e..0000000 --- a/parsers/gitea/giteaparser.go +++ /dev/null @@ -1,256 +0,0 @@ -// OpenSAPS - Open Slack API server for everyone. -// -// Copyright (c) 2017, Stanislav N. aka pztrn. -// All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -package giteaparser - -import ( - // stdlib - "fmt" - "regexp" - "strconv" - "strings" - - // local - "gitlab.com/pztrn/opensaps/slack/message" -) - -type GiteaParser struct{} - -func (gp GiteaParser) Initialize() { - c.Log.Infoln("Initializing Gitea parser...") -} - -func (gp GiteaParser) parseBranchNew(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo} | Branch: {branch}] {header_message}." - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["repo"] = header_data[0][1] - data["repo_url"] = header_data[0][0] - data["branch"] = header_data[1][1] - data["branch_url"] = header_data[1][0] - - header_msg := strings.Split(message.Text, "] ")[1] - data["header_message"] = header_msg - - return data -} - -func (gp GiteaParser) cutLinks(data string) [][]string { - c.Log.Debugln("Passed:", data) - - r := regexp.MustCompile("((https??://[a-zA-Z0-9.#!*/ _-]+)\\|([a-zA-Z0-9.#!*/ _+-]+))") - - found := r.FindAllStringSubmatch(data, -1) - - // [i][0] - link - // [i][1] - string for link - var result [][]string - for i := range found { - res := make([]string, 0, 2) - res = append(res, found[i][2]) - res = append(res, found[i][3]) - result = append(result, res) - } - - c.Log.Debugln("Links cutted:", result) - return result -} - -func (gp GiteaParser) parseCommitNew(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo} | Branch: {branch}] {header_message}{newline}{repeatables}" - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["repo"] = header_data[0][1] - data["repo_url"] = header_data[0][0] - data["branch"] = header_data[1][1] - data["branch_url"] = header_data[1][0] - - header_msg := strings.Split(message.Text, "] ")[1] - data["header_message"] = header_msg - - // Parse commits. - data["repeatable_message"] = "{commit}: {message}{newline}" - data["repeatables"] = "commit,message" - idx := 0 - for i := range message.Attachments { - attachment_link := gp.cutLinks(message.Attachments[i].Text) - data["repeatable_item_commit"+strconv.Itoa(idx)] = attachment_link[0][1] - data["repeatable_item_commit"+strconv.Itoa(idx)+"_url"] = attachment_link[0][0] - data["repeatable_item_message"+strconv.Itoa(idx)] = strings.Split(message.Attachments[i].Text, ">: ")[1] - - idx += 1 - } - data["repeatables_count"] = strconv.Itoa(idx) - - return data -} - -func (gp GiteaParser) ParseMessage(message slackmessage.SlackMessage) map[string]string { - c.Log.Debugln("Parsing Gitea message...") - - var data map[string]string - if strings.Contains(message.Text, "new commit") && strings.Contains(message.Text, "pushed by ") { - data = gp.parseCommitNew(message) - } else if strings.Contains(message.Text, "Pull request closed") { - data = gp.parsePullRequestClosed(message) - } else if strings.Contains(message.Text, "Pull request edited") { - data = gp.parsePullRequestEdited(message) - } else if strings.Contains(message.Text, "Pull request labels updated") { - data = gp.parsePullRequestLabelsUpdated(message) - } else if strings.Contains(message.Text, "Pull request merged") { - data = gp.parsePullRequestMerged(message) - } else if strings.Contains(message.Text, "Pull request re-opened") { - data = gp.parsePullRequestReopened(message) - } else if strings.Contains(message.Text, "Pull request submitted") { - data = gp.parsePullRequestSubmitted(message) - } else if strings.Contains(message.Text, "branch created by") { - data = gp.parseBranchNew(message) - } else { - return map[string]string{"message": "Unknown message type:
" + fmt.Sprintf("%+v", message)} - } - - c.Log.Debugln("Message:", fmt.Sprintf("%+x", data)) - - return data -} - -func (gp GiteaParser) parsePullRequestClosed(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo}] Pull request {pr} by {user} was closed." - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["pr"] = header_data[0][1] - data["pr_url"] = header_data[0][0] - data["user"] = header_data[1][1] - data["user_url"] = header_data[1][0] - - repo := strings.Split(message.Text, "Pull request")[0] - repo = strings.TrimLeft(repo, "[") - repo = strings.TrimRight(repo, "] ") - data["repo"] = repo - - return data -} - -func (gp GiteaParser) parsePullRequestEdited(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo}] Pull request {pr} was edited by {user}." - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["pr"] = header_data[0][1] - data["pr_url"] = header_data[0][0] - data["user"] = header_data[1][1] - data["user_url"] = header_data[1][0] - - repo := strings.Split(message.Text, "Pull request")[0] - repo = strings.TrimLeft(repo, "[") - repo = strings.TrimRight(repo, "] ") - data["repo"] = repo - - return data -} - -func (gp GiteaParser) parsePullRequestLabelsUpdated(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo}] Pull request {pr} by {user} labels was updated." - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["pr"] = header_data[0][1] - data["pr_url"] = header_data[0][0] - data["user"] = header_data[1][1] - data["user_url"] = header_data[1][0] - - repo := strings.Split(message.Text, "Pull request")[0] - repo = strings.TrimLeft(repo, "[") - repo = strings.TrimRight(repo, "] ") - data["repo"] = repo - - return data -} - -func (gp GiteaParser) parsePullRequestMerged(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo}] Pull request {pr} by {user} was merged." - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["pr"] = header_data[0][1] - data["pr_url"] = header_data[0][0] - data["user"] = header_data[1][1] - data["user_url"] = header_data[1][0] - - repo := strings.Split(message.Text, "Pull request")[0] - repo = strings.TrimLeft(repo, "[") - repo = strings.TrimRight(repo, "] ") - data["repo"] = repo - - return data -} - -func (gp GiteaParser) parsePullRequestReopened(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo}] Pull request {pr} by {user} was re-opened." - - // Parse header. - // [0] is repo, [1] is branch. - header_data := gp.cutLinks(message.Text) - data["pr"] = header_data[0][1] - data["pr_url"] = header_data[0][0] - data["user"] = header_data[1][1] - data["user_url"] = header_data[1][0] - - repo := strings.Split(message.Text, "Pull request")[0] - repo = strings.TrimLeft(repo, "[") - repo = strings.TrimRight(repo, "] ") - data["repo"] = repo - - return data -} - -func (gp GiteaParser) parsePullRequestSubmitted(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[Repo: {repo}] Pull request {pr} submitted by {user}." - - header_data := gp.cutLinks(message.Text) - data["user"] = header_data[0][1] - data["user_url"] = header_data[0][0] - - repo := strings.Split(message.Text, "Pull request")[0] - repo = strings.TrimLeft(repo, "[") - repo = strings.TrimRight(repo, "] ") - data["repo"] = repo - - // There is a pull request description in attachments. - prdata := gp.cutLinks(message.Attachments[0].Title) - data["pr"] = prdata[0][1] - data["pr_url"] = prdata[0][0] - - return data -} diff --git a/parsers/gitlab/exported.go b/parsers/gitlab/exported.go deleted file mode 100644 index fe362b7..0000000 --- a/parsers/gitlab/exported.go +++ /dev/null @@ -1,34 +0,0 @@ -// OpenSAPS - Open Slack API server for everyone. -// -// Copyright (c) 2017, Stanislav N. aka pztrn. -// All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -package gitlabparser - -import ( - // local - "gitlab.com/pztrn/opensaps/context" - "gitlab.com/pztrn/opensaps/parsers/interface" -) - -var ( - c *context.Context -) - -func New(cc *context.Context) { - c = cc - gp := GitlabParser{} - c.RegisterParserInterface("gitlab", parserinterface.ParserInterface(gp)) -} diff --git a/parsers/gitlab/gitlabparser.go b/parsers/gitlab/gitlabparser.go deleted file mode 100644 index 9ff85a7..0000000 --- a/parsers/gitlab/gitlabparser.go +++ /dev/null @@ -1,350 +0,0 @@ -// OpenSAPS - Open Slack API server for everyone. -// -// Copyright (c) 2017, Stanislav N. aka pztrn. -// All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -package gitlabparser - -import ( - // stdlib - "fmt" - "regexp" - "strconv" - "strings" - - // local - "gitlab.com/pztrn/opensaps/slack/message" -) - -type GitlabParser struct{} - -func (gp GitlabParser) cutLinks(data string) [][]string { - r := regexp.MustCompile("((https??://[a-zA-Z0-9.#!*/ _-]+)\\|([a-zA-Z0-9.#!*/ _+-]+))") - - found := r.FindAllStringSubmatch(data, -1) - - // [i][0] - link - // [i][1] - string for link - var result [][]string - for i := range found { - res := make([]string, 0, 2) - res = append(res, found[i][2]) - res = append(res, found[i][3]) - result = append(result, res) - } - - c.Log.Debugln("Links cutted:", result) - return result -} - -func (gp GitlabParser) Initialize() { - c.Log.Infoln("Initializing Gitlab parser...") -} - -func (gp GitlabParser) parseCommit(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{repo}] {user} pushed to {branch}, {compare_changes}. Commits:{newline}{repeatables}" - data["user"] = strings.TrimSpace(strings.Split(message.Text, "pushed to")[0]) - - // Parse links. - links_data := gp.cutLinks(message.Text) - data["branch"] = links_data[0][1] - data["branch_url"] = links_data[0][0] - data["repo"] = links_data[1][1] - data["repo_url"] = links_data[1][0] - data["compare_changes"] = "compare changes" - data["compare_changes_url"] = links_data[2][0] - - // Parse commits. - data["repeatable_message"] = "{commit}: {commit_text}" - data["repeatables"] = "commit,commit_text" - idx := 0 - for i := range message.Attachments { - commit_data := gp.cutLinks(message.Attachments[i].Text) - data["repeatable_item_commit"+strconv.Itoa(idx)] = commit_data[0][1] - data["repeatable_item_commit"+strconv.Itoa(idx)+"_url"] = commit_data[0][0] - data["repeatable_item_commit_text"+strconv.Itoa(idx)] = strings.Split(message.Attachments[i].Text, ">: ")[1] - - idx += 1 - } - data["repeatables_count"] = strconv.Itoa(idx) - - return data -} - -func (gp GitlabParser) parseCommitLinks(data string) [][]string { - r := regexp.MustCompile("((htt[?p|ps]://[a-zA-Z0-9./-]+)\\|([a-zA-Z0-9./ _-]+))") - - found := r.FindAllStringSubmatch(data, -1) - - // [i][0] - link - // [i][1] - string for link - var result [][]string - for i := range found { - res := make([]string, 0, 2) - res = append(res, found[i][2]) - res = append(res, found[i][3]) - result = append(result, res) - } - - c.Log.Debugln("Links cutted:", result) - return result -} - -func (gp GitlabParser) parseIssueClosed(text string) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} closed issue {issue}" - - // User name comes after "closed by" words. - data["user"] = strings.Split(text, "closed by ")[1] - - // Parse links. - // Same as for parseIssueComment because this regexp returns - // needed data. - links_data := gp.cutLinks(text) - data["project"] = links_data[0][1] - data["project_url"] = links_data[0][0] - data["issue"] = links_data[1][1] - data["issue_url"] = links_data[1][0] - - return data -} - -func (gp GitlabParser) parseIssueComment(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} {commented_on_issue} ({issue_name}):{newline}{repeatables}" - data["user"] = strings.TrimSpace(strings.Split(message.Text, " <")[0]) - - // Parse links in main message. - links_data := gp.cutLinks(message.Text) - data["commented_on_issue"] = links_data[0][1] - data["commented_on_issue_url"] = links_data[0][0] - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - data["issue_name"] = strings.Split(message.Text, links_data[1][1]+">: ")[1] - - // Parse attachments, which contains comments. - data["repeatable_message"] = "{comment}{newline}" - data["repeatables"] = "comment" - idx := 0 - for i := range message.Attachments { - data["repeatable_item_comment"+strconv.Itoa(idx)] = message.Attachments[i].Text - idx += 1 - } - data["repeatables_count"] = strconv.Itoa(idx) - - return data -} - -func (gp GitlabParser) parseIssueOpened(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} opened an issue: {issue}{newline}{issue_text}" - - links_data := gp.cutLinks(message.Text) - data["project"] = links_data[0][1] - data["project_url"] = links_data[0][0] - data["user"] = strings.Split(message.Text, "Issue opened by ")[1] - if len(message.Attachments) > 0 { - data["issue"] = message.Attachments[0].Title - - // Generate valid issue URL. - issue_number_raw := strings.Fields(message.Attachments[0].Title)[0] - // Remove "#" and compose URL. - issue_number := strings.Replace(issue_number_raw, "#", "", 1) - data["issue_url"] = links_data[0][0] + "/issues/" + issue_number - data["issue_text"] = message.Attachments[0].Text - } else { - // Issue was reopened. - data["message"] = strings.Replace(data["message"], ": {issue}{newline}{issue_text}", "", 1) - data["message"] = strings.Replace(data["message"], "opened", "reopened", 1) - } - - return data -} - -func (gp GitlabParser) parseMergeRequestClosed(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} closed merge request: {merge_request}" - data["user"] = strings.Split(message.Text, " closed <")[0] - - links_data := gp.cutLinks(message.Text) - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - data["merge_request"] = links_data[0][1] - data["merge_request_url"] = links_data[0][0] - - return data -} - -func (gp GitlabParser) parseMergeRequestComment(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} {commented_on_merge_request} ({merge_request_name}):{newline}{repeatables}" - data["user"] = strings.TrimSpace(strings.Split(message.Text, " <")[0]) - - // Parse links in main message. - links_data := gp.cutLinks(message.Text) - data["commented_on_merge_request"] = links_data[0][1] - data["commented_on_merge_request_url"] = links_data[0][0] - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - data["merge_request_name"] = strings.Split(message.Text, links_data[1][1]+">: ")[1] - - // Parse attachments, which contains comments. - data["repeatable_message"] = "{comment}{newline}" - data["repeatables"] = "comment" - idx := 0 - for i := range message.Attachments { - data["repeatable_item_comment"+strconv.Itoa(idx)] = message.Attachments[i].Text - idx += 1 - } - data["repeatables_count"] = strconv.Itoa(idx) - - return data -} - -func (gp GitlabParser) parseMergeRequestMerged(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} merged {merge_request}" - data["user"] = strings.Split(message.Text, " merged <")[0] - - links_data := gp.cutLinks(message.Text) - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - data["merge_request"] = links_data[0][1] - data["merge_request_url"] = links_data[0][0] - - return data - -} - -func (gp GitlabParser) parseMergeRequestOpened(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} opened new merge request: {merge_request}" - data["user"] = strings.Split(message.Text, " opened <")[0] - - links_data := gp.cutLinks(message.Text) - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - data["merge_request"] = links_data[0][1] - data["merge_request_url"] = links_data[0][0] - - return data -} - -func (gp GitlabParser) parsePipelineMessage(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] Pipeline {pipeline_number} of branch {branch} by {user} {status} in {time}" - - var status string = "" - if strings.Contains(message.Attachments[0].Text, "failed") { - status = "failed" - } else if strings.Contains(message.Attachments[0].Text, "passed") { - status = "passed" - } - - data["status"] = status - - user := strings.Split(message.Attachments[0].Text, "> by ")[1] - data["user"] = strings.Split(user, " "+status+" in")[0] - data["time"] = strings.Split(message.Attachments[0].Text, " "+status+" in ")[1] - - links_data := gp.cutLinks(message.Attachments[0].Text) - data["project"] = links_data[0][1] - data["project_url"] = links_data[0][0] - data["pipeline_number"] = links_data[1][1] - data["pipeline_number_url"] = links_data[1][0] - data["branch"] = links_data[2][1] - data["branch_url"] = links_data[2][0] - - return data -} - -func (gp GitlabParser) parsePushedNewBranch(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} pushed new branch: {branch}" - - links_data := gp.cutLinks(message.Text) - data["branch"] = links_data[0][1] - data["branch_url"] = links_data[0][0] - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - - data["user"] = strings.Split(message.Text, " pushed new branch")[0] - - return data -} - -func (gp GitlabParser) parseTagPush(message slackmessage.SlackMessage) map[string]string { - data := make(map[string]string) - data["message"] = "[{project}] {user} pushed new tag: {tag}" - data["user"] = strings.Split(message.Text, " pushed new tag")[0] - - links_data := gp.cutLinks(message.Text) - data["tag"] = links_data[0][1] - data["tag_url"] = links_data[0][0] - data["project"] = links_data[1][1] - data["project_url"] = links_data[1][0] - - return data -} - -func (gp GitlabParser) parseAttachments(message slackmessage.SlackMessage) map[string]string { - c.Log.Debugln("Parsing attachments...") - - var data map[string]string - if strings.Contains(message.Attachments[0].Text, "Pipeline") && strings.Contains(message.Attachments[0].Text, "of branch") { - data = gp.parsePipelineMessage(message) - } - - return data -} - -func (gp GitlabParser) ParseMessage(message slackmessage.SlackMessage) map[string]string { - c.Log.Debugln("Parsing Gitlab message...") - - var data map[string]string - - if len(message.Attachments) > 0 && message.Text == "" { - return gp.parseAttachments(message) - } - - if strings.Contains(message.Text, "pushed to") { - data = gp.parseCommit(message) - } else if strings.Contains(message.Text, "commented on issue") { - data = gp.parseIssueComment(message) - } else if strings.Contains(message.Text, "closed by ") { - data = gp.parseIssueClosed(message.Text) - } else if strings.Contains(message.Text, "Issue opened by ") { - data = gp.parseIssueOpened(message) - } else if strings.Contains(message.Text, "merge_requests") && strings.Contains(message.Text, " closed <") { - data = gp.parseMergeRequestClosed(message) - } else if strings.Contains(message.Text, "commented on merge request") { - data = gp.parseMergeRequestComment(message) - } else if strings.Contains(message.Text, "merge_requests") && strings.Contains(message.Text, " merged <") { - data = gp.parseMergeRequestMerged(message) - } else if strings.Contains(message.Text, "merge_requests") && strings.Contains(message.Text, " opened <") { - data = gp.parseMergeRequestOpened(message) - } else if strings.Contains(message.Text, "pushed new branch") { - data = gp.parsePushedNewBranch(message) - } else if strings.Contains(message.Text, " pushed new tag ") { - data = gp.parseTagPush(message) - } else { - return map[string]string{"message": "Unknown message type:
" + fmt.Sprintf("%+v", message)} - } - - c.Log.Debugln("Message:", fmt.Sprintf("%+v", data)) - - return data -} diff --git a/parsers/interface/parserinterface.go b/parsers/interface/parserinterface.go index 161d43d..06a20e7 100644 --- a/parsers/interface/parserinterface.go +++ b/parsers/interface/parserinterface.go @@ -24,5 +24,5 @@ import ( type ParserInterface interface { Initialize() - ParseMessage(message slackmessage.SlackMessage) map[string]string + ParseMessage(message slackmessage.SlackMessage) map[string]interface{} } diff --git a/pushers/matrix/matrixconnection.go b/pushers/matrix/matrixconnection.go index 2fa4f22..a1f7891 100644 --- a/pushers/matrix/matrixconnection.go +++ b/pushers/matrix/matrixconnection.go @@ -26,7 +26,6 @@ import ( "fmt" "io/ioutil" "net/http" - "strconv" "strings" // local @@ -193,102 +192,25 @@ func (mxc *MatrixConnection) Initialize(conn_name string, api_root string, user // It will prepare a message which will be passed to mxc.SendMessage(). func (mxc *MatrixConnection) ProcessMessage(message slackmessage.SlackMessage) { // Prepare message body. - message_data := c.SendToParser(message.Username, message) + messageData := c.SendToParser(message.Username, message) - // Get message template. - msg_tpl := message_data["message"] - delete(message_data, "message") - - // Repeatables. - var repeatables []string - repeatables_raw, repeatables_found := message_data["repeatables"] - if repeatables_found { - repeatables = strings.Split(repeatables_raw, ",") - c.Log.Debugln("Repeatable keys:", repeatables, ", length:", len(repeatables)) + messageToSend := messageData["message"].(string) + // We'll use HTML, so reformat links accordingly (if any). + linksRaw, linksFound := messageData["links"] + if linksFound { + links := linksRaw.([][]string) + for _, link := range links { + messageToSend = strings.Replace(messageToSend, "<"+link[0]+">", ``+link[3]+``, -1) + } } - // Process keys. - for key, value := range message_data { - // Do nothing for keys with "_url" appendix. - if strings.Contains(key, "_url") { - c.Log.Debugln("_url key found in pre-stage, skipping:", key) - continue - } - // Do nothing (yet) on repeatables. - if strings.Contains(key, "repeatable") { - c.Log.Debugln("Key containing 'repeatable' in pre-stage, skipping:", key) - continue - } + // "\n" should be "
". + messageToSend = strings.Replace(messageToSend, "\n", "
", -1) - if len(repeatables) > 0 { - if strings.Contains(key, "repeatable_item_") { - c.Log.Debugln("Repeatable key in pre-stage, skipping:", key) - continue - } - } - c.Log.Debugln("Processing message data key:", key) - - // Check if we have an item with "_url" appendix. This means - // that we should generate a link. - val_url, found := message_data[key+"_url"] - // Generate a link and put into message if key with "_url" - // was found. - var s string = "" - if found { - c.Log.Debugln("Found _url key, will create HTML link") - s = fmt.Sprintf("%s", val_url, value) - } else { - c.Log.Debugln("Found no _url key, will use as-is") - s = value - } - msg_tpl = strings.Replace(msg_tpl, "{"+key+"}", s, -1) - } - - // Process repeatables. - repeatable_tpl, repeatable_found := message_data["repeatable_message"] - if repeatable_found { - var repeatables_string string = "" - repeatables_count, _ := strconv.Atoi(message_data["repeatables_count"]) - idx := 0 - for { - if idx == repeatables_count { - c.Log.Debug("IDX goes above repeatables_count, breaking loop") - break - } - - var repstring string = repeatable_tpl - for i := range repeatables { - c.Log.Debugln("Processing repeatable variable:", repeatables[i]+strconv.Itoa(idx)) - var data string = "" - rdata := message_data["repeatable_item_"+repeatables[i]+strconv.Itoa(idx)] - rurl, rurl_found := message_data["repeatable_item_"+repeatables[i]+strconv.Itoa(idx)+"_url"] - if rurl_found { - c.Log.Debugln("Found _url key, will create HTML link") - data = fmt.Sprintf("%s", rurl, rdata) - } else { - c.Log.Debugln("Found no _url key, will use as-is") - data = rdata - } - repstring = strings.Replace(repstring, "{"+repeatables[i]+"}", data, -1) - } - - repeatables_string += repstring - c.Log.Debugln("Repeatable string:", repstring) - idx += 1 - } - - msg_tpl = strings.Replace(msg_tpl, "{repeatables}", repeatables_string, -1) - } - - msg_tpl = strings.Replace(msg_tpl, "{newline}", "
", -1) - - // Replace all "\n" with "
". - msg_tpl = strings.Replace(msg_tpl, "\n", "
", -1) - - c.Log.Debugln("Crafted message:", msg_tpl) + c.Log.Debugln("Crafted message:", messageToSend) // Send message. - mxc.SendMessage(msg_tpl) + mxc.SendMessage(messageToSend) } // This function sends already prepared message to room. diff --git a/pushers/telegram/telegramconnection.go b/pushers/telegram/telegramconnection.go index 77da1eb..8c975ad 100644 --- a/pushers/telegram/telegramconnection.go +++ b/pushers/telegram/telegramconnection.go @@ -22,7 +22,6 @@ import ( "fmt" "net/http" "net/url" - "strconv" "strings" // local @@ -40,99 +39,22 @@ func (tc *TelegramConnection) Initialize(connName string, cfg configstruct.Confi func (tc *TelegramConnection) ProcessMessage(message slackmessage.SlackMessage) { // Prepare message body. - message_data := c.SendToParser(message.Username, message) + messageData := c.SendToParser(message.Username, message) - // Get message template. - msg_tpl := message_data["message"] - delete(message_data, "message") - - // Repeatables. - var repeatables []string - repeatables_raw, repeatables_found := message_data["repeatables"] - if repeatables_found { - repeatables = strings.Split(repeatables_raw, ",") - c.Log.Debugln("Repeatable keys:", repeatables, ", length:", len(repeatables)) + messageToSend := messageData["message"].(string) + // We'll use HTML, so reformat links accordingly (if any). + linksRaw, linksFound := messageData["links"] + if linksFound { + links := linksRaw.([][]string) + for _, link := range links { + messageToSend = strings.Replace(messageToSend, "<"+link[0]+">", ``+link[3]+``, -1) + } } - // Process keys. - for key, value := range message_data { - // Do nothing for keys with "_url" appendix. - if strings.Contains(key, "_url") { - c.Log.Debugln("_url key found in pre-stage, skipping:", key) - continue - } - // Do nothing (yet) on repeatables. - if strings.Contains(key, "repeatable") { - c.Log.Debugln("Key containing 'repeatable' in pre-stage, skipping:", key) - continue - } - - if len(repeatables) > 0 { - if strings.Contains(key, "repeatable_item_") { - c.Log.Debugln("Repeatable key in pre-stage, skipping:", key) - continue - } - } - c.Log.Debugln("Processing message data key:", key) - - // Check if we have an item with "_url" appendix. This means - // that we should generate a link. - val_url, found := message_data[key+"_url"] - // Generate a link and put into message if key with "_url" - // was found. - var s string = "" - if found { - c.Log.Debugln("Found _url key, will create HTML link") - s = fmt.Sprintf("%s", val_url, value) - } else { - c.Log.Debugln("Found no _url key, will use as-is") - s = value - } - msg_tpl = strings.Replace(msg_tpl, "{"+key+"}", s, -1) - } - - // Process repeatables. - repeatable_tpl, repeatable_found := message_data["repeatable_message"] - if repeatable_found { - var repeatables_string string = "" - repeatables_count, _ := strconv.Atoi(message_data["repeatables_count"]) - idx := 0 - for { - if idx == repeatables_count { - c.Log.Debug("IDX goes above repeatables_count, breaking loop") - break - } - - var repstring string = repeatable_tpl - for i := range repeatables { - c.Log.Debugln("Processing repeatable variable:", repeatables[i]+strconv.Itoa(idx)) - var data string = "" - rdata := message_data["repeatable_item_"+repeatables[i]+strconv.Itoa(idx)] - rurl, rurl_found := message_data["repeatable_item_"+repeatables[i]+strconv.Itoa(idx)+"_url"] - if rurl_found { - c.Log.Debugln("Found _url key, will create HTML link") - data = fmt.Sprintf("%s", rurl, rdata) - } else { - c.Log.Debugln("Found no _url key, will use as-is") - data = rdata - } - repstring = strings.Replace(repstring, "{"+repeatables[i]+"}", data, -1) - } - - repeatables_string += repstring - c.Log.Debugln("Repeatable string:", repstring) - idx += 1 - } - - msg_tpl = strings.Replace(msg_tpl, "{repeatables}", repeatables_string, -1) - } - - msg_tpl = strings.Replace(msg_tpl, "{newline}", "\n", -1) - - c.Log.Debugln("Crafted message:", msg_tpl) + c.Log.Debugln("Crafted message:", messageToSend) // Send message. - tc.SendMessage(msg_tpl) + tc.SendMessage(messageToSend) } func (tc *TelegramConnection) SendMessage(message string) {