code.gitea.io/gitea@v1.21.7/services/webhook/wechatwork.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package webhook 5 6 import ( 7 "fmt" 8 "strings" 9 10 "code.gitea.io/gitea/modules/git" 11 "code.gitea.io/gitea/modules/json" 12 api "code.gitea.io/gitea/modules/structs" 13 webhook_module "code.gitea.io/gitea/modules/webhook" 14 ) 15 16 type ( 17 // WechatworkPayload represents 18 WechatworkPayload struct { 19 Msgtype string `json:"msgtype"` 20 Text struct { 21 Content string `json:"content"` 22 MentionedList []string `json:"mentioned_list"` 23 MentionedMobileList []string `json:"mentioned_mobile_list"` 24 } `json:"text"` 25 Markdown struct { 26 Content string `json:"content"` 27 } `json:"markdown"` 28 } 29 ) 30 31 // SetSecret sets the Wechatwork secret 32 func (f *WechatworkPayload) SetSecret(_ string) {} 33 34 // JSONPayload Marshals the WechatworkPayload to json 35 func (f *WechatworkPayload) JSONPayload() ([]byte, error) { 36 data, err := json.MarshalIndent(f, "", " ") 37 if err != nil { 38 return []byte{}, err 39 } 40 return data, nil 41 } 42 43 func newWechatworkMarkdownPayload(title string) *WechatworkPayload { 44 return &WechatworkPayload{ 45 Msgtype: "markdown", 46 Markdown: struct { 47 Content string `json:"content"` 48 }{ 49 Content: title, 50 }, 51 } 52 } 53 54 var _ PayloadConvertor = &WechatworkPayload{} 55 56 // Create implements PayloadConvertor Create method 57 func (f *WechatworkPayload) Create(p *api.CreatePayload) (api.Payloader, error) { 58 // created tag/branch 59 refName := git.RefName(p.Ref).ShortName() 60 title := fmt.Sprintf("[%s] %s %s created", p.Repo.FullName, p.RefType, refName) 61 62 return newWechatworkMarkdownPayload(title), nil 63 } 64 65 // Delete implements PayloadConvertor Delete method 66 func (f *WechatworkPayload) Delete(p *api.DeletePayload) (api.Payloader, error) { 67 // created tag/branch 68 refName := git.RefName(p.Ref).ShortName() 69 title := fmt.Sprintf("[%s] %s %s deleted", p.Repo.FullName, p.RefType, refName) 70 71 return newWechatworkMarkdownPayload(title), nil 72 } 73 74 // Fork implements PayloadConvertor Fork method 75 func (f *WechatworkPayload) Fork(p *api.ForkPayload) (api.Payloader, error) { 76 title := fmt.Sprintf("%s is forked to %s", p.Forkee.FullName, p.Repo.FullName) 77 78 return newWechatworkMarkdownPayload(title), nil 79 } 80 81 // Push implements PayloadConvertor Push method 82 func (f *WechatworkPayload) Push(p *api.PushPayload) (api.Payloader, error) { 83 var ( 84 branchName = git.RefName(p.Ref).ShortName() 85 commitDesc string 86 ) 87 88 title := fmt.Sprintf("# %s:%s <font color=\"warning\"> %s </font>", p.Repo.FullName, branchName, commitDesc) 89 90 var text string 91 // for each commit, generate attachment text 92 for i, commit := range p.Commits { 93 var authorName string 94 if commit.Author != nil { 95 authorName = "Author: " + commit.Author.Name 96 } 97 98 message := strings.ReplaceAll(commit.Message, "\n\n", "\r\n") 99 text += fmt.Sprintf(" > [%s](%s) \r\n ><font color=\"info\">%s</font> \n ><font color=\"warning\">%s</font>", commit.ID[:7], commit.URL, 100 message, authorName) 101 102 // add linebreak to each commit but the last 103 if i < len(p.Commits)-1 { 104 text += "\n" 105 } 106 } 107 return newWechatworkMarkdownPayload(title + "\r\n\r\n" + text), nil 108 } 109 110 // Issue implements PayloadConvertor Issue method 111 func (f *WechatworkPayload) Issue(p *api.IssuePayload) (api.Payloader, error) { 112 text, issueTitle, attachmentText, _ := getIssuesPayloadInfo(p, noneLinkFormatter, true) 113 var content string 114 content += fmt.Sprintf(" ><font color=\"info\">%s</font>\n >%s \n ><font color=\"warning\"> %s</font> \n [%s](%s)", text, attachmentText, issueTitle, p.Issue.HTMLURL, p.Issue.HTMLURL) 115 116 return newWechatworkMarkdownPayload(content), nil 117 } 118 119 // IssueComment implements PayloadConvertor IssueComment method 120 func (f *WechatworkPayload) IssueComment(p *api.IssueCommentPayload) (api.Payloader, error) { 121 text, issueTitle, _ := getIssueCommentPayloadInfo(p, noneLinkFormatter, true) 122 var content string 123 content += fmt.Sprintf(" ><font color=\"info\">%s</font>\n >%s \n ><font color=\"warning\">%s</font> \n [%s](%s)", text, p.Comment.Body, issueTitle, p.Comment.HTMLURL, p.Comment.HTMLURL) 124 125 return newWechatworkMarkdownPayload(content), nil 126 } 127 128 // PullRequest implements PayloadConvertor PullRequest method 129 func (f *WechatworkPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, error) { 130 text, issueTitle, attachmentText, _ := getPullRequestPayloadInfo(p, noneLinkFormatter, true) 131 pr := fmt.Sprintf("> <font color=\"info\"> %s </font> \r\n > <font color=\"comment\">%s </font> \r\n > <font color=\"comment\">%s </font> \r\n", 132 text, issueTitle, attachmentText) 133 134 return newWechatworkMarkdownPayload(pr), nil 135 } 136 137 // Review implements PayloadConvertor Review method 138 func (f *WechatworkPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { 139 var text, title string 140 switch p.Action { 141 case api.HookIssueReviewed: 142 action, err := parseHookPullRequestEventType(event) 143 if err != nil { 144 return nil, err 145 } 146 title = fmt.Sprintf("[%s] Pull request review %s : #%d %s", p.Repository.FullName, action, p.Index, p.PullRequest.Title) 147 text = p.Review.Content 148 } 149 150 return newWechatworkMarkdownPayload("# " + title + "\r\n\r\n >" + text), nil 151 } 152 153 // Repository implements PayloadConvertor Repository method 154 func (f *WechatworkPayload) Repository(p *api.RepositoryPayload) (api.Payloader, error) { 155 var title string 156 switch p.Action { 157 case api.HookRepoCreated: 158 title = fmt.Sprintf("[%s] Repository created", p.Repository.FullName) 159 return newWechatworkMarkdownPayload(title), nil 160 case api.HookRepoDeleted: 161 title = fmt.Sprintf("[%s] Repository deleted", p.Repository.FullName) 162 return newWechatworkMarkdownPayload(title), nil 163 } 164 165 return nil, nil 166 } 167 168 // Wiki implements PayloadConvertor Wiki method 169 func (f *WechatworkPayload) Wiki(p *api.WikiPayload) (api.Payloader, error) { 170 text, _, _ := getWikiPayloadInfo(p, noneLinkFormatter, true) 171 172 return newWechatworkMarkdownPayload(text), nil 173 } 174 175 // Release implements PayloadConvertor Release method 176 func (f *WechatworkPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { 177 text, _ := getReleasePayloadInfo(p, noneLinkFormatter, true) 178 179 return newWechatworkMarkdownPayload(text), nil 180 } 181 182 func (f *WechatworkPayload) Package(p *api.PackagePayload) (api.Payloader, error) { 183 text, _ := getPackagePayloadInfo(p, noneLinkFormatter, true) 184 185 return newWechatworkMarkdownPayload(text), nil 186 } 187 188 // GetWechatworkPayload GetWechatworkPayload converts a ding talk webhook into a WechatworkPayload 189 func GetWechatworkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { 190 return convertPayloader(new(WechatworkPayload), p, event) 191 }