-
Notifications
You must be signed in to change notification settings - Fork 0
/
nerve-centre.go
164 lines (131 loc) · 4.17 KB
/
nerve-centre.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
152
153
154
155
156
157
158
159
160
161
162
163
164
package main
import (
"encoding/json"
"errors"
"flag"
"strconv"
"strings"
"syscall"
"time"
)
func main() {
username := flag.String("username", "", "Nerve Centre username")
password := flag.String("password", "", "Nerve Centre password")
namespace := flag.String("namespace", "", "Nerve Centre namespace")
webhookUrl := flag.String("webhook", "", "Slack webhook url")
channel := flag.String("channel", "", "Slack channel override")
flag.Parse()
if *username == "" || *password == "" || *namespace == "" || *webhookUrl == "" {
flag.Usage()
syscall.Exit(1)
}
// Apply namespace
nerveCentreBaseUrl = nerveCentreBaseUrl + *namespace
usernameWithNamespace := *username + "@" + *namespace
err := Login(usernameWithNamespace, *password)
if err != nil {
sendFailureToSlack(webhookUrl, Schedule{}, channel, err)
}
users := GetMembers()
schedules := *GetSchedules()
if len(*users) == 0 || len(schedules) == 0 {
sendFailureToSlack(webhookUrl, Schedule{}, channel, errors.New("could not load users or schedules, check username and password"))
}
schedule := schedules[0]
runTime := time.Now()
planningTime := time.Now()
planningEnd := time.Now()
planning, err := GetPlanning(schedule, runTime)
if err != nil {
sendFailureToSlack(webhookUrl, schedule, channel, err)
}
today := planning.GetActiveSlot(runTime)
var next *Slot
var currentPlanningEnd time.Time
var currentMembers []string
if planning.HasMembers() {
slot := planning.GetActiveSlot(runTime)
currentPlanningEnd = slot.End
currentMembers = slot.GetMembers(users)
}
foundOther := false
for planning.HasMembers() {
for _, slot := range planning.BaseTimeSlots {
// Filter current active slot and older slots
if runTime.After(slot.Start) || runTime.Equal(slot.Start) {
continue
}
planningEnd = slot.End
if !foundOther {
members := slot.GetMembers(users)
if !Equal(currentMembers, members) {
foundOther = true
next = &slot
} else {
currentPlanningEnd = slot.End
}
}
}
planningTime = planningTime.Add(24 * time.Hour)
planning, err = GetPlanning(schedule, planningTime)
if err != nil {
sendFailureToSlack(webhookUrl, schedule, channel, err)
}
}
todayMembersString := "<<geen>>"
todayColor := "#ec0045"
if len(currentMembers) > 0 {
todayMembersString = strings.Join(currentMembers, ", ") + " tot " + currentPlanningEnd.Format("02-01-2006 15:04")
todayColor = "#007a5a"
}
attachments := make([]Attachment, 0, 3)
attachments = append(attachments, Attachment{
Fallback: "Vandaag: " + todayMembersString,
Color: todayColor,
Title: "Vandaag",
Text: todayMembersString,
})
if foundOther && next != nil {
nextMembers := next.GetMembers(users)
nextMembersString := "<<geen>>"
nextColor := "#ec0045"
if len(currentMembers) > 0 {
nextMembersString = strings.Join(nextMembers, ", ") + " op " + next.Start.Format("02-01-2006 om 15:04")
nextColor = "#ffc917"
}
attachments = append(attachments, Attachment{
Fallback: "Volgende: " + nextMembersString,
Color: nextColor,
Title: "Volgende",
Text: nextMembersString,
Ts: json.Number(strconv.FormatInt(next.Start.Unix(), 10)),
})
}
if len(today.GetMembers(users)) > 0 {
attachments = append(attachments, Attachment{
Fallback: "Er is een rooster tot " + planningEnd.Format("02-01-2006 15:04"),
Color: "#ec0045",
Title: "Einde rooster",
Text: "Er is een rooster tot " + planningEnd.Format("02-01-2006 15:04"),
Ts: json.Number(strconv.FormatInt(planningEnd.Unix(), 10)),
})
}
message := SlackPayload{
Username: "📞 Wachtdienst " + schedule.GroupName,
Channel: *channel,
Text: "Een overzicht van de de huidige wachtdiensten die zijn ingeregeld voor " + schedule.GroupName + " in Nerve Centre",
Attachments: attachments,
}
err = SendSlack(*webhookUrl, &message)
if err != nil {
panic(err)
}
}
func sendFailureToSlack(webhookUrl *string, schedule Schedule, channel *string, err error) {
SendSlack(*webhookUrl, &SlackPayload{
Username: "⚠️ Wachtdienst " + schedule.GroupName,
Channel: *channel,
Text: "Kon wachtdiensten niet ophalen uit Nerve Centre: " + err.Error(),
})
panic(err)
}