-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslack_payload.go
94 lines (78 loc) · 1.96 KB
/
slack_payload.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package main
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"net/url"
"strconv"
"github.com/dcondomitti/go-pivotaltracker/v5/pivotal"
)
type SlackPayload struct {
Attachments []slackMessage `json:"attachments"`
Channel string `json:"channel"`
Username string `json:"username"`
IconEmoji string `json:"icon_emoji"`
}
type slackMessage struct {
Fallback string `json:"fallback"`
Title string `json:"title"`
TitleLink string `json:"title_link"`
Fields []slackMessageField `json:"fields"`
}
type slackMessageField struct {
Title string `json:"title"`
Value string `json:"value"`
Short bool `json:"short"`
}
func NewSlackPayload(c *Config, s *pivotal.Story) SlackPayload {
return SlackPayload{
Attachments: extractAttachments(s),
Username: c.Username,
IconEmoji: c.IconEmoji,
}
}
func extractAttachments(s *pivotal.Story) []slackMessage {
return []slackMessage{
slackMessage{
Fallback: s.Name,
Title: s.Name,
TitleLink: s.URL,
Fields: extractFields(s),
},
}
}
func extractFields(s *pivotal.Story) []slackMessageField {
return []slackMessageField{
slackMessageField{Title: "State", Value: s.State, Short: true},
slackMessageField{Title: "Estimate", Value: extractEstimate(s), Short: true},
}
}
func (sp *SlackPayload) SendMessage(u string, r string) error {
sp.Channel = r
encoded, err := sp.Encode()
if err != nil {
return err
}
resp, err := http.PostForm(u, url.Values{"payload": {encoded}})
if err != nil {
return err
} else if resp.StatusCode != http.StatusOK {
return errors.New("Not OK")
}
return nil
}
func (sp SlackPayload) Encode() (string, error) {
b, err := json.Marshal(sp)
if err != nil {
return "", err
}
return string(b), nil
}
func extractEstimate(s *pivotal.Story) string {
e := s.Estimate
if e != nil {
return fmt.Sprintf("%s points", strconv.FormatFloat(*s.Estimate, 'g', 1, 64))
}
return "n/a"
}