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  }