summaryrefslogtreecommitdiffstats
path: root/model/slack_attachment.go
diff options
context:
space:
mode:
Diffstat (limited to 'model/slack_attachment.go')
-rw-r--r--model/slack_attachment.go52
1 files changed, 52 insertions, 0 deletions
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
+// <!channel>, 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 := "<!channel>"
+ 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
+}