From 9ee7f661c76d7ef07ac03772a7cf0394217203f3 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 12 Jul 2017 06:43:07 -0700 Subject: PLT-7077: ignore null array items in slack attachments (#6904) * ignore null array items in incoming webhooks / command responses * consolidate code, process announcements in command response as well * make a bit more idiomatic, add tests * add missing file --- model/slack_attachment.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'model/slack_attachment.go') diff --git a/model/slack_attachment.go b/model/slack_attachment.go index 6fd0071b4..a3199c44c 100644 --- a/model/slack_attachment.go +++ b/model/slack_attachment.go @@ -3,6 +3,11 @@ package model +import ( + "fmt" + "strings" +) + type SlackAttachment struct { Id int64 `json:"id"` Fallback string `json:"fallback"` @@ -27,3 +32,50 @@ type SlackAttachmentField struct { Value interface{} `json:"value"` Short bool `json:"short"` } + +type SlackAttachments []*SlackAttachment + +// To mention @channel via a webhook in Slack, the message should contain +// , as explained at the bottom of this article: +// https://get.slack.help/hc/en-us/articles/202009646-Making-announcements +func ExpandAnnouncement(text string) string { + c1 := "" + c2 := "@channel" + if strings.Contains(text, c1) { + return strings.Replace(text, c1, c2, -1) + } + return text +} + +// Expand announcements in incoming webhooks from Slack. Those announcements +// can be found in the text attribute, or in the pretext, text, title and value +// attributes of the attachment structure. The Slack attachment structure is +// documented here: https://api.slack.com/docs/attachments +func (a *SlackAttachments) Process() { + var nonNilAttachments []*SlackAttachment + for _, attachment := range *a { + if attachment == nil { + continue + } + nonNilAttachments = append(nonNilAttachments, attachment) + + attachment.Pretext = ExpandAnnouncement(attachment.Pretext) + attachment.Text = ExpandAnnouncement(attachment.Text) + attachment.Title = ExpandAnnouncement(attachment.Title) + + var nonNilFields []*SlackAttachmentField + for _, field := range attachment.Fields { + if field == nil { + continue + } + nonNilFields = append(nonNilFields, field) + + if field.Value != nil { + // Ensure the value is set to a string if it is set + field.Value = ExpandAnnouncement(fmt.Sprintf("%v", field.Value)) + } + } + attachment.Fields = nonNilFields + } + *a = nonNilAttachments +} -- cgit v1.2.3-1-g7c22