mirror of
				https://github.com/taigrr/wtf
				synced 2025-01-18 04:03:14 -08:00 
			
		
		
		
	Provides the option to display the date the current onCall schedule will
end.
Config setting:
```
  pagerduty:
    showOnCallEnd: [true|false]
```
If `true`, the date will be displayed below the onCall person's name:
```
eng-droplet
1 - Chris Cummer
    Jul 27, 2020
```
Signed-off-by: Chris Cummer <chriscummer@me.com>
			
			
This commit is contained in:
		
							parent
							
								
									ae097d2e5c
								
							
						
					
					
						commit
						24ba1ee07c
					
				| @ -21,6 +21,7 @@ type Settings struct { | |||||||
| 	myName           string        `help:"The name to highlight when on-call in PagerDuty."` | 	myName           string        `help:"The name to highlight when on-call in PagerDuty."` | ||||||
| 	scheduleIDs      []interface{} `help:"An array of schedule IDs you want to restrict the OnCalls query to."` | 	scheduleIDs      []interface{} `help:"An array of schedule IDs you want to restrict the OnCalls query to."` | ||||||
| 	showIncidents    bool          `help:"Whether or not to list incidents." optional:"true"` | 	showIncidents    bool          `help:"Whether or not to list incidents." optional:"true"` | ||||||
|  | 	showOnCallEnd    bool          `help:"Whether or not to display the date the oncall schedule ends." optional:"true"` | ||||||
| 	showSchedules    bool          `help:"Whether or not to show schedules." optional:"true"` | 	showSchedules    bool          `help:"Whether or not to show schedules." optional:"true"` | ||||||
| 	teamIDs          []interface{} `help:"An array of team IDs to restrict the incidents query to" optional:"true"` | 	teamIDs          []interface{} `help:"An array of team IDs to restrict the incidents query to" optional:"true"` | ||||||
| 	userIDs          []interface{} `help:"An array of user IDs to restrict the incidents query to" optional:"true"` | 	userIDs          []interface{} `help:"An array of user IDs to restrict the incidents query to" optional:"true"` | ||||||
| @ -36,6 +37,7 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co | |||||||
| 		myName:           ymlConfig.UString("myName"), | 		myName:           ymlConfig.UString("myName"), | ||||||
| 		scheduleIDs:      ymlConfig.UList("scheduleIDs", []interface{}{}), | 		scheduleIDs:      ymlConfig.UList("scheduleIDs", []interface{}{}), | ||||||
| 		showIncidents:    ymlConfig.UBool("showIncidents", true), | 		showIncidents:    ymlConfig.UBool("showIncidents", true), | ||||||
|  | 		showOnCallEnd:    ymlConfig.UBool("showOnCallEnd", false), | ||||||
| 		showSchedules:    ymlConfig.UBool("showSchedules", true), | 		showSchedules:    ymlConfig.UBool("showSchedules", true), | ||||||
| 		teamIDs:          ymlConfig.UList("teamIDs", []interface{}{}), | 		teamIDs:          ymlConfig.UList("teamIDs", []interface{}{}), | ||||||
| 		userIDs:          ymlConfig.UList("userIDs", []interface{}{}), | 		userIDs:          ymlConfig.UList("userIDs", []interface{}{}), | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ package pagerduty | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"sort" | 	"sort" | ||||||
|  | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/PagerDuty/go-pagerduty" | 	"github.com/PagerDuty/go-pagerduty" | ||||||
| 	"github.com/rivo/tview" | 	"github.com/rivo/tview" | ||||||
| @ -10,12 +11,18 @@ import ( | |||||||
| 	"github.com/wtfutil/wtf/view" | 	"github.com/wtfutil/wtf/view" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | const ( | ||||||
|  | 	onCallTimeAPILayout     = "2006-01-02T15:04:05Z" | ||||||
|  | 	onCallTimeDisplayLayout = "Jan 2, 2006" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| type Widget struct { | type Widget struct { | ||||||
| 	view.TextWidget | 	view.TextWidget | ||||||
| 
 | 
 | ||||||
| 	settings *Settings | 	settings *Settings | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // NewWidget creates and returns an instance of PagerDuty widget | ||||||
| func NewWidget(app *tview.Application, settings *Settings) *Widget { | func NewWidget(app *tview.Application, settings *Settings) *Widget { | ||||||
| 	widget := Widget{ | 	widget := Widget{ | ||||||
| 		TextWidget: view.NewTextWidget(app, settings.common), | 		TextWidget: view.NewTextWidget(app, settings.common), | ||||||
| @ -69,11 +76,13 @@ func (widget *Widget) Refresh() { | |||||||
| func (widget *Widget) contentFrom(onCalls []pagerduty.OnCall, incidents []pagerduty.Incident) string { | func (widget *Widget) contentFrom(onCalls []pagerduty.OnCall, incidents []pagerduty.Incident) string { | ||||||
| 	var str string | 	var str string | ||||||
| 
 | 
 | ||||||
|  | 	// Incidents | ||||||
|  | 
 | ||||||
| 	if widget.settings.showIncidents { | 	if widget.settings.showIncidents { | ||||||
| 		str += "[yellow] Incidents[white]" | 		str += "[yellow] Incidents[white]" | ||||||
| 		if len(incidents) > 0 { | 		if len(incidents) > 0 { | ||||||
| 			for _, incident := range incidents { | 			for _, incident := range incidents { | ||||||
| 				str += fmt.Sprintf("\n [%s]%s[white]\n", widget.settings.common.Colors.Subheading, incident.Summary) | 				str += fmt.Sprintf("\n[%s]%s[white]\n", widget.settings.common.Colors.Subheading, incident.Summary) | ||||||
| 				str += fmt.Sprintf(" Status: %s\n", incident.Status) | 				str += fmt.Sprintf(" Status: %s\n", incident.Status) | ||||||
| 				str += fmt.Sprintf(" Service: %s\n", incident.Service.Summary) | 				str += fmt.Sprintf(" Service: %s\n", incident.Service.Summary) | ||||||
| 				str += fmt.Sprintf(" Escalation: %s\n", incident.EscalationPolicy.Summary) | 				str += fmt.Sprintf(" Escalation: %s\n", incident.EscalationPolicy.Summary) | ||||||
| @ -83,23 +92,25 @@ func (widget *Widget) contentFrom(onCalls []pagerduty.OnCall, incidents []pagerd | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	tree := make(map[string][]pagerduty.OnCall) | 	onCallTree := make(map[string][]pagerduty.OnCall) | ||||||
| 
 | 
 | ||||||
| 	filter := make(map[string]bool) | 	filter := make(map[string]bool) | ||||||
| 	for _, item := range widget.settings.escalationFilter { | 	for _, item := range widget.settings.escalationFilter { | ||||||
| 		filter[item.(string)] = true | 		filter[item.(string)] = true | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// OnCalls | ||||||
|  | 
 | ||||||
| 	for _, onCall := range onCalls { | 	for _, onCall := range onCalls { | ||||||
| 		key := onCall.EscalationPolicy.Summary | 		summary := onCall.EscalationPolicy.Summary | ||||||
| 		if len(widget.settings.escalationFilter) == 0 || filter[key] { | 		if len(widget.settings.escalationFilter) == 0 || filter[summary] { | ||||||
| 			tree[key] = append(tree[key], onCall) | 			onCallTree[summary] = append(onCallTree[summary], onCall) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// We want to sort our escalation policies for predictability/ease of finding | 	// We want to sort our escalation policies for predictability/ease of finding | ||||||
| 	keys := make([]string, 0, len(tree)) | 	keys := make([]string, 0, len(onCallTree)) | ||||||
| 	for k := range tree { | 	for k := range onCallTree { | ||||||
| 		keys = append(keys, k) | 		keys = append(keys, k) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -116,16 +127,24 @@ func (widget *Widget) contentFrom(onCalls []pagerduty.OnCall, incidents []pagerd | |||||||
| 				key, | 				key, | ||||||
| 			) | 			) | ||||||
| 
 | 
 | ||||||
| 			values := tree[key] | 			values := onCallTree[key] | ||||||
| 			sort.Sort(ByEscalationLevel(values)) | 			sort.Sort(ByEscalationLevel(values)) | ||||||
| 
 | 
 | ||||||
| 			for _, item := range values { | 			for _, onCall := range values { | ||||||
| 				str += fmt.Sprintf( | 				str += fmt.Sprintf( | ||||||
| 					" [%s]%d - %s\n", | 					" [%s]%d - %s\n", | ||||||
| 					widget.settings.common.Colors.Text, | 					widget.settings.common.Colors.Text, | ||||||
| 					item.EscalationLevel, | 					onCall.EscalationLevel, | ||||||
| 					widget.userSummary(item), | 					widget.userSummary(onCall), | ||||||
| 				) | 				) | ||||||
|  | 
 | ||||||
|  | 				onCallEnd := widget.onCallEndSummary(onCall) | ||||||
|  | 				if onCallEnd != "" { | ||||||
|  | 					str += fmt.Sprintf( | ||||||
|  | 						"     %s\n", | ||||||
|  | 						onCallEnd, | ||||||
|  | 					) | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @ -133,8 +152,23 @@ func (widget *Widget) contentFrom(onCalls []pagerduty.OnCall, incidents []pagerd | |||||||
| 	return str | 	return str | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (widget *Widget) userSummary(item pagerduty.OnCall) string { | // onCallEndSummary may or may not return the date that the specified onCall schedule ends | ||||||
| 	summary := item.User.Summary | func (widget *Widget) onCallEndSummary(onCall pagerduty.OnCall) string { | ||||||
|  | 	if !widget.settings.showOnCallEnd || onCall.End == "" { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	end, err := time.Parse(onCallTimeAPILayout, onCall.End) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return end.Format(onCallTimeDisplayLayout) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // userSummary returns the name of the person assigned to the specified onCall scehdule | ||||||
|  | func (widget *Widget) userSummary(onCall pagerduty.OnCall) string { | ||||||
|  | 	summary := onCall.User.Summary | ||||||
| 
 | 
 | ||||||
| 	if summary == widget.settings.myName { | 	if summary == widget.settings.myName { | ||||||
| 		summary = fmt.Sprintf("[::b]%s", summary) | 		summary = fmt.Sprintf("[::b]%s", summary) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user