2017-08-16 23:37:37 +02:00
|
|
|
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
2017-03-25 21:04:10 +01:00
|
|
|
// See License.txt for license information.
|
|
|
|
|
|
|
|
package model
|
|
|
|
|
2017-08-16 23:37:37 +02:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2017-03-25 21:04:10 +01:00
|
|
|
type SlackAttachment struct {
|
|
|
|
Id int64 `json:"id"`
|
|
|
|
Fallback string `json:"fallback"`
|
|
|
|
Color string `json:"color"`
|
|
|
|
Pretext string `json:"pretext"`
|
|
|
|
AuthorName string `json:"author_name"`
|
|
|
|
AuthorLink string `json:"author_link"`
|
|
|
|
AuthorIcon string `json:"author_icon"`
|
|
|
|
Title string `json:"title"`
|
|
|
|
TitleLink string `json:"title_link"`
|
|
|
|
Text string `json:"text"`
|
|
|
|
Fields []*SlackAttachmentField `json:"fields"`
|
|
|
|
ImageURL string `json:"image_url"`
|
|
|
|
ThumbURL string `json:"thumb_url"`
|
|
|
|
Footer string `json:"footer"`
|
|
|
|
FooterIcon string `json:"footer_icon"`
|
|
|
|
Timestamp interface{} `json:"ts"` // This is either a string or an int64
|
|
|
|
}
|
|
|
|
|
|
|
|
type SlackAttachmentField struct {
|
|
|
|
Title string `json:"title"`
|
|
|
|
Value interface{} `json:"value"`
|
|
|
|
Short bool `json:"short"`
|
|
|
|
}
|
2017-08-16 23:37:37 +02:00
|
|
|
|
|
|
|
// 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 ProcessSlackAttachments(a []*SlackAttachment) []*SlackAttachment {
|
|
|
|
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
|
|
|
|
}
|
|
|
|
return nonNilAttachments
|
|
|
|
}
|