From 21a3219b9b1df033635631afa751742bd4c56ea0 Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Wed, 19 Jul 2017 03:43:31 +0800 Subject: [PLT-6676] Make OutgoingWebhook to fire when post has no text content but only attachment (#6935) * make OutgoingWebhook to fire when post has no text content but only attachment * update per comment and modify payload & test --- app/webhook.go | 106 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 56 insertions(+), 50 deletions(-) (limited to 'app/webhook.go') diff --git a/app/webhook.go b/app/webhook.go index 6a7bb16e1..e92805608 100644 --- a/app/webhook.go +++ b/app/webhook.go @@ -18,8 +18,8 @@ import ( ) const ( - TRIGGERWORDS_FULL = 0 - TRIGGERWORDS_STARTSWITH = 1 + TRIGGERWORDS_EXACT_MATCH = 0 + TRIGGERWORDS_STARTS_WITH = 1 ) func handleWebhookEvents(post *model.Post, team *model.Team, channel *model.Channel, user *model.User) *model.AppError { @@ -42,74 +42,80 @@ func handleWebhookEvents(post *model.Post, team *model.Team, channel *model.Chan return nil } + var firstWord, triggerWord string + splitWords := strings.Fields(post.Message) - if len(splitWords) == 0 { - return nil + if len(splitWords) > 0 { + firstWord = splitWords[0] } - firstWord := splitWords[0] relevantHooks := []*model.OutgoingWebhook{} for _, hook := range hooks { if hook.ChannelId == post.ChannelId || len(hook.ChannelId) == 0 { if hook.ChannelId == post.ChannelId && len(hook.TriggerWords) == 0 { relevantHooks = append(relevantHooks, hook) - } else if hook.TriggerWhen == TRIGGERWORDS_FULL && hook.HasTriggerWord(firstWord) { + triggerWord = "" + } else if hook.TriggerWhen == TRIGGERWORDS_EXACT_MATCH && hook.TriggerWordExactMatch(firstWord) { relevantHooks = append(relevantHooks, hook) - } else if hook.TriggerWhen == TRIGGERWORDS_STARTSWITH && hook.TriggerWordStartsWith(firstWord) { + triggerWord = hook.GetTriggerWord(firstWord, true) + } else if hook.TriggerWhen == TRIGGERWORDS_STARTS_WITH && hook.TriggerWordStartsWith(firstWord) { relevantHooks = append(relevantHooks, hook) + triggerWord = hook.GetTriggerWord(firstWord, false) } } } for _, hook := range relevantHooks { - go func(hook *model.OutgoingWebhook) { - payload := &model.OutgoingWebhookPayload{ - Token: hook.Token, - TeamId: hook.TeamId, - TeamDomain: team.Name, - ChannelId: post.ChannelId, - ChannelName: channel.Name, - Timestamp: post.CreateAt, - UserId: post.UserId, - UserName: user.Username, - PostId: post.Id, - Text: post.Message, - TriggerWord: firstWord, - } - var body io.Reader - var contentType string - if hook.ContentType == "application/json" { - body = strings.NewReader(payload.ToJSON()) - contentType = "application/json" + payload := &model.OutgoingWebhookPayload{ + Token: hook.Token, + TeamId: hook.TeamId, + TeamDomain: team.Name, + ChannelId: post.ChannelId, + ChannelName: channel.Name, + Timestamp: post.CreateAt, + UserId: post.UserId, + UserName: user.Username, + PostId: post.Id, + Text: post.Message, + TriggerWord: triggerWord, + FileIds: strings.Join(post.FileIds, ","), + } + go TriggerWebhook(payload, hook, post) + } + + return nil +} + +func TriggerWebhook(payload *model.OutgoingWebhookPayload, hook *model.OutgoingWebhook, post *model.Post) { + var body io.Reader + var contentType string + if hook.ContentType == "application/json" { + body = strings.NewReader(payload.ToJSON()) + contentType = "application/json" + } else { + body = strings.NewReader(payload.ToFormValues()) + contentType = "application/x-www-form-urlencoded" + } + + for _, url := range hook.CallbackURLs { + go func(url string) { + req, _ := http.NewRequest("POST", url, body) + req.Header.Set("Content-Type", contentType) + req.Header.Set("Accept", "application/json") + if resp, err := utils.HttpClient().Do(req); err != nil { + l4g.Error(utils.T("api.post.handle_webhook_events_and_forget.event_post.error"), err.Error()) } else { - body = strings.NewReader(payload.ToFormValues()) - contentType = "application/x-www-form-urlencoded" - } + defer CloseBody(resp) + respProps := model.MapFromJson(resp.Body) - for _, url := range hook.CallbackURLs { - go func(url string) { - req, _ := http.NewRequest("POST", url, body) - req.Header.Set("Content-Type", contentType) - req.Header.Set("Accept", "application/json") - if resp, err := utils.HttpClient().Do(req); err != nil { - l4g.Error(utils.T("api.post.handle_webhook_events_and_forget.event_post.error"), err.Error()) - } else { - defer CloseBody(resp) - respProps := model.MapFromJson(resp.Body) - - if text, ok := respProps["text"]; ok { - if _, err := CreateWebhookPost(hook.CreatorId, hook.TeamId, post.ChannelId, text, respProps["username"], respProps["icon_url"], post.Props, post.Type); err != nil { - l4g.Error(utils.T("api.post.handle_webhook_events_and_forget.create_post.error"), err) - } - } + if text, ok := respProps["text"]; ok { + if _, err := CreateWebhookPost(hook.CreatorId, hook.TeamId, post.ChannelId, text, respProps["username"], respProps["icon_url"], post.Props, post.Type); err != nil { + l4g.Error(utils.T("api.post.handle_webhook_events_and_forget.create_post.error"), err) } - }(url) + } } - - }(hook) + }(url) } - - return nil } func CreateWebhookPost(userId, teamId, channelId, text, overrideUsername, overrideIconUrl string, props model.StringInterface, postType string) (*model.Post, *model.AppError) { -- cgit v1.2.3-1-g7c22