2019-04-19 05:45:02 +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.
2019-11-04 01:13:25 +03:00
package webhook
2019-04-19 05:45:02 +03:00
import (
"fmt"
"strings"
2019-11-04 01:13:25 +03:00
"code.gitea.io/gitea/models"
2019-04-19 05:45:02 +03:00
"code.gitea.io/gitea/modules/git"
2019-11-04 01:13:25 +03:00
"code.gitea.io/gitea/modules/log"
2019-04-19 05:45:02 +03:00
"code.gitea.io/gitea/modules/markup"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2021-03-02 00:08:10 +03:00
jsoniter "github.com/json-iterator/go"
2019-04-19 05:45:02 +03:00
)
type (
// TelegramPayload represents
TelegramPayload struct {
2019-04-23 19:12:00 +03:00
Message string ` json:"text" `
ParseMode string ` json:"parse_mode" `
DisableWebPreview bool ` json:"disable_web_page_preview" `
2019-04-19 05:45:02 +03:00
}
// TelegramMeta contains the telegram metadata
TelegramMeta struct {
BotToken string ` json:"bot_token" `
ChatID string ` json:"chat_id" `
}
)
2019-11-04 01:13:25 +03:00
// GetTelegramHook returns telegram metadata
func GetTelegramHook ( w * models . Webhook ) * TelegramMeta {
s := & TelegramMeta { }
2021-03-02 00:08:10 +03:00
json := jsoniter . ConfigCompatibleWithStandardLibrary
2019-11-04 01:13:25 +03:00
if err := json . Unmarshal ( [ ] byte ( w . Meta ) , s ) ; err != nil {
log . Error ( "webhook.GetTelegramHook(%d): %v" , w . ID , err )
}
return s
}
2020-09-05 05:57:13 +03:00
var (
_ PayloadConvertor = & TelegramPayload { }
)
2019-04-19 05:45:02 +03:00
// SetSecret sets the telegram secret
2020-09-05 05:57:13 +03:00
func ( t * TelegramPayload ) SetSecret ( _ string ) { }
2019-04-19 05:45:02 +03:00
// JSONPayload Marshals the TelegramPayload to json
2020-09-05 05:57:13 +03:00
func ( t * TelegramPayload ) JSONPayload ( ) ( [ ] byte , error ) {
t . ParseMode = "HTML"
t . DisableWebPreview = true
t . Message = markup . Sanitize ( t . Message )
2021-03-02 00:08:10 +03:00
json := jsoniter . ConfigCompatibleWithStandardLibrary
2020-09-05 05:57:13 +03:00
data , err := json . MarshalIndent ( t , "" , " " )
2019-04-19 05:45:02 +03:00
if err != nil {
return [ ] byte { } , err
}
return data , nil
}
2020-09-05 05:57:13 +03:00
// Create implements PayloadConvertor Create method
func ( t * TelegramPayload ) Create ( p * api . CreatePayload ) ( api . Payloader , error ) {
2019-04-19 05:45:02 +03:00
// created tag/branch
refName := git . RefEndName ( p . Ref )
title := fmt . Sprintf ( ` [<a href="%s">%s</a>] %s <a href="%s">%s</a> created ` , p . Repo . HTMLURL , p . Repo . FullName , p . RefType ,
p . Repo . HTMLURL + "/src/" + refName , refName )
return & TelegramPayload {
Message : title ,
} , nil
}
2020-09-05 05:57:13 +03:00
// Delete implements PayloadConvertor Delete method
func ( t * TelegramPayload ) Delete ( p * api . DeletePayload ) ( api . Payloader , error ) {
2019-04-19 05:45:02 +03:00
// created tag/branch
refName := git . RefEndName ( p . Ref )
title := fmt . Sprintf ( ` [<a href="%s">%s</a>] %s <a href="%s">%s</a> deleted ` , p . Repo . HTMLURL , p . Repo . FullName , p . RefType ,
p . Repo . HTMLURL + "/src/" + refName , refName )
return & TelegramPayload {
Message : title ,
} , nil
}
2020-09-05 05:57:13 +03:00
// Fork implements PayloadConvertor Fork method
func ( t * TelegramPayload ) Fork ( p * api . ForkPayload ) ( api . Payloader , error ) {
2019-04-19 05:45:02 +03:00
title := fmt . Sprintf ( ` %s is forked to <a href="%s">%s</a> ` , p . Forkee . FullName , p . Repo . HTMLURL , p . Repo . FullName )
return & TelegramPayload {
Message : title ,
} , nil
}
2020-09-05 05:57:13 +03:00
// Push implements PayloadConvertor Push method
func ( t * TelegramPayload ) Push ( p * api . PushPayload ) ( api . Payloader , error ) {
2019-04-19 05:45:02 +03:00
var (
branchName = git . RefEndName ( p . Ref )
commitDesc string
)
var titleLink string
if len ( p . Commits ) == 1 {
commitDesc = "1 new commit"
titleLink = p . Commits [ 0 ] . URL
} else {
commitDesc = fmt . Sprintf ( "%d new commits" , len ( p . Commits ) )
titleLink = p . CompareURL
}
if titleLink == "" {
titleLink = p . Repo . HTMLURL + "/src/" + branchName
}
title := fmt . Sprintf ( ` [<a href="%s">%s</a>:<a href="%s">%s</a>] %s ` , p . Repo . HTMLURL , p . Repo . FullName , titleLink , branchName , commitDesc )
var text string
// for each commit, generate attachment text
for i , commit := range p . Commits {
var authorName string
if commit . Author != nil {
authorName = " - " + commit . Author . Name
}
text += fmt . Sprintf ( ` [<a href="%s">%s</a>] %s ` , commit . URL , commit . ID [ : 7 ] ,
strings . TrimRight ( commit . Message , "\r\n" ) ) + authorName
// add linebreak to each commit but the last
if i < len ( p . Commits ) - 1 {
text += "\n"
}
}
return & TelegramPayload {
Message : title + "\n" + text ,
} , nil
}
2020-09-05 05:57:13 +03:00
// Issue implements PayloadConvertor Issue method
func ( t * TelegramPayload ) Issue ( p * api . IssuePayload ) ( api . Payloader , error ) {
2020-01-05 01:20:15 +03:00
text , _ , attachmentText , _ := getIssuesPayloadInfo ( p , htmlLinkFormatter , true )
2019-04-19 05:45:02 +03:00
return & TelegramPayload {
2019-12-28 11:55:09 +03:00
Message : text + "\n\n" + attachmentText ,
2019-04-19 05:45:02 +03:00
} , nil
}
2020-09-05 05:57:13 +03:00
// IssueComment implements PayloadConvertor IssueComment method
func ( t * TelegramPayload ) IssueComment ( p * api . IssueCommentPayload ) ( api . Payloader , error ) {
2020-01-05 01:20:15 +03:00
text , _ , _ := getIssueCommentPayloadInfo ( p , htmlLinkFormatter , true )
2019-04-19 05:45:02 +03:00
return & TelegramPayload {
2019-12-28 11:55:09 +03:00
Message : text + "\n" + p . Comment . Body ,
2019-04-19 05:45:02 +03:00
} , nil
}
2020-09-05 05:57:13 +03:00
// PullRequest implements PayloadConvertor PullRequest method
func ( t * TelegramPayload ) PullRequest ( p * api . PullRequestPayload ) ( api . Payloader , error ) {
2020-01-05 01:20:15 +03:00
text , _ , attachmentText , _ := getPullRequestPayloadInfo ( p , htmlLinkFormatter , true )
2019-04-19 05:45:02 +03:00
return & TelegramPayload {
2019-12-28 11:55:09 +03:00
Message : text + "\n" + attachmentText ,
2019-04-19 05:45:02 +03:00
} , nil
}
2020-09-05 05:57:13 +03:00
// Review implements PayloadConvertor Review method
func ( t * TelegramPayload ) Review ( p * api . PullRequestPayload , event models . HookEventType ) ( api . Payloader , error ) {
2020-01-08 20:45:24 +03:00
var text , attachmentText string
switch p . Action {
2020-03-06 08:10:48 +03:00
case api . HookIssueReviewed :
2020-01-08 20:45:24 +03:00
action , err := parseHookPullRequestEventType ( event )
if err != nil {
return nil , err
}
text = fmt . Sprintf ( "[%s] Pull request review %s: #%d %s" , p . Repository . FullName , action , p . Index , p . PullRequest . Title )
attachmentText = p . Review . Content
}
return & TelegramPayload {
Message : text + "\n" + attachmentText ,
} , nil
}
2020-09-05 05:57:13 +03:00
// Repository implements PayloadConvertor Repository method
func ( t * TelegramPayload ) Repository ( p * api . RepositoryPayload ) ( api . Payloader , error ) {
2019-04-19 05:45:02 +03:00
var title string
switch p . Action {
case api . HookRepoCreated :
title = fmt . Sprintf ( ` [<a href="%s">%s</a>] Repository created ` , p . Repository . HTMLURL , p . Repository . FullName )
return & TelegramPayload {
Message : title ,
} , nil
case api . HookRepoDeleted :
title = fmt . Sprintf ( "[%s] Repository deleted" , p . Repository . FullName )
return & TelegramPayload {
Message : title ,
} , nil
}
return nil , nil
}
2020-09-05 05:57:13 +03:00
// Release implements PayloadConvertor Release method
func ( t * TelegramPayload ) Release ( p * api . ReleasePayload ) ( api . Payloader , error ) {
2020-01-05 01:20:15 +03:00
text , _ := getReleasePayloadInfo ( p , htmlLinkFormatter , true )
2019-04-19 05:45:02 +03:00
2019-12-28 11:55:09 +03:00
return & TelegramPayload {
Message : text + "\n" ,
} , nil
2019-04-19 05:45:02 +03:00
}
// GetTelegramPayload converts a telegram webhook into a TelegramPayload
2020-09-05 05:57:13 +03:00
func GetTelegramPayload ( p api . Payloader , event models . HookEventType , meta string ) ( api . Payloader , error ) {
return convertPayloader ( new ( TelegramPayload ) , p , event )
2019-04-19 05:45:02 +03:00
}