From 0dd4d357ce9d138bebca84937230dfa947e2127b Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Mon, 15 Aug 2016 10:23:02 +0100 Subject: [PATCH] Bring out expand/cmd into stand-alone functions --- .../go-neb/services/github/github.go | 141 ++++++++++-------- 1 file changed, 75 insertions(+), 66 deletions(-) diff --git a/src/github.com/matrix-org/go-neb/services/github/github.go b/src/github.com/matrix-org/go-neb/services/github/github.go index f0b2bb6..4fc9dd4 100644 --- a/src/github.com/matrix-org/go-neb/services/github/github.go +++ b/src/github.com/matrix-org/go-neb/services/github/github.go @@ -45,56 +45,86 @@ func (s *githubService) RoomIDs() []string { } return keys } + +func (s *githubService) cmdGithubCreate(roomID, userID string, args []string) (interface{}, error) { + cli := s.githubClientFor(userID, false) + if cli == nil { + // TODO: send starter link + return &matrix.TextMessage{"m.notice", + userID + " : You have not linked your Github account."}, nil + } + + if len(args) < 2 { + return &matrix.TextMessage{"m.notice", + `Usage: !github create owner/repo "issue title" "description"`}, nil + } + + var ( + ownerRepo string + title *string + desc *string + ) + ownerRepo = args[0] + o := strings.Split(ownerRepo, "/") + if len(o) != 2 { + return &matrix.TextMessage{"m.notice", + `Usage: !github create owner/repo "issue title" "description"`}, nil + } + + if len(args) == 2 { + title = &args[1] + } else if len(args) == 3 { + title = &args[1] + desc = &args[2] + } else { // > 3 args is probably a title without quote marks + joinedTitle := strings.Join(args[1:], " ") + title = &joinedTitle + } + + issue, res, err := cli.Issues.Create(o[0], o[1], &github.IssueRequest{ + Title: title, + Body: desc, + }) + if err != nil { + log.WithField("err", err).Print("Failed to create issue") + return nil, fmt.Errorf("Failed to create issue. HTTP %d", res.StatusCode) + } + + return matrix.TextMessage{"m.notice", fmt.Sprintf("Created issue: %s", *issue.HTMLURL)}, nil +} + +func (s *githubService) expandIssue(roomID, userID, matchingText string) interface{} { + cli := s.githubClientFor(userID, true) + owner, repo, num, err := ownerRepoNumberFromText(matchingText) + if err != nil { + log.WithError(err).WithField("text", matchingText).Print( + "Failed to extract owner,repo,number from matched string") + return nil + } + + i, _, err := cli.Issues.Get(owner, repo, num) + if err != nil { + log.WithError(err).WithFields(log.Fields{ + "owner": owner, + "repo": repo, + "number": num, + }).Print("Failed to fetch issue") + return nil + } + + return &matrix.TextMessage{ + "m.notice", + fmt.Sprintf("%s : %s", *i.HTMLURL, *i.Title), + } +} + func (s *githubService) Plugin(roomID string) plugin.Plugin { return plugin.Plugin{ Commands: []plugin.Command{ plugin.Command{ Path: []string{"github", "create"}, Command: func(roomID, userID string, args []string) (interface{}, error) { - cli := s.githubClientFor(userID, false) - if cli == nil { - // TODO: send starter link - return &matrix.TextMessage{"m.notice", - userID + " : You have not linked your Github account."}, nil - } - - if len(args) < 2 { - return &matrix.TextMessage{"m.notice", - `Usage: !github create owner/repo "issue title" "description"`}, nil - } - - var ( - ownerRepo string - title *string - desc *string - ) - ownerRepo = args[0] - o := strings.Split(ownerRepo, "/") - if len(o) != 2 { - return &matrix.TextMessage{"m.notice", - `Usage: !github create owner/repo "issue title" "description"`}, nil - } - - if len(args) == 2 { - title = &args[1] - } else if len(args) == 3 { - title = &args[1] - desc = &args[2] - } else { // > 3 args is probably a title without quote marks - joinedTitle := strings.Join(args[1:], " ") - title = &joinedTitle - } - - issue, res, err := cli.Issues.Create(o[0], o[1], &github.IssueRequest{ - Title: title, - Body: desc, - }) - if err != nil { - log.WithField("err", err).Print("Failed to create issue") - return nil, fmt.Errorf("Failed to create issue. HTTP %d", res.StatusCode) - } - - return matrix.TextMessage{"m.notice", fmt.Sprintf("Created issue: %s", *issue.HTMLURL)}, nil + return s.cmdGithubCreate(roomID, userID, args) }, }, }, @@ -102,28 +132,7 @@ func (s *githubService) Plugin(roomID string) plugin.Plugin { plugin.Expansion{ Regexp: ownerRepoIssueRegex, Expand: func(roomID, userID, matchingText string) interface{} { - cli := s.githubClientFor(userID, true) - owner, repo, num, err := ownerRepoNumberFromText(matchingText) - if err != nil { - log.WithError(err).WithField("text", matchingText).Print( - "Failed to extract owner,repo,number from matched string") - return nil - } - - i, _, err := cli.Issues.Get(owner, repo, num) - if err != nil { - log.WithError(err).WithFields(log.Fields{ - "owner": owner, - "repo": repo, - "number": num, - }).Print("Failed to fetch issue") - return nil - } - - return &matrix.TextMessage{ - "m.notice", - fmt.Sprintf("%s : %s", *i.HTMLURL, *i.Title), - } + return s.expandIssue(roomID, userID, matchingText) }, }, },