-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcloud.go
151 lines (125 loc) · 4.07 KB
/
cloud.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package slackhappy
import (
"bytes"
"context"
"contrib.go.opencensus.io/exporter/stackdriver"
"encoding/json"
"fmt"
"github.com/CedricFinance/slackhappy/internal"
"github.com/CedricFinance/slackhappy/workatoday"
"github.com/slack-go/slack"
"go.opencensus.io/plugin/ochttp"
"go.opencensus.io/trace"
"log"
"net/http"
"os"
"time"
)
type Request struct {
Birthdays bool
Anniversaries bool
DryRun bool
}
var anniversariesWisher *internal.Wisher
var birthdaysWisher *internal.Wisher
var employeesService *workatoday.EmployeeService
var slackNotifier *internal.SlackNotifier
var exporter *stackdriver.Exporter
func MustEnv(name string) string {
value := os.Getenv(name)
if value == "" {
log.Panicf("The environment variable %q is not defined", name)
}
return value
}
func init() {
channelId := MustEnv("SLACK_CHANNEL_ID")
ownerUserId := MustEnv("OWNER_USER_ID")
slackToken := MustEnv("SLACK_TOKEN")
workatodayDomain := MustEnv("WORKATODAY_DOMAIN")
workatodayToken := MustEnv("WORKATODAY_TOKEN")
slackClient := slack.New(slackToken, slack.OptionHTTPClient(&http.Client{Transport: &ochttp.Transport{}}))
slackNotifier = &internal.SlackNotifier{
SlackClient: slackClient,
ChannelId: channelId,
OwnerId: ownerUserId,
}
anniversariesWisher = &internal.Wisher{
FilterPredicate: func(employee internal.Employee, date time.Time) bool {
return employee.IsAnniversary(date)
},
Formatter: internal.SeniorityFormatter{Prefix: ":woop: Happy BlaBl’Anniversary to"},
EmptyMessage: "No anniversaries",
Notifier: slackNotifier,
}
birthdaysWisher = &internal.Wisher{
FilterPredicate: func(employee internal.Employee, date time.Time) bool {
return employee.HireDate.Before(date) && employee.IsBirthday(date)
},
Formatter: internal.SimpleFormatter{Prefix: "Happy Birthday to", Suffix: ":birthday:!"},
EmptyMessage: "No birthdays",
Notifier: slackNotifier,
}
employeesService = workatoday.NewEmployeeService(
&workatoday.Config{BaseURL: workatodayDomain, ApiKey: workatodayToken},
&http.Client{Transport: &ochttp.Transport{}},
)
initTracing()
}
func initTracing() {
var err error
projectID := os.Getenv("GCP_PROJECT")
if projectID == "" {
return
}
exporter, err = stackdriver.NewExporter(stackdriver.Options{
ProjectID: projectID,
OnError: func(err error) {
fmt.Printf("Exporter error: %q", err)
},
})
if err != nil {
log.Panic(err)
}
trace.RegisterExporter(exporter)
trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
}
type PubSubMessage struct {
Data []byte `json:"data"`
}
func OnPubSubMessage(ctx context.Context, message PubSubMessage) error {
ctx, span := trace.StartSpan(ctx, "HappyTrigger")
defer span.End()
if exporter != nil {
defer exporter.Flush()
}
var request Request
decoder := json.NewDecoder(bytes.NewReader(message.Data))
err := decoder.Decode(&request)
if err != nil {
return err
}
currentDate := time.Now()
employees, err := employeesService.ListContext(ctx)
if err != nil {
slackNotifier.NotifyError(ctx, fmt.Sprintf("Failed to list employees for birthdays/anniversaries: %v", err))
return err
}
if request.Birthdays {
message, err := birthdaysWisher.Wish(ctx, currentDate, employees, request.DryRun)
if err != nil {
log.Print("Failed to wish birthdays")
return err
}
log.Printf("Today's birthdays message is: %q", message)
}
if request.Anniversaries {
message, err := anniversariesWisher.Wish(ctx, currentDate, employees, request.DryRun)
if err != nil {
log.Print("Failed to wish anniversaries")
return err
}
log.Printf("Today's anniversairies message is: %q", message)
}
return nil
}