/
alerts.go
108 lines (99 loc) · 2.88 KB
/
alerts.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package main
import (
"bytes"
"fmt"
"log"
"strings"
"text/template"
"github.com/akerl/go-indefinite-article/indefinite"
"github.com/akerl/go-linodians/api"
)
var invalidTwitterHandle = strings.Repeat("x", 300)
var messageTemplates map[string][]*template.Template
var messageTemplateStrings = map[string][]string{
"added": {
"Congrats to {{.Name}} on their new job as {{.Title}} at @linode, CC @{{.Handle}}",
"Congrats to {{.Name}} on their new job as {{.Title}}, CC @{{.Handle}}",
"Congrats to {{.Name}} on their new job as {{.Title}} at @linode",
"Congrats to {{.Name}} on their new job at @linode, CC @{{.Handle}}",
"Congrats to {{.Name}} on their new job at @linode",
},
"removed": {
"Best of luck to {{.Name}} in their future endeavors! CC @{{.Handle}}",
"Best of luck to {{.Name}} in their future endeavors!",
},
"modified": {
"Congrats @linode! {{.Name}} evolved into {{.Title}}! CC @{{.Handle}}",
"Congrats @linode! {{.Name}} evolved into {{.Title}}!",
},
}
func init() {
messageTemplates = make(map[string][]*template.Template)
for key, stringSlice := range messageTemplateStrings {
templateSlice := make([]*template.Template, len(stringSlice))
for index, str := range stringSlice {
templateSlice[index] = template.Must(template.New("").Parse(str))
}
messageTemplates[key] = templateSlice
}
log.Print("Loaded templates")
}
type tweetData struct {
Name string
Title string
Handle string
}
func alertList(kind string, list api.Company) error {
log.Printf("Processing %d alerts, kind == %s", len(list), kind)
for _, e := range list {
if err := alertIndiv(kind, e); err != nil {
return err
}
}
return nil
}
func alertIndiv(kind string, e api.Employee) error {
log.Printf("Processing alert for %s", e.Username)
options := messageTemplates[kind]
message, err := buildMessage(options, e)
if err != nil {
return err
}
log.Printf("Built message: %s", message)
if kind == "removed" && c.DMRemovals {
log.Print("Sending via DM")
return sendDirectMessage(message)
}
log.Print("Sending via tweet")
_, _, err = client.Statuses.Update(message, nil)
return err
}
func buildMessage(options []*template.Template, e api.Employee) (string, error) {
aTitle := indefinite.AddArticle(e.Title)
log.Printf("Parsed indefinite article as: %s", aTitle)
twitterURL := e.Social["twitter"]
var twitterHandle string
if twitterURL == "" {
twitterHandle = invalidTwitterHandle
} else {
twitterParts := strings.Split(twitterURL, "/")
twitterHandle = twitterParts[len(twitterParts)-1]
}
log.Printf("Parsed Twitter handle as %s", twitterHandle)
td := tweetData{
Name: e.Fullname,
Title: aTitle,
Handle: twitterHandle,
}
for _, opt := range options {
var res bytes.Buffer
err := opt.Execute(&res, td)
if err != nil {
return "", err
}
if res.Len() <= 140 {
return res.String(), nil
}
}
return "", fmt.Errorf("no suitable template found")
}