diff options
author | Thomas Balthazar <tbalthazar@users.noreply.github.com> | 2016-05-18 22:36:01 +0200 |
---|---|---|
committer | Harrison Healey <harrisonmhealey@gmail.com> | 2016-05-18 16:36:01 -0400 |
commit | 4f34730b3f82ee3fc1a21f3f2bf7ee5a5f8f3c0a (patch) | |
tree | 642219d85059f754c36a05633846c7ccd63fbef8 /model/incoming_webhook.go | |
parent | 55f6a0b21c46f77fb33e1af29c5960298bdb6907 (diff) | |
download | chat-4f34730b3f82ee3fc1a21f3f2bf7ee5a5f8f3c0a.tar.gz chat-4f34730b3f82ee3fc1a21f3f2bf7ee5a5f8f3c0a.tar.bz2 chat-4f34730b3f82ee3fc1a21f3f2bf7ee5a5f8f3c0a.zip |
Integrations: Enable <!channel> notifications in incoming webhooks (#3039)
Diffstat (limited to 'model/incoming_webhook.go')
-rw-r--r-- | model/incoming_webhook.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/model/incoming_webhook.go b/model/incoming_webhook.go index 4bad8b262..fabf799cd 100644 --- a/model/incoming_webhook.go +++ b/model/incoming_webhook.go @@ -8,6 +8,7 @@ import ( "encoding/json" "io" "regexp" + "strings" ) const ( @@ -192,6 +193,55 @@ func decodeIncomingWebhookRequest(by []byte) (*IncomingWebhookRequest, error) { } } +// 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 expandAnnouncements(i *IncomingWebhookRequest) { + i.Text = expandAnnouncement(i.Text) + + if i.Attachments != nil { + attachments := i.Attachments.([]interface{}) + for _, attachment := range attachments { + a := attachment.(map[string]interface{}) + + if a["pretext"] != nil { + a["pretext"] = expandAnnouncement(a["pretext"].(string)) + } + + if a["text"] != nil { + a["text"] = expandAnnouncement(a["text"].(string)) + } + + if a["title"] != nil { + a["title"] = expandAnnouncement(a["title"].(string)) + } + + if a["fields"] != nil { + fields := a["fields"].([]interface{}) + for _, field := range fields { + f := field.(map[string]interface{}) + if f["value"] != nil { + f["value"] = expandAnnouncement(f["value"].(string)) + } + } + } + } + } +} + func IncomingWebhookRequestFromJson(data io.Reader) *IncomingWebhookRequest { buf := new(bytes.Buffer) buf.ReadFrom(data) @@ -207,5 +257,7 @@ func IncomingWebhookRequestFromJson(data io.Reader) *IncomingWebhookRequest { } } + expandAnnouncements(o) + return o } |