1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00

Initial pagerduty widget

List people on call, along with the escalation policy
Addresses #159
This commit is contained in:
Sean Smith
2019-02-07 00:52:51 -05:00
parent 884864c970
commit 97790d6168
29 changed files with 2174 additions and 0 deletions

45
pagerduty/client.go Normal file
View File

@@ -0,0 +1,45 @@
package pagerduty
import (
"os"
"time"
"github.com/PagerDuty/go-pagerduty"
"github.com/wtfutil/wtf/wtf"
)
// GetOnCalls returns a list of people currently on call
func GetOnCalls() ([]pagerduty.OnCall, error) {
client := pagerduty.NewClient(apiKey())
var results []pagerduty.OnCall
var queryOpts pagerduty.ListOnCallOptions
queryOpts.Since = time.Now().Format("2006-01-02T15:04:05Z07:00")
queryOpts.Until = time.Now().Format("2006-01-02T15:04:05Z07:00")
oncalls, err := client.ListOnCalls(queryOpts)
if err != nil {
return nil, err
}
results = append(results, oncalls.OnCalls...)
for oncalls.APIListObject.More == true {
queryOpts.APIListObject.Offset = oncalls.APIListObject.Offset
oncalls, err = client.ListOnCalls(queryOpts)
if err != nil {
return nil, err
}
results = append(results, oncalls.OnCalls...)
}
return results, nil
}
func apiKey() string {
return wtf.Config.UString(
"wtf.mods.pagerduty.apiKey",
os.Getenv("WTF_PAGERDUTY_API_KEY"),
)
}

12
pagerduty/sort.go Normal file
View File

@@ -0,0 +1,12 @@
package pagerduty
import "github.com/PagerDuty/go-pagerduty"
type ByEscalationLevel []pagerduty.OnCall
func (s ByEscalationLevel) Len() int { return len(s) }
func (s ByEscalationLevel) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s ByEscalationLevel) Less(i, j int) bool {
return s[i].EscalationLevel < s[j].EscalationLevel
}

83
pagerduty/widget.go Normal file
View File

@@ -0,0 +1,83 @@
package pagerduty
import (
"fmt"
"sort"
"github.com/PagerDuty/go-pagerduty"
"github.com/rivo/tview"
"github.com/wtfutil/wtf/wtf"
)
type Widget struct {
wtf.TextWidget
}
func NewWidget(app *tview.Application) *Widget {
widget := Widget{
TextWidget: wtf.NewTextWidget(app, "PagerDuty", "pagerduty", false),
}
return &widget
}
/* -------------------- Exported Functions -------------------- */
func (widget *Widget) Refresh() {
onCalls, err := GetOnCalls()
widget.View.SetTitle(widget.ContextualTitle(fmt.Sprintf("%s", widget.Name)))
widget.View.Clear()
var content string
if err != nil {
widget.View.SetWrap(true)
content = err.Error()
} else {
widget.View.SetWrap(false)
content = widget.contentFrom(onCalls)
}
widget.View.SetText(content)
}
/* -------------------- Unexported Functions -------------------- */
func (widget *Widget) contentFrom(onCalls []pagerduty.OnCall) string {
var str string
tree := make(map[string][]pagerduty.OnCall)
filtering := wtf.Config.UList("wtf.mods.pagerduty.escalationFilter")
filter := make(map[string]bool)
for _, item := range filtering {
filter[item.(string)] = true
}
for _, onCall := range onCalls {
key := onCall.EscalationPolicy.Summary
if len(filtering) == 0 || filter[key] {
tree[key] = append(tree[key], onCall)
}
}
// We want to sort our escalation policies for predictability/ease of finding
keys := make([]string, 0, len(tree))
for k := range tree {
keys = append(keys, k)
}
sort.Strings(keys)
// Print out policies, and escalation order of users
for _, key := range keys {
str = str + fmt.Sprintf("[red]%s\n", key)
values := tree[key]
sort.Sort(ByEscalationLevel(values))
for _, item := range values {
str = str + fmt.Sprintf("[white]%d - %s\n", item.EscalationLevel, item.User.Summary)
}
}
return str
}