summaryrefslogtreecommitdiffstats
path: root/api/post.go
diff options
context:
space:
mode:
authorJoramWilander <jwawilander@gmail.com>2015-10-19 10:19:48 -0400
committerJoramWilander <jwawilander@gmail.com>2015-10-19 10:19:48 -0400
commita3ca10674056d4dfcfec5cfb404f3488f8bc4090 (patch)
tree0ccbc05cc77481aea38632222b1fdbf042a6c75c /api/post.go
parentf24ea30a75ad52b695f5f275139af1c0495624ac (diff)
downloadchat-a3ca10674056d4dfcfec5cfb404f3488f8bc4090.tar.gz
chat-a3ca10674056d4dfcfec5cfb404f3488f8bc4090.tar.bz2
chat-a3ca10674056d4dfcfec5cfb404f3488f8bc4090.zip
Generalized webhook post code and added it to outgoing webhooks
Diffstat (limited to 'api/post.go')
-rw-r--r--api/post.go42
1 files changed, 40 insertions, 2 deletions
diff --git a/api/post.go b/api/post.go
index e4e67dc66..73a63cb72 100644
--- a/api/post.go
+++ b/api/post.go
@@ -13,6 +13,7 @@ import (
"net/http"
"net/url"
"path/filepath"
+ "regexp"
"strconv"
"strings"
"time"
@@ -144,6 +145,40 @@ func CreatePost(c *Context, post *model.Post, triggerWebhooks bool) (*model.Post
return rpost, nil
}
+func CreateWebhookPost(c *Context, channelId, text, overrideUsername, overrideIconUrl string) (*model.Post, *model.AppError) {
+ // parse links into Markdown format
+ linkWithTextRegex := regexp.MustCompile(`<([^<\|]+)\|([^>]+)>`)
+ text = linkWithTextRegex.ReplaceAllString(text, "[${2}](${1})")
+
+ linkRegex := regexp.MustCompile(`<\s*(\S*)\s*>`)
+ text = linkRegex.ReplaceAllString(text, "${1}")
+
+ post := &model.Post{UserId: c.Session.UserId, ChannelId: channelId, Message: text}
+ post.AddProp("from_webhook", "true")
+
+ if utils.Cfg.ServiceSettings.EnablePostUsernameOverride {
+ if len(overrideUsername) != 0 {
+ post.AddProp("override_username", overrideUsername)
+ } else {
+ post.AddProp("override_username", model.DEFAULT_WEBHOOK_USERNAME)
+ }
+ }
+
+ if utils.Cfg.ServiceSettings.EnablePostIconOverride {
+ if len(overrideIconUrl) != 0 {
+ post.AddProp("override_icon_url", overrideIconUrl)
+ } else {
+ post.AddProp("override_icon_url", model.DEFAULT_WEBHOOK_ICON)
+ }
+ }
+
+ if _, err := CreatePost(c, post, false); err != nil {
+ return nil, model.NewAppError("CreateWebhookPost", "Error creating post", "err="+err.Message)
+ }
+
+ return post, nil
+}
+
func handlePostEventsAndForget(c *Context, post *model.Post, triggerWebhooks bool) {
go func() {
tchan := Srv.Store.Team().Get(c.Session.TeamId)
@@ -244,9 +279,12 @@ func handleWebhookEventsAndForget(c *Context, post *model.Post, team *model.Team
} else {
respProps := model.MapFromJson(resp.Body)
+ // copy the context and create a mock session for posting the message
+ mockSession := model.Session{UserId: hook.CreatorId, TeamId: hook.TeamId, IsOAuth: false}
+ newContext := &Context{mockSession, model.NewId(), "", c.Path, nil, c.teamURLValid, c.teamURL, c.siteURL}
+
if text, ok := respProps["text"]; ok {
- respPost := &model.Post{Message: text, ChannelId: post.ChannelId}
- if _, err := CreatePost(c, respPost, false); err != nil {
+ if _, err := CreateWebhookPost(newContext, post.ChannelId, text, respProps["username"], respProps["icon_url"]); err != nil {
l4g.Error("Failed to create response post, err=%v", err)
}
}