2019-12-28 11:55:09 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package webhook
import (
"fmt"
"html"
"strings"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
)
type linkFormatter = func ( string , string ) string
// noneLinkFormatter does not create a link but just returns the text
func noneLinkFormatter ( url string , text string ) string {
return text
}
// htmlLinkFormatter creates a HTML link
func htmlLinkFormatter ( url string , text string ) string {
return fmt . Sprintf ( ` <a href="%s">%s</a> ` , url , html . EscapeString ( text ) )
}
2020-01-05 01:20:15 +03:00
func getIssuesPayloadInfo ( p * api . IssuePayload , linkFormatter linkFormatter , withSender bool ) ( string , string , string , int ) {
2019-12-28 11:55:09 +03:00
repoLink := linkFormatter ( p . Repository . HTMLURL , p . Repository . FullName )
issueTitle := fmt . Sprintf ( "#%d %s" , p . Index , p . Issue . Title )
titleLink := linkFormatter ( fmt . Sprintf ( "%s/issues/%d" , p . Repository . HTMLURL , p . Index ) , issueTitle )
var text string
color := yellowColor
switch p . Action {
case api . HookIssueOpened :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue opened: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
color = orangeColor
case api . HookIssueClosed :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue closed: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
color = redColor
case api . HookIssueReOpened :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue re-opened: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueEdited :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue edited: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueAssigned :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue assigned to %s: %s" , repoLink ,
linkFormatter ( setting . AppURL + p . Issue . Assignee . UserName , p . Issue . Assignee . UserName ) , titleLink )
2019-12-28 11:55:09 +03:00
color = greenColor
case api . HookIssueUnassigned :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue unassigned: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueLabelUpdated :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue labels updated: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueLabelCleared :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue labels cleared: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueSynchronized :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue synchronized: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueMilestoned :
mileStoneLink := fmt . Sprintf ( "%s/milestone/%d" , p . Repository . HTMLURL , p . Issue . Milestone . ID )
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue milestoned to %s: %s" , repoLink ,
linkFormatter ( mileStoneLink , p . Issue . Milestone . Title ) , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueDemilestoned :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Issue milestone cleared: %s" , repoLink , titleLink )
}
if withSender {
text += fmt . Sprintf ( " by %s" , linkFormatter ( setting . AppURL + p . Sender . UserName , p . Sender . UserName ) )
2019-12-28 11:55:09 +03:00
}
var attachmentText string
if p . Action == api . HookIssueOpened || p . Action == api . HookIssueEdited {
attachmentText = p . Issue . Body
}
return text , issueTitle , attachmentText , color
}
2020-01-05 01:20:15 +03:00
func getPullRequestPayloadInfo ( p * api . PullRequestPayload , linkFormatter linkFormatter , withSender bool ) ( string , string , string , int ) {
2019-12-28 11:55:09 +03:00
repoLink := linkFormatter ( p . Repository . HTMLURL , p . Repository . FullName )
issueTitle := fmt . Sprintf ( "#%d %s" , p . Index , p . PullRequest . Title )
titleLink := linkFormatter ( p . PullRequest . URL , issueTitle )
var text string
color := yellowColor
switch p . Action {
case api . HookIssueOpened :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request opened: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
color = greenColor
case api . HookIssueClosed :
if p . PullRequest . HasMerged {
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request merged: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
color = purpleColor
} else {
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request closed: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
color = redColor
}
case api . HookIssueReOpened :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request re-opened: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueEdited :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request edited: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueAssigned :
list := make ( [ ] string , len ( p . PullRequest . Assignees ) )
for i , user := range p . PullRequest . Assignees {
list [ i ] = linkFormatter ( setting . AppURL + user . UserName , user . UserName )
}
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request assigned: %s to %s" , repoLink ,
strings . Join ( list , ", " ) , titleLink )
2019-12-28 11:55:09 +03:00
color = greenColor
case api . HookIssueUnassigned :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request unassigned: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueLabelUpdated :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request labels updated: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueLabelCleared :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request labels cleared: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueSynchronized :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request synchronized: %s" , repoLink , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueMilestoned :
mileStoneLink := fmt . Sprintf ( "%s/milestone/%d" , p . Repository . HTMLURL , p . PullRequest . Milestone . ID )
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request milestoned: %s to %s" , repoLink ,
linkFormatter ( mileStoneLink , p . PullRequest . Milestone . Title ) , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueDemilestoned :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Pull request milestone cleared: %s" , repoLink , titleLink )
}
if withSender {
text += fmt . Sprintf ( " by %s" , linkFormatter ( setting . AppURL + p . Sender . UserName , p . Sender . UserName ) )
2019-12-28 11:55:09 +03:00
}
var attachmentText string
if p . Action == api . HookIssueOpened || p . Action == api . HookIssueEdited {
attachmentText = p . PullRequest . Body
}
return text , issueTitle , attachmentText , color
}
2020-01-05 01:20:15 +03:00
func getReleasePayloadInfo ( p * api . ReleasePayload , linkFormatter linkFormatter , withSender bool ) ( text string , color int ) {
2019-12-28 11:55:09 +03:00
repoLink := linkFormatter ( p . Repository . HTMLURL , p . Repository . FullName )
refLink := linkFormatter ( p . Repository . HTMLURL + "/src/" + p . Release . TagName , p . Release . TagName )
switch p . Action {
case api . HookReleasePublished :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Release created: %s" , repoLink , refLink )
2019-12-28 11:55:09 +03:00
color = greenColor
case api . HookReleaseUpdated :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Release updated: %s" , repoLink , refLink )
2019-12-28 11:55:09 +03:00
color = yellowColor
case api . HookReleaseDeleted :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Release deleted: %s" , repoLink , refLink )
2019-12-28 11:55:09 +03:00
color = redColor
}
2020-01-05 01:20:15 +03:00
if withSender {
text += fmt . Sprintf ( " by %s" , linkFormatter ( setting . AppURL + p . Sender . UserName , p . Sender . UserName ) )
}
2019-12-28 11:55:09 +03:00
return text , color
}
2020-01-05 01:20:15 +03:00
func getIssueCommentPayloadInfo ( p * api . IssueCommentPayload , linkFormatter linkFormatter , withSender bool ) ( string , string , int ) {
2019-12-28 11:55:09 +03:00
repoLink := linkFormatter ( p . Repository . HTMLURL , p . Repository . FullName )
issueTitle := fmt . Sprintf ( "#%d %s" , p . Issue . Index , p . Issue . Title )
var text , typ , titleLink string
color := yellowColor
if p . IsPull {
typ = "pull request"
titleLink = linkFormatter ( p . Comment . PRURL , issueTitle )
} else {
typ = "issue"
titleLink = linkFormatter ( p . Comment . IssueURL , issueTitle )
}
switch p . Action {
case api . HookIssueCommentCreated :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] New comment on %s %s" , repoLink , typ , titleLink )
2019-12-28 11:55:09 +03:00
if p . IsPull {
color = greenColorLight
} else {
color = orangeColorLight
}
case api . HookIssueCommentEdited :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Comment edited on %s %s" , repoLink , typ , titleLink )
2019-12-28 11:55:09 +03:00
case api . HookIssueCommentDeleted :
2020-01-05 01:20:15 +03:00
text = fmt . Sprintf ( "[%s] Comment deleted on %s %s" , repoLink , typ , titleLink )
2019-12-28 11:55:09 +03:00
color = redColor
}
2020-01-05 01:20:15 +03:00
if withSender {
text += fmt . Sprintf ( " by %s" , linkFormatter ( setting . AppURL + p . Sender . UserName , p . Sender . UserName ) )
}
2019-12-28 11:55:09 +03:00
return text , issueTitle , color
}