diff --git a/service_github.go b/service_github.go index a46daab..d87db99 100644 --- a/service_github.go +++ b/service_github.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "net/http" + "regexp" "strings" "time" @@ -24,6 +25,11 @@ func (g githubServiceHandler) GetDocumentation() serviceHandlerDocumentationList DemoPath: "/github/license/Luzifer/badge-gen", Arguments: []string{"license", "", ""}, }, + { + ServiceName: "GitHub latest tag", + DemoPath: "/github/latest-tag/Luzifer/badge-gen", + Arguments: []string{"latest-tag", "", ""}, + }, } } @@ -36,6 +42,8 @@ func (g githubServiceHandler) Handle(ctx context.Context, params []string) (titl switch params[0] { case "license": title, text, color, err = g.handleLicense(ctx, params[1:]) + case "latest-tag": + title, text, color, err = g.handleLatestTag(ctx, params[1:]) default: err = errors.New("An unknown service command was called") } @@ -43,32 +51,54 @@ func (g githubServiceHandler) Handle(ctx context.Context, params []string) (titl return } +func (g githubServiceHandler) handleLatestTag(ctx context.Context, params []string) (title, text, color string, err error) { + path := strings.Join([]string{"repos", params[0], params[1], "tags"}, "/") + + text, err = cacheStore.Get("github_latest_tag", path) + + if err != nil { + r := []struct { + Name string `json:"name"` + }{} + + if err = g.fetchAPI(ctx, path, nil, &r); err != nil { + return + } + + if len(r) > 0 { + text = r[0].Name + } else { + text = "None" + } + cacheStore.Set("github_latest_tag", path, text, 10*time.Minute) + } + + title = "tag" + color = "blue" + + if regexp.MustCompile(`^v?0\.`).MatchString(text) { + color = "orange" + } + + return +} + func (g githubServiceHandler) handleLicense(ctx context.Context, params []string) (title, text, color string, err error) { path := strings.Join([]string{"repos", params[0], params[1], "license"}, "/") text, err = cacheStore.Get("github_license", path) if err != nil { - req, _ := http.NewRequest("GET", "https://api.github.com/"+path, nil) - req.Header.Set("Accept", "application/vnd.github.drax-preview+json") - - if configStore.Str("github.personal_token") != "" { - req.SetBasicAuth(configStore.Str("github.username"), configStore.Str("github.personal_token")) - } - - var resp *http.Response - resp, err = ctxhttp.Do(ctx, http.DefaultClient, req) - if err != nil { - return - } - defer resp.Body.Close() - r := struct { License struct { Name string `json:"name"` } `json:"license"` }{} - if err = json.NewDecoder(resp.Body).Decode(&r); err != nil { + + headers := map[string]string{ + "Accept": "application/vnd.github.drax-preview+json", + } + if err = g.fetchAPI(ctx, path, headers, &r); err != nil { return } @@ -85,3 +115,25 @@ func (g githubServiceHandler) handleLicense(ctx context.Context, params []string return } + +func (g githubServiceHandler) fetchAPI(ctx context.Context, path string, headers map[string]string, out interface{}) error { + req, _ := http.NewRequest("GET", "https://api.github.com/"+path, nil) + + if headers != nil { + for k, v := range headers { + req.Header.Set(k, v) + } + } + + if configStore.Str("github.personal_token") != "" { + req.SetBasicAuth(configStore.Str("github.username"), configStore.Str("github.personal_token")) + } + + resp, err := ctxhttp.Do(ctx, http.DefaultClient, req) + if err != nil { + return err + } + defer resp.Body.Close() + + return json.NewDecoder(resp.Body).Decode(out) +}